Я модифицировал код, который предположил бы перевести символы 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
. числа, которые я использовал, были 00 для Head
, 00 для cylinder
и 01 для sector
, поэтому я думаю, что это не настоящая проблема с аргументами, которые я написал.
Я также использовал свою предыдущую функцию с теми же аргументами и правильно загрузил сектор, который я хотел.
Я попытался использовать отладчик 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
Почему все '' cmp'/je' пары? Просто введите строку со всеми допустимыми символами и используйте 'scasb', чтобы увидеть, может ли данный символ быть найден в этой строке. – Michael
Я не очень продвинутый в сборке, и я никогда не видел функцию 'scasb', но я посмотрю на нее – vakus
Ну, вы могли бы добиться того же самого с' cmp' в цикле. – Michael