Ассемблер со знаком и без знака

Отрицательные числа

ассемблер со знаком и без знака

В языке ассемблера имеются средства записи целых и вещественных чисел, Целые числа могут быть со знаком и без знака, а также. обычно нет информации о том, это число со знаком или без. если используются условные операторы, учитывающие знак (js, jg. Решено: Числа со знаком и без Assembler Ответ. и человек - операции производит с абсолютными числами, а потом учитывает знак.

Для целых чисел и символов в составе команд микропроцессора и, соответственно, в языке ассемблера, есть средства обработки - анализа, сравнения, поиска и проч. Для вещественных чисел таких средств в самом микропроцессоре нет, они содержатся в арифметическом сопроцессоре.

Отрицательные числа

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

Это самый простой вид чисел: В огромном количестве приложений вычислительной техники для чисел нет понятия знака. Это справедливо, например, для адресов ячеек памяти, кодов ASCII символов, результатов измерений многих физических величин, кодов управления устройствами, подключаемыми к компьютеру.

Для таких чисел естественно использовать весь диапазон чисел, записываемых в ячейку того или иного размера.

ассемблер со знаком и без знака

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

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

Это справедливо как для байтовых 8-битовых чисел, так и для чисел размером в слово или в двойное слово рис. Образование отрицательных чисел различного размера. Такой способ образования отрицательных чисел удобен тем, что позволяет выполнять над ними арифметические операции по общим правилам с получением правильного результата.

Анализируя алгоритм образования отрицательного числа, можно заметить, что для всех отрицательных чисел характерно наличие двоичной единицы в старшем бите. Положительные числа, наоборот, имеют в старшем бите 0. Это справедливо для чисел любого размера. Кроме того, из рис. Легко сообразить, что для преобразования положительного 8-битового числа в слово его надо дополнить восемью двоичными нулями.

ассемблер со знаком и без знака

То же справедливо и для преобразования слова со знаком в двойное слово со знаком, только добавить придется уже не 8, а 16 единиц или нулей. В системе команд МП 86 и, соответственно, в языке ассемблера, для этих операций предусмотрены специальные команды cbw и cwd.

Следует подчеркнуть, что знак числа условен. Одно и то же число, например, изображенное на рис. Знак числа является характеристикой не самого числа, а нашего представления о его смысле. Циклы и условные переходы 3. Циклы и условные переходы Циклы, позволяющие выполнить некоторый участок программы многократно, в любом языке являются одной из наиболее употребительных конструкций.

В системе команд МП 86 циклы реализуются, главным образом, с помощью команды loop петляхотя имеются и другие способы организации циклов. Во всех случаях число шагов в цикле определяется содержимым регистра СХ, поэтому максимальное число шагов составляет 64 К.

Рассмотрим простой пример организации цикла. Пусть в программе зарезервировано место для массива размером слов, и этот массив надо заполнить натуральным рядом чисел от 0 до Эти числа, заполняющие последовательные элементы массива, иногда называют числами-заполнителями. Соответствующий фрагмент программы будет выглядеть следующим образом: На этапе подготовки мы заносим в регистр ВХ относительный адрес начала массива, отождествляемый с его именем array, устанавливаем начальное значение индекса элемента массива в регистре SI с таким же успехом можно бьшо взять DI и начальное значение числа-заполнителя.

Сам цикл состоит из трех команд - единственной содержательной команды засылки числа-заполнителя в очередной элемент массива по адресу, который вычисляется, как сумма содержимого регистров ВХ и SIа также модификации числа-заполнителя и индекса очередного элемента массива. Завершающей командой loop управление передается на метку fill, и цикл повторяется столько раз, каково содержимое СХ, в данном случае шагов. Следует обратить внимание на команду модификации индекса - в каждом шаге к содержимому SI добавляется 2, так как массив состоит из двухбайтовых слов.

ассемблер со знаком и без знака

Если бы нужно бьшо заполнить байтовый массив, то в каждом шаге содержимое регистра цикла SI следовало увеличивать на 1. Стоит отметить некоторые детали, связанные с механизмом выполнения команды loop. При реализации этой команды процессор сначала уменьшает содержимое регистра СХ на 1, а затем сравнивает полученное число с нулем.

Поэтому после нормального выхода из цикла содержимое СХ всегда равно 0. Другое обстоятельство связано с кодированием команды loop. В ее коде под смещение к точке перехода отводится всего 1 байт. Другими словами, тело цикла ограничивается всего байтами. Если циклически повторяемый фрагмент программы имеет большую длину, цикл придется организовать другим, более сложным способом: В этом, весьма типичном фрагменте мы "вручную" уменьшаем содержимое счетчика цикла и сравниваем полученное значение с 0.

Если СХ еще не равно нулю, командой безусловного перехода jmp осущестатяется возврат в начало цикла. Как было показано в гл.

Представление данных Программирование, уроки и примеры.

При необходимости организовать вложенные циклы, для сохранения счетчика внешнего цикла на время выполнения внутреннего удобно воспользоваться стеком. В следующем фрагменте организуется временная задержка длительностью несколько секунд конкретная величина задержки зависит от скорости работы процессора.

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

В приведенном выше фрагменте внешний цикл выполняется раз; внутренний -.

Числа со знаком и без

При счете числа шагов внутреннего цикла используется явление оборачивания, которое уже упоминалось ранее. Начальное значение в регистре СХ равно нулю; после выполнения тела цикла 1 раз команда loop уменьшает содержимое СХ на 1, что дает число FFFFh которое можно рассматривать, как В результате цикл повторяется еще раз, а в сумме - точно 64 К шагов.

Команда loop внутреннего цикла передает управление на саму себя, то есть тело внутреннего цикла состоит из единственной команды loop. В этом нет ничего незаконного. Любая команда, в том числе и loop, требует какого-то времени для своего выполнения, и повторение 64 К раз команды loop дает некоторую временную задержку на современных процессорах порядка тысячной доли секунды.

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

Поскольку на состояние регистра флагов влияют многие команды процессора, командами условных переходов можно пользоваться не только после команд сравнения или анализа, но и после многих других команд, если внимательно изучить влияние этих команд на флаги процессора.

ассемблер со знаком и без знака

Приведем несколько абстрактных примеров.