Forum: PC-Programmierung Bits auslesen


von koaplannet (Gast)


Lesenswert?

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?

von M. S. (siekmanski)


Lesenswert?

mov ebx,1
  mov ecx,32

_loop:
  cmp ecx, 0
  je _end
  ror ebx,1
  dec ecx
  test eax,ebx
  je _print1

von M. S. (siekmanski)


Lesenswert?

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

von koaplannet (Gast)


Lesenswert?

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.

von koaplannet (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.