lodsb & cld vs. std



  • High,

    wieso funktioniert der Code

    .data
    Var db "..."
    
    .code
    [...]
    lea esi, Var
    inc esi
    cld
    lodsb
    

    einwandfrei, 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
    lodsb
    

    einwandfrei, während das Programm bei std statt cld abstürzt? Ist doch nur der Unterschied, dass esi dekrementiert statt inkrementiert wird??
    VG,
    DerNamenlose

    Wenn 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


Anmelden zum Antworten