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:
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