Binärzahl eines Wertes ausgeben



  • Hi,
    Ich programmiere hier mit nasm, 32 bit unter Windows

    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:
    push ebp
    mov ebx, [esp-4]
    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
    

    Die bt (=bit test) Anweisung in _loop testet ein bit an Position ecx in ebx, 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 zurRoutine _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 ebx 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 ebx einsetze, das Ergebnis ist immer 00000000010000000001100010100000.Ich habe schon verschiedene Register zur Speicherung des Wertes benutzt, aber als Ergebnis erhalte ich immer eine stets gleichbleibende Binärzahl, unabhängig vom Wert den ich ins Register einspeise. Was mache ich falsch?



  • section .text
    _foo:
    push ebp
    mov ebx, [esp-4]    ;; Wieso -4? Wie wärs mit +8?
    mov ecx, 32
    


  • Stimmt..danke. Oh man, das hab ich jetzt total verplant. Ich glaub die Ausgabe stimmt jetzt sogar. Die letzen 8 Stunden die an dem Teil gehockt bin hätt ich mir schenken können.



  • Ich glaube du solltest dich mal mit einem Debugger vertraut machen. Dann hättest du gemerkt, dass in ebx nicht das drin steht, was du übergeben hast.



  • Ich werd mal nach sowas suchen.


Anmelden zum Antworten