;— confronto di due stringhe byte x byte fino a quando non si incontrano caratteri diversi
; o la prima stringa finisce (carattere 0)
; nell’esempio il programma termina quando nella prima stringa si trova ‘1’ e nella seconda trova ‘2’:
; viene stampato il messaggio “Carattere diverso”
; Se le stringhe fossero uguali (basta cambiare nella seconda stringa ‘2’ con ‘1’) il programma avrebbe
; termine quando nella prima stringa si incontra il carattere ‘0’:verrebbe stampato il messaggio “Fine stringa”
data segment
string1 db “StringaTest1”,0 ; db: define byte; la variabile string1 e’
; definita come una sequenza di byte contenenti ciascuno di essi
0; rispettivamente ‘S’ ‘t’ ‘r’ ‘i’ ‘n’ ‘g’ ‘a’ ‘T’ ‘e’ ‘s’ ‘t’ ‘1’ ‘0’ ; ‘0’
string2 db “StringaTest2”,0
msg1 db “Fine stringa $” ;’$’ e’ necessario, quando la stringa viene stampata,
; per indicare la fine della stringa
msg2 db “Carattere diverso $”
pkey db 0dh,0ah,”press any key…$” ;0dh,0ah servo per andare a capo prima di stampare la stringa
ends
stack segment
dw 128 dup(0) ;dw: define word; area di 128 word inizializzata a 0
ends
code segment
start:
; set segment registers:
mov ax, data ;in AX indirizzo del segmento contenente i dati
;(data e’ il nome del segmento)
mov ds, ax ;il valore contenuto in AX viene copiato in DS ed ES
mov es, ax ;DS registro che contiene l’indirizzo del data segment
;ES registro che contiene l’indirizzo dell’extra segment
;in questo caso l’extra segment coincide col il data segment
lea si, string1 ; in SI indirizzo di string1
lea di, string2 ; in DI indirizzo di string2
dec di ; decremento di 1 del valore contenuto in DI
; (necessario per avere l’incremento di DI all’interno del ciclo
lab1:
inc di ; incremento di 1 del valore contenuto in DI
lodsb ; trasferimento in AL del dato puntato da SI (indirizzo del I byte di string1)
; e incremento di SI
;
cmp [di], al ; confronto del valore contenuto all’indirizzo DI con il valore contenuto in AL
jne NotEqual ; salto (condizionato) a label NotEqual se il primo operando e’ diverso dal secondo operando
;
;
cmp al, 0 ; confronto del valore contenuto in AL con 0
jne lab1 ; salto (condizionato) a label lab1 se il primo operando e’ diverso dal secondo operando
;
; int 21h (interruzione 21h): chiamata di funzione DOS
; un numero elevato di servizi e’ disponibile
; con questa interruzione; ogni servizio e’identificato dal
; valore posto in AH
lea dx, msg1 ;
mov ah, 9 ; AH=9: stampa della stringa il cui indirizzo di offset (indirizzo
int 21h ; all’interno del data segment) si trova in DX (nel nostro caso
; stampa la string MSG1); la stringa deve essere chiusa dal carattere $
;
jmp lab2 ; salto (incondizionato) a label lab2
;
NotEqual: ;
lea dx, msg2 ;
mov ah, 9 ;
int 21h ; Come sopra: in questo caso stampa la string msg2
;
lab2: ;
;——– operazioni di chiusura
lea dx, pkey ;
mov ah, 9 ;
int 21h ; Come sopra: in questo caso stampa la string pkey
mov ah, 1 ; AH = 1: attende l’immissione di carattere da tastiera (equivalente scanf o getc del C)
int 21h
mov ax, 4c00h ; AH = 4C: fine del programma e ritorno al sistema operativo
int 21h
ends
end start ; set entry point and stop the assembler.