Suche Lösung zu Assembler-Problem



  • Hallo,

    ich versuche als Anfänger folgende einfache, und zugegeben unsinnige Funktion in Assembler zu schreiben:
    Die Funktion soll nichts anderes machen, als den Input-Parameter mit einer Zahl zu vergleichen, und je nachdem, ob die Zahl gleich oder Ungleich ist, 1 oder 0 zurück geben.

    Mein 1. Ansatz:

    .section .text
    .globl _test
    _test:
    	push %ebp
    	mov %esp, %ebp
    	mov $1, %eax
    	cmp 4(%ebp), '~'
    	je A0
    	mov $0, %eax
    A0:
    	mov %ebp, %esp
    	pop %ebp
    	ret
    

    Funktioniert nicht, offensichtlich deshalb, weil ich versuche, ein 4 Byte-Register mit einer 1 Byte Zahl zu vergleichen.
    Ich muss also 4(%ebp) umcasten auf 1 Byte.

    Mein 2. Versuch:

    .section .text
    .globl _test
    _test:
    	push %ebp
    	mov %esp, %ebp
    	mov $1, %eax
    	mov 4(%esp), %bl
    	cmp %bl, '~'
    	je A0
    	mov $0, %eax
    A0:
    	mov %ebp, %esp
    	pop %ebp
    	ret
    

    Funktioniert auch nicht, das Programm lässt sich zwar diesmal kompilieren, stürtzt aber ab.

    Könnte mir jemand bitte erklären, wie ich in der GNU-Assembler-Syntax casten kann?

    Bei anderen Assemblern geht das einfach, z. B.: cmp byte [register], zahl



  • assembler-lerner schrieb:

    cmp 4(%ebp), '~'
    

    Funktioniert nicht, offensichtlich deshalb, weil ich versuche, ein 4 Byte-Register mit einer 1 Byte Zahl zu vergleichen.
    Ich muss also 4(%ebp) umcasten auf 1 Byte.

    Andere Reihenfolge, Konstante und richtige Stackadresse:

    cmp $'~', 8(%ebp)
    

    Sollte der Assembler immer noch zicken, dann ersetze cmp durch cmpb . Das Suffix 'b' entspricht dem 'byte ptr'.

    Bei anderen Assemblern geht das einfach, z. B.: cmp byte [register], zahl

    Kleiner Trick als Notlösung:

    .section .text
    .globl _test
    _test:
        push %ebp
        mov %esp, %ebp
        mov $1, %eax
    
    .intel_syntax
    	cmp byte ptr [ebp+8], '~'
    .att_syntax
    
        je A0
        mov $0, %eax
    A0:
        mov %ebp, %esp
        pop %ebp
        ret
    

    Du kannst .intel_syntax auch an den Anfang packen und dann in der ganzen Datei mit Intel-Mnemnonics arbeiten.

    viele grüße
    ralph



  • Danke, mir war nicht bewusst, das cmp eine bestimmte Ordnung verlang.

    Logisch ist es egal, ob ich a mit b oder b mit a vergleiche, daher mein Fehlschluss.


Anmelden zum Antworten