2016-05-09 119 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'