我正在修改假设将ASCII字符转换为十六进制值的代码。我的第一个版本完美无缺地工作,但是我的新功能有一些问题。汇编将ASCII字符转换为HEX值
这是我的新功能,它转换的ASCII值以十六进制值:
;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'
不过这个功能似乎无法正常工作 - 从这个函数发送输出时int 13
下,Bochs是返回错误 - read/write/verify parameter out of range
。我使用的编号为Head
,00,0cylinder
,01为sector
,所以我猜这不是我写的参数的实际问题。
我也用我的前一个函数具有相同的参数,它正确地加载了我想要的部分。
我试图在int 0x13
之前使用Bochs调试器来跟踪内存中的寄存器,但它看起来像寄存器具有相同的输入值。
我以前的功能是:
;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
我不希望其他代码部分损坏,因为我没有修改它。 如果需要,我会包含完整的代码,但是它很长。
在新功能中是否有遗漏或错误的东西?
编辑:忘了提,该代码在16 bit real mode
为什么所有的'cmp' /'je'对?只需要一个包含所有有效字符的字符串,并使用'scasb'来查看是否可以在该字符串中找到给定的字符。 – Michael
我在汇编中不是很先进,我从来没有见过函数'scasb',但我会看看它 – vakus
那么,你可以在循环中用'cmp'实现同样的功能。 – Michael