| FAQ der Newsgroup de.comp.lang.assembler (d.c.l.a.) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Wie wandle ich ein Integer (Byte, Word etc.) in eine Hexadezimalzahl (String) um? Wenn der Inhalt eines Registers eine Zahl repräsentiert, dann spricht das Intel-Manual allgemein von 'Integer', wobei die Größe und das Vorzeichen der Zahl keine Rolle spielen. Integer sind immer Binärzahlen, also eine lückenlose Folge von Nullen und Einsen (Bits). Um diese Zahlen gut darstellen zu können, bedient man sich des Hexadezimalsystems: 29282d = 111001001100010b = 7262h Die kleinen Buchstaben hinter den Zahlen bezeichnen das Zahlensystem: d(ezimal), b(inär), h(exadezimal). Für die hexadezimale Zahl hat sich auch die Schreibweise 0x7262 (C/C++) eingebürgert. Es gibt auch &H7262 (Basic) und $7262 (Pascal). Die hexadezimale Schreibweise dient ausschließlich dem Zweck der besseren Darstellung.
In der ASCII-Tabelle stehen zwischen '9' und 'A' noch andere Buchstaben, so dass eine einfache lineare Übertragung nicht möglich ist. Zwei Methoden gibt es für die Umwandlung, die im folgenden in Nasm-Schreibweise dargestellt werden.
Aufgabe: Umwandlung von 1919641698d in Hexadezimal
Methode 1 (Tabelle):
BITS 32
SECTION .data
zahl: dd 1919641698
htab: db '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
ergebnis: db "xxxxxxxx",0 ; 8 Buchstaben + Abschlussnull
SECTION .text
Int2Hex:
mov edx, [zahl] ; EDX, EBX, EDI können auch Funktionsargumente sein
mov ebx, htab ; Zeiger auf Umwandlungstabelle
mov edi, ergebnis ; Zeiger auf Ergebnispuffer
mov ecx, 8
Schleife:
shld eax, edx, 4 ; vorderstes Nibble von EDX nach EAX
shl edx, 4
and al, 0Fh ; vorderes Nibble (Altlast) löschen
xlatb ; AL = ascii(AL)
stosb
loop Schleife
mov byte [edi], 0 ; Abschlussnull
ret
Danach steht in 'ergebnis' die Hexadezimalzahl.
Methode 2 (Fehlerkorrektur):
BITS 32
SECTION .data
zahl: dd 1919641698
ergebnis: db "xxxxxxxx",0
SECTION .text
Int2Hex:
mov edx, [zahl] ; EDX und EDI können auch Funktionsargumente sein
mov edi, ergebnis ; Zeiger auf Ergebnispuffer
mov ecx, 8
Schleife:
shld eax, edx, 4 ; vorderstes Nibble von EDX nach EAX
shl edx, 4
and al, 0Fh ; vorderes Nibble (Altlast) löschen
or al, 30h ; ASCII
cmp al, '9'
jbe J1 ; Ergebnis <= '9'
add al, 7 ; auf die richtige Stelle in der ASCII-Tabelle korrigieren
J1:
stosb
loop Schleife
mov byte [edi], 0 ; Abschlussnull
ret
Danach steht in 'ergebnis' die Hexadezimalzahl.
Ralph 'rkhb' Bauer 05.08.2008 | |||||||||||||||||||||||||||||||||||||||||||||||||||||