Invertire una stringa

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

Lettura da tastiera

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

Ciclo di inversione dei caratteri

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

Stampa

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