我正在修改假設將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