- •Команды языка ассемблера
- •3.2.1 Программные сегменты. Директива assume
- •6. Арифметические команды ……………………………………………….
- •Архитектура пк.
- •Регистры.
- •Регистры общего назначения.
- •1.1.2. Сегментные регистры
- •1.1.3 Регистр флагов
- •Организация памяти.
- •1.3. Представление данных
- •1.3.1 Типы данных
- •1.3.2 Представление символов и строк
- •Операторы программы на ассемблере
- •2.1 Команды языка ассемблера
- •2.2. Режимы адресации и форматы машинных команд
- •3. Псевдооператоры
- •3.1 Директивы определения данных
- •3.2 Структура программы на ассемблере
- •3.2.1 Программные сегменты. Директива assume
- •Начальная загрузка сегментных регистров
- •Упрощенная директива сегментации
- •4. Ассемблирование и компоновка программы.
- •5. Команды пересылки данных
- •5.1 Команды общего назначения
- •5.2 Команды работы со стеком
- •4.3 Команды ввода-вывода
- •5.4 Команды пересылки адреса
- •5.5 Команды пересылки флагов
- •6. Арифметические команды
- •Арифметические операции над целыми двоичными числами.
- •6.1.1 Сложение и вычитание.
- •6.1.2 Команды приращения и уменьшения приемника на единицу
- •6.2 Умножение и деление.
- •6.3 Изменение знака.
- •7. Логические операции
- •8. Сдвиги и циклические сдвиги
- •9. Строковые операции
- •10. Логика и организация программ
- •10.1 Безусловные переходы
- •10.2 Условные переходы
- •10.3 Циклы
- •10.4 Процедуры в языке ассемблера
- •10.5 Прерывания int
- •10.6 Системное программное обеспечение
- •10.6.1.1 Чтение клавиатуры.
- •10.6.1.2 Вывод символов на экран.
- •10.6.1.3 Завершение программ.
- •10.6.2.1 Выбор режимов дисплея.
- •11. Дисковая память
- •11.1 Оглавление диска (каталог)
- •11.2 Таблица распределения файлов
- •11.3 Операции ввода-вывода на диск
- •11.3.1 Запись файла на диск
- •11.3.1.1 Данные в формате asciiz
- •11.3.1.2 Файловый номер
- •11.3.1.3 Создание дискового файла
- •Чтение дискового файла
6.1.2 Команды приращения и уменьшения приемника на единицу
Когда ассемблерной программе требуется производить сложение, хорошо, если добавляемое значение это 1. Это называется инкремент. Аналогично, когда значение 1 вычитается из регистра или переменной это называется декремент. Для таких операций, как изменение счетчика цикла или изменение регистра указателя при просмотре памяти, Вы используете инкремент и декремент.
В соответствии с частым использованием инкремента и декремента ассемблер предоставляет инструкции INC и DEC. Как можно, ожидать INC прибавляет к регистру или переменной 1 и DEC вычитает 1 из регистра или переменной.
Например, следующий код заполняет 10 байтный массив TempArray числами 0,1,2,3,4,5,6,7,8,9:
...
.DATA
TempArray DB 10 DUP (?)
FillCount DW ?
...
.CODE
...
MOV AL,0 ;первое значение запоминается в TempArray
MOV BX,OFFSET TempArray ;BX указывает на TempArray
MOV [FillCount],10 ;# элемента для заполнения
M1:
MOV [BX],AL ;устанавливает текущий элемент TempArray
INC BX ;указатель на следующий элемент TempArray
INC AL ;следующее значение для запоминания
DEC [FillCount] ;уменьшить # элементов
JNZ M1 ;делать другой элемент, если мы не
;заполнили все элементы
...
Инструкция ADD - длиной 3 байта, а INC только 1 байт и работает быстрее. В действительности, короче использовать две инструкции INC, чем прибавить 2 к регистру типа слово. (Инкремент и декремент регистра или памяти размера в байт занимают 2 байта - это короче, чем сложение или вычитание).
Короче, INC и DEC более эффективны для инкремента и декремента регистров и переменных в памяти.
6.2 Умножение и деление.
Инструкция MUL умножает два 8 или 16-битных беззнаковых сомножителя, генерируя 16 или 32- битное число.
Один из сомножителей при умножении 8-битовых чисел должен быть запомнен в AL; другой может быть в любом 8-битном регистре общего назначения или быть операндом памяти. MUL всегда сохраняет 16 битный результат в AX. Например,
...
MOV AL,25
MOV DH,40
MUL DH
...
умножает AL на DH, сохраняя результат 1000 в AХ. Заметим, что MUL требует только один операнд; другой сомножитель всегда в AL (или в AX в случае умножения слов).
При умножении слов один сомножитель должен быть сохранен в AX, в то время как другой может быть любым 16-битным регистром общего назначения или операндом памяти. MUL помещает 32-битный результат в DX:AX с младшими 16 битами результата в AX и старшими 16 битами результата в DX. Например,
...
MOV AX,1000
MUL AX
...
загружает в AX 1000 и затем возводит AX в квадрат, помещая результат 1000000 в DX:AX.
В отличие от сложения и вычитания умножение зависит от того, знаковые операнды или беззнаковые, поэтому введена вторая инструкция умножения IMUL для перемножения байтов и слов. За исключением того, что она обрабатывает знаковые значения, IMUL аналогична MUL:
...
MOV AL,-2
MOV AH,10
IMUL AH
...
запоминает значение -20 в AX.
Команда DIV (divide –разделить) выполняет деление чисел без знака, а команда IDIV выполняет деление чисел со знаком. Команды имеют формат
DIV источник
IDIV источник
Где источник делитель размеров в байт или слово, находящееся в регистре общего назначения или в ячейке памяти. Делимое должно иметь двойной размер; оно извлекается из регистра AX (при делении на 8-битовое число) или из регистров DX и AX при делении на 16-битовое число). Результат возвращается следующим образом:
Если операнд-источник представляет собой байт, то частное возвращается в регистр AL, а остаток в AH.
Если операнд-источник слово, то частное возвращается в AX, а остаток – в регистр DX.
Обе команды оставляют состояние флагов неопределенными, но если частное не помещается в регистре приемнике (AL или AX), то генерируется прерывание типа 0 (деление на 0).
...
MOV AX,51
MOV DL,10
DIV DL
...
Результат 5 в AL и остаток 1 в AH. Пример:
...
MOV AX,0ffffh
MOV BL,1
DIV B1
...
генерирует прерывание 0. (Как Вы ожидаете, прерывание деления на 0 будет так же генерироваться, если делитель равен 0).
Как и умножение деление зависит от того, знаковые или беззнаковые операнды используются. DIV используется для беззнаковых операндов, а IDIV - для знаковых операндов. Например,
...
.DATA
TDiv DW 100
...
.CODE
...
MOV AX,-667
CDW ;установить DX:AX в -667
IDIV [TDiv]
...
сохраняет -6 в AX и -67 в DX.