FAQ der Newsgroup de.comp.lang.assembler (d.c.l.a.)

Wie wandle ich eine eine Dezimalzahl (String) in eine Binärzahl (String) um?

Die Antwort besteht aus einer Kombination von Dez-zu-Int und Int-zu-Bin:

Nasm
BITS 32
SEGMENT .data
    dezz:  db "1919641698",0      ; 0111 0010 0110 1011 0110 1000 0110 0010
    btab: db '0000','0001','0010','0011','0100','0101','0110','0111',
          db '1000','1001','1010','1011','1100','1101','1110','1111'
SEGMENT .bss
        bin: resb 40         ; 8 Nibbles, 7 Leerzeichen, 1 Abschlussnull
SEGMENT .text

Dez2Int:                        ; Übergabe ESI: Zeiger auf ASCIIZ-String mit Dezimalzahl
        xor eax, eax            ; Ergebnis
        xor ebx, ebx            ; BL nimmt die ASCII-Ziffer auf
        mov edi, 10             ; Multiplikator (Basis 10)
  .Schleife:
        mov bl, byte [esi]      ; ASCII-Buchstaben holen
        add esi, 1              ; Zeiger auf nächste Ziffer
        cmp bl, '0'
        jb .Ausstieg            ; Sprung wenn al < '0' (keine Dezimalziffer)
        cmp bl, '9'
        ja .Ausstieg            ; Sprung wenn al > '9' (keine Dezimalziffer)
        and bl, 00001111b       ; ASCII nach Integer
        mul edi                 ; Horner-Schema
        add eax, ebx
        jmp .Schleife
  .Ausstieg:
        ret                      ; Ergebnis EAX: Integer

Int2BinByTab:                   ; Übergabe EDX: Integer, EDI: Zeiger auf ASCIIZ-Puffer
        mov esi,btab            ; Tabelle mit Vierergruppen von Binärziffern
        mov ecx,8               ; Schleifenzähler: 8 Nibbles
    .Schleife:
        xor ebx,ebx
        shld ebx,edx,4          ; das jeweils linke Nibble nach EBX schieben
        shl  edx,4
        mov eax,[esi+ebx*4]     ; 4 Bytes in der Binärtabelle laden
        stosd                   ; und in ASCIIZ-Puffer abspeichern
        mov al,32               ; Leerzeichen zwischen zwei Nibbles
        stosb
        loop .Schleife
        mov byte [edi-1],0      ; Abschlussnull ersetzt letztes Leerzeichen
        ret

Dez2Bin:
        mov esi, dezz
        call Dez2Int
        mov edx, eax
        mov edi, bin
        call Int2BinByTab
        ret

Ralph 'rkhb' Bauer Aug 2008