Ich habe Code geändert, der ASCII-Zeichen in hexadezimale Werte umwandeln soll. Meine erste Version funktionierte einwandfrei, aber meine neuere Funktion hat einige Probleme.Assembly übersetzt ASCII-Zeichen in HEX-Wert
Das ist meine neue Funktion, die ASCII-Werte in Hexadezimal-Werten übersetzt:
;carry flag cleared if successed, if not then it is set
;input number should be in AL
;output number should be in AH
.translate:
xor AH,AH
mov BX, HEXASCII
.loop:
mov DL,[BX]
cmp DL,AL
je .end
inc BX
inc AH
cmp AH,0x10
je .err
jmp .loop
.end:
clc
ret
.err:
stc
ret
; ... some code
HEXASCII db '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
jedoch diese Funktion scheint nicht richtig zu arbeiten - wenn der Ausgang von dieser Funktion zu int 13
Senden bochs wird Fehler zurückgegeben - read/write/verify parameter out of range
. die Zahlen, die ich benutze, war 00 für Head
, 00 für cylinder
und 01 für sector
, also denke ich, dass es kein tatsächliches Problem mit Argumenten ist, die ich schrieb.
Ich habe auch meine vorherige Funktion mit den gleichen Argumenten und es richtig geladen Sektor, den ich wollte.
Ich habe versucht, mit dem Bochs-Debugger Register im Speicher vor int 0x13
zu verfolgen, aber es sah so aus, als ob die Register die gleichen Werte haben, die ich eingegeben habe.
Meine bisherige Funktion ist:
;carry flag cleared if successed, if not then it is set
;input number should be in AL
;output number should be in AH
.translate:
cmp AL,'0'
je .x0
cmp AL,'1'
je .x1
cmp AL,'2'
je .x2
cmp AL,'3'
je .x3
cmp AL,'4'
je .x4
cmp AL,'5'
je .x5
cmp AL,'6'
je .x6
cmp AL,'7'
je .x7
cmp AL,'8'
je .x8
cmp AL,'9'
je .x9
cmp AL,'a'
je .xA
cmp AL,'b'
je .xB
cmp AL,'c'
je .xC
cmp AL,'d'
je .xD
cmp AL,'e'
je .xE
cmp AL,'f'
je .xF
cmp AL,'A'
je .xA
cmp AL,'B'
je .xB
cmp AL,'C'
je .xC
cmp AL,'D'
je .xD
cmp AL,'E'
je .xE
cmp AL,'F'
je .xF
jmp .NONE
.x0:
xor AH,AH
clc
ret
.x1:
mov AH,0x1
clc
ret
.x2:
mov AH,0x2
clc
ret
.x3:
mov AH,0x3
clc
ret
.x4:
mov AH,0x4
clc
ret
.x5:
mov AH,0x5
clc
ret
.x6:
mov AH,0x6
clc
ret
.x7:
mov AH,0x7
clc
ret
.x8:
mov AH,0x8
clc
ret
.x9:
mov AH,0x9
clc
ret
.xA:
mov AH,0xA
clc
ret
.xB:
mov AH,0xB
clc
ret
.xC:
mov AH,0xC
clc
ret
.xD:
mov AH,0xD
clc
ret
.xE:
mov AH,0xE
clc
ret
.xF:
mov AH,0xF
clc
ret
.NONE:
xor AH,AH
stc
ret
Ich erwarte nicht, in irgendeinem anderen Teil des Codes, beschädigt werden, wie ich es nicht geändert hat. Wenn es benötigt wird, werde ich den vollständigen Code hinzufügen, aber es ist ziemlich lang.
Gibt es etwas, was in der neuen Funktion fehlt oder falsch ist?
bearbeiten: Vergessen zu erwähnen, dass der Code in 16 bit real mode
Warum alle 'cmp' /' je' Paare? Habe einfach eine Zeichenfolge mit allen gültigen Zeichen und benutze 'scasb', um zu sehen, ob ein bestimmtes Zeichen in dieser Zeichenfolge gefunden werden kann. – Michael
Ich bin nicht sehr fortgeschritten in Assembly und ich habe noch nie die Funktion 'Scasb' gesehen, aber ich werde es mir ansehen – vakus
Nun, Sie könnten das gleiche mit' cmp' in einer Schleife erreichen. – Michael