将 ASCII 字符转换为 HEX 值的程序集
Assembly translating ASCII character to HEX value
我正在修改假设将 ASCII 字符转换为十六进制值的代码。我的第一个版本运行完美,没有任何问题,但是我的新功能有一些问题。
这是我将 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,cylinder
的 00,以及 sector
的 01,所以我想这不是我写的参数的实际问题。
我也使用了我以前的函数和相同的参数,它正确地加载了我想要的扇区。
我在 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
我不希望代码的任何其他部分被损坏,因为我没有修改它。
如果需要,我会包含完整的代码,但是它很长。
新功能有没有遗漏或错误的地方?
编辑:忘了说代码是 运行 in 16 bit real mode
在从 osdev forum
那里得到一些帮助后,有人注意到该函数确实正确地转换了值,但是它破坏了 dl
寄存器,我忘记保持原样 hard drive
数.
如果有人需要此代码的更新版本,请点击此处:
.translate:
xor AH,AH
mov BX, HEXASCII
.loop:
cmp [BX],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'
我正在修改假设将 ASCII 字符转换为十六进制值的代码。我的第一个版本运行完美,没有任何问题,但是我的新功能有一些问题。
这是我将 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,cylinder
的 00,以及 sector
的 01,所以我想这不是我写的参数的实际问题。
我也使用了我以前的函数和相同的参数,它正确地加载了我想要的扇区。
我在 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
我不希望代码的任何其他部分被损坏,因为我没有修改它。 如果需要,我会包含完整的代码,但是它很长。
新功能有没有遗漏或错误的地方?
编辑:忘了说代码是 运行 in 16 bit real mode
在从 osdev forum
那里得到一些帮助后,有人注意到该函数确实正确地转换了值,但是它破坏了 dl
寄存器,我忘记保持原样 hard drive
数.
如果有人需要此代码的更新版本,请点击此处:
.translate:
xor AH,AH
mov BX, HEXASCII
.loop:
cmp [BX],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'