Сборник по задачам и примерам Assembler



Преобразование чисел

Внутри каждой большой задачи сидит маленькая,
пытающаяся пробиться наружу.
Закон больших чисел Хоара (Прикладная Мерфология)

В предыдущей главе мы рассмотрели решение проблемы обмена данными с консолью. Данные, вводимые с консоли и выводимые на нее, кодируются операционной системой в соответствии с текущей таблицей кодировки. Отдельный предмет обсуждения при этом — процесс ввода-вывода числовой информации. В каждом языке программирования он реализован по-своему. Одна из целей, к которой стремятся разработчики компиляторов, — по возможности сделать этот процесс прозрачным для программиста. Язык ассемблера в отличие от языков высокого уровня не обладает средствами такого прозрачного ввода-вывода числовой информации. Но в этом и состоит его достоинство, так как при определенном опыте и квалификации программиста появляется хорошая возможность повышения эффективности конечного кода.
Для каждой конкретной задачи преобразование чисел между различными представлениями, допустимыми компьютером, может быть выполнено несколькими способами. Для эффективного решения задач обработки числовой информации программист должен знать эти способы и уметь выбрать наиболее подходящий из них для решения конкретной проблемы. Сразу следует отметить, что эта тема далеко не нова. Многие источники, посвященные ассемблеру, с той или иной степенью подробности рассматривают проблему преобразования чисел. И хотя здесь трудно придумать что-то новое, эта тема заслуживает того, чтобы ей было уделено место в книге, посвященной вопросам прикладного программирования па ассемблере. В данной главе сделана попытка систематизированно рассмотреть различные существующие подходы к решению проблемы ввода-вывода числовой информации и ее преобразованию во внутреннее представление в компьютере.
Начнем с того, что вспомним урок 2 «Архитектура персонального компьютера» учебника, где приведена классификация типов данных, допустимых микропроцессором Pentium III. Для нашего изложения важно то, что они делятся на две большие группы — данные целочисленного и вещественного типов. Причем целочисленные данные можно разделить на две подгруппы: двоичные и двоично-десятичные (BCD-числа). Исходя из этого постараемся сформулировать направления преобразований числовой и символьной информации, востребованные на практике.
При обмене с консолью:

  • десятичные целые числа в символьном виде <-» внутреннее двоичное представление;
  • шестнадцатеричные целые числа в символьном виде <-» внутреннее двоичное представление;
  • двоичные целые числа в символьном виде <-> внутреннее двоичное представление;
  • десятичная дробь в символьном виде <-> внутреннее представление в виде
    вещественного числа;
  • дробное шестнадцатеричное число в символьном виде «-> внутреннее представление в виде вещественного числа;
  • дробное двоичное число в символьном виде <-> внутреннее представление в
    виде вещественного числа.
    Взаимное преобразование между внутренними представлениями:
  • двоичное число <-» двоично-десятичное число;
  • двоично-десятичное число <-» вещественное число;
  • двоичное целое число <-> вещественное число.

Рассмотрим основные способы выполнения некоторых из этих видов преобразований. В своих рассуждениях будем предполагать, что числа положительные. Если вы внимательно изучили материал уроков 6 и 8 учебника, а также главы 1 этой книги, посвященной программированию арифметических операций над двоичными и двоично-десятичными числами, то вы легко сможете дополнить приведенные ниже программы возможностью учета знака при выполнении соответствующих преобразований.