- •Команды языка ассемблера
- •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. Арифметические команды
Пересылка данных очень важна, поскольку компьютер постоянно пересылает данные из одного места в другое. Не менее важна возможность манипулирования данными, производя над ними арифметические и логические операции. Сейчас мы посмотрим логические и арифметические операции, поддерживаемые микропрцессором Intel.
-
Арифметические операции над целыми двоичными числами.
Микропроцессор может выполнять арифметические команды над двоичными числами без знака и со знаком, а также над десятичными числами без знака (как упакованными, так и не упакованными).
6.1.1 Сложение и вычитание.
Для сложения и вычитания используются инструкции ADD и SUB . ADD прибавляет содержимое операнда- источника (правый) к содержимому операнда приемнике и сохраняет результат в операнде приемнике. SUB работает так же, за исключением того, что он вычитает операнд источника из операнда приемника. Например,
...
.DATA
BaseVAL DW 99
Adjust DW 10
...
.CODE
...
MOV DX,[BaseVAL]
ADD DX,11
SUB DX,[Adjust]
...
В начале в DX загружается значение 99, хранящееся в BaseVAL, затем к нему добавляется константа 11, в результате в DX значение 110, и наконец из DX вычитается значение 10, хранящееся в Ajust. Результат - в DX хранится 100.
ADD и SUB работают с восьми или шестнадцатибитными операндами. Если Вы хотите складывать или вычитать 32-битные операнды, Вы должны разбить операцию на ряд пословных операций и использовать ADC или SBB.
Когда Вы складываете 2 операнда, микропроцессор сохраняет статус во флаге переноса (бит СF в регистре флагов) который указывает, был ли перенос в назначении; это происходит, когда результат сложения был слишком большой, чтобы уместиться в назначении.
ADC аналогичен ADD за исключением того, что он использует флаг переноса, (установленный предыдущим сложением) при вычислении. Когда Вы складываете два значения, которые больше , чем слово, сложите младшие слова вместе, с использованием ADD, затем сложите оставшиеся слова значений, одной или более инструкциями ADC, складывая наибольшие значащие слова последними. Например, следующий код складывает значение типа двойное слово, хранящееся в CX:BX с значением типа двойное слово, хранящееся в DX:AX:
...
ADD AX,BX
ADC DX,CX
...
SBB работает во многом аналогично ADС. Когда SBB выполняет вычитание, она учитывает флаг переноса, который устанавливается во время предыдущего вычитания. Например, следующий код вычитает двойное слово в CX:BX из двойного слова DX:AX:
...
SUB AX,BX
SBB DX,CX
...
Используя ADC и SBB, Вы должны быть уверены, что флаг переноса не изменялся после последнего вычитания или сложения, иначе статус переноса, хранящийся во флаге переноса, будет потерян.