Hi, Ich programmiere hier mit nasm, 32 bit. Ich versuche einen 32-bit Wert bit für bit auszulesen und die sich daraus ergebende Binärzahl auf der Konsole auszugeben. Der ursprüngliche Zweck des ganzen war, eine Floating-Point-Zahl in Binärform auszugeben. Hier mein bisheriger Code: ------------------------------------------------------------------------ extern _printf global _foo section .data m0: db "0", 0 m1: db "1", 0 mstr: db "%s" section .text _foo: mov eax, [esp-4] push ebp push ebx mov ebp, esp mov ebx, 32 _loop: cmp ebx, 0 je _end dec ebx bt eax, ebx jc _print1 _print0: push m0 push mstr call _printf jmp _loop _print1: push m1 push mstr call _printf jmp _loop _end: mov eax, 0 mov esp, ebp pop ebx pop ebp ret ----------------------------------------------------------------------- Die bt (=bit test) Anweisung in _loop testet ein bit an Position ebx in eax, und setzt das carry flag CF wenn das geprüfte bit gesetzt ist. Die bedingte Sprunganweisung jc liest dann CF aus und springt falls CF gesetzt ist zur Routine _print1, die eine 1 auf der Konsole ausgibt. Ansonsten geht es weiter mit der Routine _print0, die eine 0 auf der Konsole ausgibt. Auf diese Weise wollte ich alle bits von eax lesen und auf dem Bildschirm ausgeben, so dass ich dann die binäre Darstellung beliebiger 32-bit Werte gewinne. Leider klappt das ganze irgendwie nicht. Egal welchen Wert ich in eax einsetze, das Ergebnis ist immer 00000000000000000000000000000001. Die jc-Anweisung scheint nie zu springen, außer beim letzten bit. Wo liegt der Fehler?
mov ebx,1 mov ecx,32 _loop: cmp ecx, 0 je _end ror ebx,1 dec ecx test eax,ebx je _print1
mov ebx,1 mov ecx,32 _loop: cmp ecx, 0 je _end ror ebx,1 dec ecx test eax,ebx je _print1 _print0: push eax push ebx push ecx push m0 push mstr call _printf pop ecx pop ebx pop eax jmp _loop _print1: push eax push ebx push ecx push m1 push mstr call _printf pop ecx pop ebx pop eax jmp _loop
Hallo Siekmanski Danke für den Code. Er scheint jedoch nicht zu funktionieren. Wenn ich ihn ausführe, führt er immer in eine 01 Endlosschleife. Ich habe übrigens vergessen zu erwähnen, dass ich unter Windows programmiere.
Hey, hat sich erledigt. Ich hab wohl unter anderem falsch gemacht, dass ich bei der Argumentübergabe [esp-x] statt [esp+x] benutzt habe. Code der funktioniert (glaub ich jedenfalls) ----------------------------------------------------------------------- extern _printf global _foo section .data m0: db "0", 0 m1: db "1", 0 mstr: db "%s" section .text _foo: push ebp mov ebx, [esp+8] mov ecx, 32 _loop: cmp ecx, 0 je _end dec ecx bt ebx, ecx jc _print1 _print0: mov ebp, ecx push m0 push mstr call _printf add esp, 8 mov ecx, ebp jmp _loop _print1: mov ebp, ecx push m1 push mstr call _printf add esp, 8 mov ecx, ebp jmp _loop _end: mov eax, 0 pop ebp ret
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.