Я нашел много вопросов по этой проблеме, однако мне не удалось запустить мой код. Моя программа должна принимать шестнадцатеричное значение, проверить, является ли он действительным шестнадцатеричным символом, а затем отобразить шестнадцатеричное значение в виде десятичного значения. Если это шестнадцатеричный символ нижнего регистра, его необходимо преобразовать в верхний регистр. Все это должно быть в цикле.Сборка: как преобразовать шестнадцатеричный ввод в десятичный?
У меня все это сделано, за исключением преобразования шестнадцатеричного в десятичное. У меня есть код в программе, я думаю, должен его преобразовать, но он не будет компилироваться. Я буду перечислять ошибки компилятора под кодом. Если код в преобразовании метки: закомментирован (за исключением последней строки, «отображение jmp»), то программа будет работать как следует, но, очевидно, не будет показывать значение как десятичное.
Компиляция с NaSMe: "NASM -fbin getChar.asm -o getChar.com -l getChar.lst"
Я бег программы в DOSBox.
; This program gets a char from user and prints it out as a decimal
org 100h ; program start point
section .data
msgIn: DB 13, 10, "Enter a Hex Digit: $"
msgOut: DB 13, 10, "Decimal Value: $"
msgOpt: DB 13, 10, "Enter another?(y or n): $"
errMsg: DB 13, 10, "Illegal character, Enter 0..9 or A..F: $"
HNUM: DB 19H
NUM: DB 0
D: DB 10h
H: DB 16
CNT: DB 0
section .text
continue: ; start of loop
mov dx, msgIn ; offset address of message to display
mov ah, 9 ; print string function
int 21h
mov ah, 1 ; keyboard input sub-program
int 21h ; read character into al
mov cl, al
legal: ; compare input to see if valid
cmp cl, 48 ; cl < 0
jl end_if ; yes, error msg
cmp cl, 70 ; cl > F
jg check_case ; yes, error msg
jmp prntMsg2 ; print value of input
check_case: ; check case of input
cmp cl, 97 ; cl < a
jl end_if ; yes, error msg
cmp cl, 102 ; cl > f
jg end_if ; yes, error msg
jmp to_upper ; need to send to function to convert to upper case
; then pass to prntMsg2
to_upper:
and al, 223 ; convert to upper case(0DFh)
jmp prntMsg2
end_if: ; error message if invalid input
mov ah, 9
mov dx, errMsg ; print error message
int 21h
jmp continue ; get a new value
prntMsg2: ; print second message*****
mov dx, msgOut ; offset of second message
mov ah, 9 ; print string function
int 21h ; display message
convert:
mov cx, 00
mov dx, 00
L6: mov ax, 00
mov al, [HNUM]
div word [D]
mov [HNUM], al
mov bx, ax
mov cl, 0
mov ax, 1
L5:
cmp cl, 00
je L7
mul word [H]
sub cl, 1
jmp L5
L7:
mul bh
add dx, ax
add word [CNT], 1
cmp word [HNUM], 0
jg L6
mov [NUM], dl
jmp display
display: ; display character
mov dl, al
mov ah, 2 ; print char function
int 21h
mov ah, 9 ; see if user wants to do it again
mov dx, msgOpt
int 21h
mov ah, 1
int 21h
mov bl, al
cmp bl, 'y' ; bl = y
jne exitPrg ; no, end
jmp continue ; get a new value
exitPrg: ; exit program
mov ah, 4ch ; exit to DOS function
int 21h ; see you later!
Этот код был отредактирован и теперь компилирован и работает. Тем не менее, он по-прежнему не делает преобразование из шестнадцатеричного в десятичное правильно. Он просто не отображает значение, просто пустое. Он также повесит трубку, если будет введена буква, даже буква a-f. Число не зависает, но все же значение не отображается.
Теперь, когда у меня это работает, по крайней мере, я могу поработать над его исправлением, однако любое руководство ценится. Спасибо, Джин, за то, что вы меня запустили.
спасибо за ответ, я дам этот снимок. – Beetle
Это исправило это, мне также нужно было добавить слово, прежде чем использовать его. Я исправил код с исправлениями. Хотя я не получаю нужных результатов, теперь он работает. – Beetle
Я сомневаюсь, что вам нужен спецификатор размера 'word', поскольку переменные являются байтами. –