lodsb & cld vs. std
-
High,
wieso funktioniert der Code
.data Var db "..." .code [...] lea esi, Var inc esi cld lodsbeinwandfrei, während das Programm bei std statt cld abstürzt? Ist doch nur der Unterschied, dass esi dekrementiert statt inkrementiert wird??
VG,
DerNamenlose
-
ja, und damit greift dann lodsb auf ungültigen speicher zu, mit std must du die adresse des letzten zeichens nach esi kopieren

-
DerNamenlose schrieb:
High,
wieso funktioniert der Code
.data Var db "..." .code [...] lea esi, Var inc esi cld lodsbeinwandfrei, während das Programm bei std statt cld abstürzt? Ist doch nur der Unterschied, dass esi dekrementiert statt inkrementiert wird??
VG,
DerNamenloseWenn du das Richtungsflag mit std setzt, bist du fuer das Loeschen mit cld verantwortlich.
Wird das abschliessende Loeschen vergessen, stuerzt der Rechner ab.int _tmain(int argc, _TCHAR* argv[]) { char Var[] = {'A','B','C'}; __asm lea esi, Var+2 /*__asm inc esi __asm inc esi */ __asm std ; setzt das Richtungsflag __asm lodsb ; esi wird um 1 erniedrigt - 'C' in al __asm lodsb ; esi wird um 1 erniedrigt - 'B' in al __asm cld ; löscht das Richtungsflag __asm lodsb ; esi wird um 1 erhoeht - 'A' in al return 0; }MfG