2016-05-09 115 views
2

我正在修改假设将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

+1

为什么所有的'cmp' /'je'对?只需要一个包含所有有效字符的字符串,并使用'scasb'来查看是否可以在该字符串中找到给定的字符。 – Michael

+0

我在汇编中不是很先进,我从来没有见过函数'scasb',但我会看看它 – vakus

+1

那么,你可以在循环中用'cmp'实现同样的功能。 – Michael

回答

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'