汇编将ASCII字符转换为HEX值

时间:2016-05-09 10:25:53

标签: nasm bare-metal real-mode bochs

我正在修改代码,假设将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,所以我猜这不是我写的参数的实际问题。

我还使用了我之前的函数和相同的参数,它正确地加载了我想要的扇区。

我尝试使用Bochs调试器在int 0x13之前跟踪内存中的寄存器,但看起来寄存器的值与我输入的值相同。

我之前的功能是:

;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

中运行

1 个答案:

答案 0 :(得分:0)

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'