Confronto di 2 stringhe

;— 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.

Lascia un commento