Nel menu file aprire il sottomenu del Nuovo Progetto e scegliere COM Template.
Un programma COM viene caricato in memoria a partire dall'indirizzo CS:0100h, dove Il valore di CS è determinato dal Sistema Operativo.
#make_COM# ORG 100h
Poichè si è deciso di dichiarare le variabili all'inizio del programma, la prima istruzione è un salto alla prima istruzione da eseguire:
jmp inizio: ;dichiarazioni dei dati LunghMAX EQU 100 StrDaInv DB LunghMAX DUP(' ') StrInv DB LunghMAX DUP(' ')
In un file COM i tre segmenti (dati, Extra dati e codice) coincidono.
inizio: MOV AX, CS MOV DS, AX MOV ES, AX
L'acquisizione della stringa di input da tastiera avviene richiamando la funzione 0Ah dell'INT 21h e specificando nel registro DX l'offset in cui memorizzare i caratteri letti.
mov DX, offset StrDaInv mov AH, 0Ah int 21h
Nel secondo byte della stringa (offset 1) è contenuto il numero di byte letti
mov DI, offset StrDaInv mov AL, [DI+1]
Se il valore è 0 allora non è stata data alcuna stringa e si esce dal programma
and al, al jz fine
Altrimenti, dopo aver azzerato la parte alta del registro CH, si copia tale valore nel registro CX, che verrà usato come contatore
xor ah, ah mov cx, ax
Poichè il registro CX verrÀ decrementato perchè è la variabile di controllo del ciclo, il suo valore viene salvato sullo stack:
push cx
Il registro DI contiene il puntatore alla stringa da invertire, siccome i primi due byte non devono essere scambiati si sposta il puntatore di due byte in avanti nella stringa da invertire
ADD DI, 2
Si acquisisce nel registro SI l'offset della stringa invertita e, nel secondo byte di questa, si scrive il numero di byte della stringa da invertire:
mov SI, offset StrInv mov [SI+1], AL
Il procedimento di inversione della stringa consiste nello scrivere il primo carattere della stringa da invertire nell'ultima posizione della stringa invertita, poi il secondo carattere si scrive nella penultima posizione ecc..
Si punta alla fine della stringa invertita e si inserisce il carattere ($) di fine stringa.
ADD SI, CX mov BYTE PTR [SI],'$'
A questo punto il registro SI deve puntatore all'ultimo carattere della stringa invertita
dec si
In ciclo vengono scambiati i caratteri puntati da SI con i caratteri puntati da DI. Il puntatore alla stringa da invertire cresce mentre il puntatore alla stringa invertita decresce
CicloDiInv: mov al, [DI] mov [si], al inc DI dec si loop CicloDIInv
Si stampa la stringa invertita richiamamndo la funzione 09 dell'INT 12h e specificando in DX l'offset della stringa da stampare.
mov ah, 09 mov dx, offset StrInv int 21h
A questo punto si arriva quando termina la stampa oppure se non è stata inserita nessuna stringa, ovvero al momento della richiesta di leggere da tastiera si è premuto solo il tasto di invio. La funzione 4Ch dell'INT 21h restituisce il controllo della macchina al sistema operativo:
Fine: MOV AH, 4Ch INT 21h End