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