Originariamente inviato da DarkMessiaH
a che pro fare questi due xor?? e se index non è inizializzato che cosa ne risulta?
stessa cosa dicasi per il registro ax...
Non puoi sapere cosa ci sia dentro, quindi è solo questione di sicurezza ...

Originariamente inviato da DarkMessiaH
passiamo aquesta porzione di codice:
codice:
for:
mov ah, byte [str + index] ;; ah = *(str + index)
inc index ;; index++
cmp ah, 0 ;; ah == 0 ?
jz exitfor ;; if (ah == 0) goto exitfor
cmp ah, carattere ;; ah == carattere ?
jz toupper ;; if(ah == carattere) goto tolower
jump for

toupper:
and ax, 0x5F ;; ax &= 0x5F
mov byte [str + index - 1], ah ;;*(str + index - 1) = ah
jump for

exitfor:
;;...Codice...
/*inserisce nel registro ah il puntatore(?) al valore (str + index) dove index,che non è inizializzato. perchè?
incrementa index di 1
se il valore in ah è = 0 salta all'istruzione exitfor
se il valore in ah è = al carattere salta all'istruzione tolower
ripeti for*/
index è inizializzato a zero (xor index,index).
Non inserisco il puntatore, ma il valore contenuto in (str + index).

Originariamente inviato da DarkMessiaH
/*in toupper invece abbiamo:
and logico tra il valore contenuto in ah e 0x5f ovvero 95...perchè?
inserimento in ah di (str+index-1) anche questo...perchè?
ritorno al for*/
Semplicemente, prova con carta e penna, se fai l'and di un carattere con 0x5F, ottieni quel carattere maiuscolo ... una volta ottenuto maiuscolo lo reinserisco nella stringa; index è pero incrementato di uno, quindi la posizione corretta è la precedente.

L'algoritmo è semplice:
-Scorri la stringa fino a quando non trovi uno zero.
-Se il str[index] è uguale a carattere, lo metti in and con 0x5f

Tutto qua.