2013-04-08 3 views
-1

я в настоящее время программирования на ассемблере для 8086.Преобразование шестнадцатеричного символа в Ассамблее

Текущей задачи я делаю преобразование 4 шестнадцатеричных цифр в его десятичное представление. Я пробовал следовать методу преподавателей, но я смущен в разделе, где мне нужно умножить шестнадцатеричную цифру на временное значение, тем более, что мне сказали сделать это 0, поэтому каждый раз, когда значение temp value умножается, оно всегда будет 0 правильно?

Код, который я до сих пор ниже, любая помощь действительно оценена!

; ------------------------------------ 
; Name : Gethex 
; Function: converts a word (4 hex digits) into a numerical value 
; Inputs : Upto a word hex values input into the console 
; Outputs : Return within DX the numerical conversion 
; ------------------------------------ 

Gethex: 
MOV BX,0H ;Temp value to 0 
MOV CX,0H ;Counter set to 0 
Gethexloop: 
call Getch 
push DX ; Putch requires DL, need to save current reg 
MOV DL,AL 
call Putch 
pop DX ; restore DL reg 
MOV BH,AH ;Use BH as temp storage as AH will be corrupted 
cmp AL,30H ; ASCII 0 
JL Gethexloop ; If less than 0 jump to the start as not an Alphabetical char 
cmp AL,39H ; ASCII 9 
JLE Nums ; If less or equal to 9 then it will be a number 
cmp AL,46H 
JLE Case ; Start the conversion procedure 
Case: 
SUB AL,10 
jmp Convert 
Nums: 
SUB AL,30 ; Convert to normal number 
Convert: 
push AX ; Prepare to multiply 
MOV AX,BX 
mul BX 
POP AX 
ADD AX,BX 
ADD DX,AX ; final value 
ADD CX,1 ; Increase counter 
cmp CX,3 ; if greater than 4 (0 being included so 3) 
JG EndLoop 
jmp Gethexloop 
EndLoop: 
ret ; return to calling statement 
+2

Просить людей обнаружить ошибки в вашем коде не особенно продуктивно. Вы должны использовать отладчик, чтобы изолировать проблему, отслеживая ход вашей программы и сравнивая ее с тем, что вы ожидаете. Как только двое расходятся, вы нашли свою проблему. (И тогда, если необходимо, вы должны создать [минимальный тестовый сценарий] (http://sscce.org).) –

ответ

1

Всего несколько наблюдений ... Во-первых, число - это число. «hex» и «decimal» (и «двоичный» и «восьмеричный») являются способами представления числа - это то же самое число. Преобразование «шестнадцатеричного представления» в «десятичное представление» за один шаг было бы затруднительным (но возможно ... я думаю). То, что вы хотите сделать, это преобразовать шестнадцатеричное представление в число ... и затем, вероятно, преобразовать число в десятичное представление, чтобы мы могли его распечатать.

Ваша переменная temp, которую мне нравится называть «результат до сих пор», начинается с нуля, но она не сбрасывается до нуля для каждого символа/цифры! Общая процедура заключается в том, чтобы установить «результат до сих пор» равным нулю, а затем для каждой допустимой цифры умножить «результат до сих пор» на radix-ten для десятичного числа, 16 для hex - затем добавить новую цифру ... Разумеется, преобразованный из персонажа в число. Повторяйте, пока не кончатся символы

mul это прекрасно инструкция, но она имеет «скрытые» операнды (ax и dx, в нашем случае). Умножая на десять, у нас нет слишком большого выбора, но умножение на 16 может быть достигнуто shl reg, 4 с меньшим количеством «побочных эффектов». Если вы действительно на 8086, только 1 и cl являются действительными операндами. «Непосредственный», кроме одного, был введен только в 80186 (80286 для практических целей - 80186 был редок). Вы можете почти наверняка использовать его, но, возможно, вы не «должны». Я подозреваю, что вы «должны» использовать mul для этого - упрощает проверку переполнения, в любом случае (если вы хотите это сделать - ограничение ввода на 4 символа должно избегать переполнения в любом случае).

Я не вижу цели вашей линии mov bh, ah - ah содержит что-нибудь «интересное» на этом этапе?

Практически любой ассемблер принимает cmp al, '0' - тот же код, что и cmp al, 48 или cmp al, 30h. Я нахожу, что первые делают задачу инструкции более ясной, но это действительно не имеет значения.

jl и jg предназначены для подписных номеров - 0FFh будут интерпретированы как -1 и будут сравниваться как «меньше нуля». В этом коде вы не встретите никаких чисел, «достаточно больших, чтобы быть отрицательными», поэтому это не имеет значения, но jb и ja предназначены для чисел без знака (0FFh интерпретируется как 255) и может быть «более правильным». Это всего лишь нит-кик, но вы также можете узнать разницу - иногда это имеет значение.

cmp AL,46H 
    JLE Case ; Start the conversion procedure 
Case: 
    SUB AL,10 

Опять же, мне нравится cmp al, 'F' лучше - но это производит один и тот же код. Если al НЕ меньше или равно (опять jbe будет правильным для неподписанных), вы все равно проваливаетесь до Case:. Я сомневаюсь, что это то, что вы хотите! И я не понимаю, почему вы вычитаете 10. Я бы подумал 37h или просто 7, если вы все равно вычтите «0».

Жесткий пользователь как можно скорее вводит 'a' .. 'f' как 'A' .. 'F'. Чтобы сделать правильный «toupper», мы хотели бы убедиться, что у персонажа есть «случай». Здесь мы все равно отказываемся от чего-либо иного, кроме «A». «F», поэтому не имеет значения, будем ли мы создавать какой-то барахл, заставляя символы, у которых нет «прописных букв». Удостоверьтесь, что вы сначала уничтожили десятичные цифры! and al, 0DFh ; force to uppercase. Вы можете или не хотите этого делать - может просто заставить пользователя использовать клавишу shift. :)

Ввод пользователя заканчивается возвратом каретки - 13 или 0Dh - (как я помню ... Linux использует linefeed - 10 или 0Ah - но я думаю, что dos - 13). Возможно, вы захотите проверить это сначала - до десятичных или шестнадцатеричных цифр. Я думаю, что ваша текущая настройка будет ждать 4 символа от пользователя, даже если они ударили «enter». Вероятно, не ожидаемое поведение ...

И да, получите отладчик и узнайте, как его использовать. Видеть, что происходит шаг за шагом, поможет вам многое. Мне нравился GRDB Дэвида Линдауэра ... (как DEBUG только ярче) ...

+0

Привет, Франк, Спасибо за вашу помощь, я думаю, что у меня сейчас работает, а результаты отладки правильно :) спасибо за ваш дружелюбный тон :) – Flak714

+0

Есть ли у вас рекомендации по книгам или учебникам? – Flak714

 Смежные вопросы

  • Нет связанных вопросов^_^