десятичный в шестнадцатеричный в ассемблере - PullRequest
1 голос
/ 20 февраля 2012

Система, с которой я работаю, имеет четыре регистра: al, bl, cl, dl и значения могут храниться только в шестнадцатеричном формате.

Я читаю с клавиатуры 2 цифры, например, 9 и 1.

Я хотел бы сохранить это число в регистре BL, как 5B, что является шестнадцатеричным значением для 91 (десятичное число).

Я думал о способах решения этой проблемы, но яне могу найти ни одного.Моя главная ошибка была в том, что я умножил 9 на 10 и добавил 1, результат равен 91, но я забыл, что на самом деле 91 находится в шестнадцатеричном формате, что в переводе на десятичное число становится 145 (что не мое число)

Итак, как мне сохранить две цифры (9 и 1, которые образуют 91) в виде шестнадцатеричного значения (5B) в некотором регистре или в ОЗУ.

Пожалуйста, сообщите.

Большое спасибо, V

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

Моя главная ошибка состояла в том, что я умножил 9 на 10 и добавил 1, результат равен 91, но я забыл, что на самом деле 91 находится в шестнадцатеричном формате

Это не ошибка.Если вы умножаете на 10 (десятичное), а не на 10h (шестнадцатеричное, то есть 16 десятичное), то вы получите искомый ответ.

Значения, хранящиеся в регистрах ЦП, являются просто двоичными числами, они не «в шестнадцатеричном» или «десятичном».

Обратите внимание, что вы можете время от времени сталкиваться с BCD , которые не являются двоичными числами, но являются совершенно другой вещью.

3 голосов
/ 20 февраля 2012

Число не хранится в шестнадцатеричном, десятичном или каком-либо другом виде, поэтому вам нужно интерпретировать его как таковое, если вы хотите сделать что-то вроде создания удобочитаемой строки значения в регистре.

Целочисленное значение 91 in decimal = 5B in hex = 1011011 in binary, оно все хранится в регистре одинаково - в виде двоичного значения.

Поскольку вы принимаете входные данные в виде десятичного числа, то вам нужно умножить 9 на 10 изатем добавьте 1, чтобы получить десятичное число 91 (или интерпретировать его как шестнадцатеричное - 5B).

Будьте внимательны, если ввод является представлением ASCII (или любой другой кодировкой) символа '9', в этом случае вам необходимо преобразовать код в фактическое десятичное значение.Если это на самом деле значение ASCII, то вы просто вычлите символ '0', чтобы получить десятичное число 9.

Если вы хотите интерпретировать двоичное значение регистра как шестнадцатеричное для возможной печати, вы должны создать строку, многократно получая остаток от деления значения в регистре на 16, , как указано здесь .Это тот же процесс для построения десятичной строки (делить на 10) или двоичной строки (делить на 2).

0 голосов
/ 20 февраля 2012

Если я правильно понял, вы умножались на 10 часов (то есть 16 в декабре), поэтому это приводило к неверным результатам.

   ;assuming val_1 is 9h and val_2 is 1h

   mov al, val_1
   mul al, 0Ah
   add al, val_2
   mov bl, al
...