- •1. Регистры общего назначения:
- •Добавление элемента в стек
- •9. Вычитание двоичных чисел без знака
- •10.Вычитание двоичных числе со знаком
- •11. Умножение двоичных чисел без знака
- •12. Деление двоичных чисел без знака
- •13.Умножение двоичных чисел со знаком
- •Пример программы
- •Безусловные переходы
- •19.Команда сравнения, усл переход для ком-ды сравнения.
- •20.Команды условного перехода по состоянию флагов
- •21.Организация циклов
- •Команда loop
- •Cmp eax, ebx; {сравниваем eax с ebx} je @IfNot; {если равны, то переходим на иначе} используются команды сравнения
- •Епочечные команды
- •Ins адрес_приемника,номер_порта insb insw insd
9. Вычитание двоичных чисел без знака
после команды вычитания чисел без знака нужно анализировать состояние флага CF. Если он установлен в 1, это говорит о том, что произошел заем из старшего разряда и результат получился в дополнительном коде.
Аналогично командам сложения группа команд вычитания состоит из минимально возможного набора. Эти команды выполняют вычитание по алгоритмам, которые мы сейчас рассматриваем, а учет особых ситуаций должен производиться самим программистом.
« Команда декремента выполняеуменьшения значения операнда на 1: dec операнд
• Команда вычитания (операнд_1 = операнд_1 - операнд_2):
sub операнд_1,операнд_2 8 Команда вычитания с учетом заема, то есть флага CF (операнд_1 = операнд_1 -операнд_2 - значение_СР): Sbb операнд_1.операнд_2 Как видите, среди команд вычитания есть команда SBB, учитывающая флаг переноса CF. Эта команда подобна ADC, но теперь уже флаг CF играет роль индикатора заема 1 из старшего разряда при вычитании чисел.
10.Вычитание двоичных числе со знаком
Вычитание выполняется с помощью команды SUB. Результат также помещается на место первого операнда и опять же выставляются флаги. Единственная разница в том, что происходит вычитание, а не сложение.
На самом деле вычитание в процессоре реализовано с помощью сложения. Процессор меняет знак второго операнда на противоположный, а затем складывает два числа. Если вам необходимо в программе поменять знак числа на противоположный, можно использовать команду NEG. У этой команды всего один операнд.
Примеры:
sub si,dx ;SI = SI - DX neg ax ;AX = -AX |
11. Умножение двоичных чисел без знака
Для умножения чисел без знака предназначена команда MUL. У этой команды только один операнд — второй множитель, который должен находиться в регистре или в памяти. Местоположение первого множителя и результата задаётся неявно и зависит от размера операнда:
Размер операнда |
Множитель |
Результат |
Байт |
AL |
AX |
Слово |
AX |
DX:AX |
Отличие умножения от сложения и вычитания в том, что разрядность результата получается в 2 раза больше, чем разрядность сомножителей. Также и в десятичной системе — например, умножая двухзначное число на двухзначное, мы можем получить в результате максимум четырёхзначное. Запись «DX:AX» означает, что старшее слово результата будет находиться в DX, а младшее — в AX. Примеры:
mul bl ;AX = AL * BL mul ax ;DX:AX = AX * AX |
Если старшая часть результата равна нулю, то флаги CF и ОF будут иметь нулевое значение. В этом случае старшую часть результата можно отбросить. Это свойство можно использовать в программе, если результат должен быть такого же размера, как множители.
12. Деление двоичных чисел без знака
Деление целых двоичных чисел — это всегда деление с остатком! По аналогии с умножением, размер делителя, частного и остатка должен быть в 2 раза меньше размера делимого. Деление чисел без знака осуществляется с помощью команды DIV. У этой команды один операнд — делитель, который должен находиться в регистре или в памяти. Местоположение делимого, частного и остатка задаётся неявно и зависит от размера операнда:
Размер операнда (делителя) |
Делимое |
Частное |
Остаток |
Байт |
AX |
AL |
AH |
Слово |
DX:AX |
AX |
DX |
При выполнении команды DIV может возникнуть прерывание (о прерываниях я подробно расскажу потом, пока старайтесь избегать таких случаев):
если делитель равен нулю;
если частное не помещается в отведённую под него разрядную сетку (например, если при делении слова на байт частное больше 255).
Примеры:
div cl ;AL = AX / CL, остаток в AH div di ;AX = DX:AX / DI, остаток в D |
