2016-05-09 2 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. числа, которые я использовал, были 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

+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' 
Смежные вопросы