Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

Системы счисления, тэги ассемблера, перевод чисел

  Макс Петров май 2013

      Двоичная, восьмеричная, десятичная, шестнадцатеричная системы счисления относятся к позиционным. Позиционная система счисления - такая, в которой значение цифры зависит от ее положения в числе, положения цифр в числе называют порядками или разрядами. Основанием позиционной системы счисления является счет, при достижении которого заполняется следующий порядок числа. Иначе, основание системы счисления равно числу цифр, включая ноль, которыми записываются числа в этой системе.

      Ассемблер допускает возможность использования чисел в двоичной, восьмеричной, десятичной или шестнадцатеричной системе. По умолчанию ассемблер считает все числа, встречающиеся в программе, десятичными. Явно указать на основание числа можно при помощи тэгов (для MASM32 11 версии): b или y - для двоичных чисел; o или q - для восьмеричных; d или t - для десятичных чисел; h - для шестнадцатеричных чисел. Тэг записывается в конце числа, слитно с числом. Если в числе используются буквенные символы (шестнадцатеричные числа), в начале записывают ноль - по правилам ассемблера обозначения чисел должны начинаться с цифры. Например:

.data var1 byte 00001111b ; 15 в двоичном представлении var2 byte 00001111y ; 15 в двоичном представлении var3 byte 17o ; 15 в восьмеричном представлении var4 byte 17q ; 15 в восьмеричном представлении var5 byte 15d ; 15 в десятичном представлении var6 byte 15t ; 15 в десятичном представлении var7 byte 0Fh ; 15 в шестнадцатеричном представлении

      Можно задать вид применяющихся в программе чисел в секции директив инструкцией вида

.RADIX (основание)

в которой основание счисления указывается десятичным числом. Например, по инструкции

.RADIX 16

ассемблер будет считать, что все числа без тэгов в программе являются шестнадцатеричными.

      Существование двух вариантов тэгов для двоичных и десятичных чисел вызвано соображениями совместимости ранних версий MASM32, в которых возможности записи чисел в шестнадцатеричном формате не было, с более поздними версиями. Для шестнадцатеричных чисел арабских цифр не хватает, поэтому цифровой ряд дополнен буквами:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

      Легко видеть, что тэги из ранних версий MASM32 - b и d - совпадают с цифрами шестнадцатеричного числа, что делает невозможным их использование при директиве .RADIX 16. Тег o дублирован тэгом q из-за схожести первого с нулем. По указанным причинам предпочтительными являются тэги y, q, t.

      В вычислительной машине все числа хранятся в виде последовательностей из нулей и единиц. Когда мы в текст программы записываем какое-либо число, его перевод в машиночитаемое представление осуществляет ассемблер, и в исполняемый файл это число будет записано в надлежащем (двоичном) виде. Но организовывать вывод из программы числа в понятном уже пользователю формате мы должны сами, значит, если требуется показать пользователю число, тогда мы должны сделать в программе следующее: а) перевести число из двоичной системы в десятичную - из машинного представления в человеческое; б) заменить полученное десятичное число его символом, то есть соответствующей числу картинкой, поскольку монитор отображает именно картинки, а не числа.

      Перевод машинного числа в заданную систему счисления осуществляется последовательным делением этого числа и получающегося результата на основание искомой системы счисления. Остаток от деления заносится в младший разряд, частное снова делится на основание системы счисления, остаток заносится в следующий разряд - и так до достижения в результате деления нуля. Допустим, требуется перевести десятичное число 250 в шестнадцатеричное представление:
      250 / 16 = 15, остаток = A (10),
      15 / 16 = 0, остаток = F (15),
      таким образом, 250 (десятичное) = FA (шестнадцатеричное).

      Максимальной число, которое может быть записано в байт, составляет 255. Если по результатам работы программы необходимо вывести на экран число в десятичном формате из однобайтовой переменной, следует это число делить на 10 не более, чем три раза - в 255 три десятичных порядка. В переменных типа word (два байта) максимальное значение составляет 65 535, в переменных типа double word (четыре байта) - 4 294 967 295. Соответственно, числа word для перевода в десятичный формат делим на 10 не более пяти раз, double word -не более десяти раз.

      Кодами символов-цифр являются: "0" - 48; "1" - 49; "2" - 50; "3" - 51; "4" - 52; "5" - 53; "6" - 54; "7" - 55; "8" - 56; "9" - 57. Очевидно, что для перевода значения цифры в символьный вид достаточно прибавить к нему 48.

      Фрагмент программы, который переводит байтовую переменную в десятичный символьный вид:

.data divider byte 10 ; делитель buffer_dec byte 3 dup (?) parametr byte 255 ... .code start: ... ; получим значения байта parametr в десятичном символьном виде mov AH, 0 ; обнуляем AH mov AL, parametr ; копируем байтовую переменную в AL DIV divider ; делим AX на 10 mov buffer_dec[2], AH ; копируем остаток от деления в buffer_dec[2] mov AH, 0 ; обнуляем AH DIV divider ; делим AX на 10 mov buffer_dec[1], AH ; копируем остаток от деления в buffer_dec[1] mov buffer_dec[0], AL ; копируем частное в buffer_dec[0] ADD buffer_dec[0], 48 ; добавляем 48 - получаем символ цифры "2" ADD buffer_dec[1], 48 ; добавляем 48 - получаем символ цифры "5" ADD buffer_dec[2], 48 ; добавляем 48 - получаем символ цифры "5"

     


Добавить комментарий

E-mail:
*


Контрольные цифры:

   Какой-то непонятный    02.11.2015    08:30
Какое-то понятное




Ассемблер MASM32

      Простейшая программа на ассемблере (beeper)
      Переменные и типы данных ассемблера
      Регистры процессора IA32
      Консоль ввода-вывода
      API-функция CharToOem и строки ассемблера
      API-функция ReadConsoleInput
      API-функция PeekConsoleInput
      События консоли (таблица)
      Системы счисления, тэги ассемблера, перевод чисел
      Отрицательные числа
      Инкремент и декремент
      Деление (DIV, IDIV)
      VKDEBUG
      Макросы ассемблера
      Воспоминание об Альгамбре на системном динамике
      Командная строка
      Пузырьковая сортировка. Эстафета шариков
      Сортировка расческой
      Быстрая сортировка

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна