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 also4(%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 also4(%ebp)
umcasten auf 1 Byte.Andere Reihenfolge, Konstante und richtige Stackadresse:
cmp $'~', 8(%ebp)
Sollte der Assembler immer noch zicken, dann ersetze
cmp
durchcmpb
. 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.