
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Команда сложения с переносом adc
ADC ОР1,ОР2
OP1 OP2 OP1 := OP1 + OP2 + CF
| |
v v
┌──┐ ┌───┴──┐ ┌─┴────┐
│СF│<- └┐ └─┘ ┌┘
└──┘ └┐ СУММАТОР ┌┘<────┐
│ └─────┬─────┘ │
│ │ │
└─────────────┼────────────┘
V
При этом новые значения флагов формируются точно также. Команда используется для сложения полей, превышающих слово, например двойное слово.
┌─────┬─────┐
+ └──┴──┴──┴──┘
┌─────┬─────┐
└──┴──┴──┴──┘
-----------------------------
┌─────┬─────┐ ┌─────┬─────┐
└──┴──┴──┴──┘ └──┴──┴──┴──┘
│ ┌──┐ │
└─┤СF├─┘
└──┘
A DD ?
B DD ?
C DD ?
MOV AX,word ptr A ; младшее слово
ADD AX,word ptr B ; 1-е сложение
MOV word ptr C,AX ; выполнено сложение младших слов
; полей
MOV AX,word ptr A+2; старшее слово
ADC AX,word ptr B+2; 2-е сложение
MOV word ptr C+2,AX; результат сложения в С
Этот пример показывает, как в 16-разрядной машине производится сложение операндов LONGINT.
Команда вычитания sub
SUB OP1,OP2
OP1:=OP1-OP2
В обычном процессоре отсутствует вычитатель, и поэтому к первому операнду прибавляется второй с противоположным знаком ==>
OP1:=OP1+(-OP2)
SUB AL,BL
AL=5=05h= 0.0000101b
BL=18=12h=0.0010010b
| изменение знака
V
OF SF ZF AF PF CF 1.1101110b
┌──┬──┬──┬──┬──┬──┐ 0.0000101b
│ 0│ 1│ 0│ *│ 1│ 0│ ----------
└──┴──┴──┴──┴──┴──┘ 1.1110011b дк
----------
1.0001101b пк = -13
Все флаги формируются по правилу сложения чисел со знаком.
КОМАНДА ВЫЧИТАНИЯ С ЗАЁМОМ SBB
SBB OP1,OP2
OP1:=OP1-OP2-CF
Используется для вычитания чисел, длина которых превышает слово.
КОМАНДА ВЫЧИТАНИЯ DEC
DEC OP ; однооперандная
OP := OP – 1; алгоритм
Команда формирует все флаги, кроме флага переноса CF (не определен).
КОМАНДА NEG
NEG OP
OP := –OP – инвертирует операнд
КОМАНДА СЛОЖЕНИЯ INC
INC OP
OP := OP + 1
Команда формирует все флаги, кроме флага переноса CF (который не определён).
MUL – беззнаковое умножение
mul OP───┬──>регистр
└──>ячейка памяти
mul 5 – недопустимая команда
В команде явно присутствует второй операнд, по умолчанию первый операнд – регистр AL или AX.
Использование непосредственного операнда запрещено, т. к. неизвестно, какая должна быть у него длина (8 или 16 бит).
mul BH ┌───┐
------ └───┘AL
;AX := AL * BH * ┌───┐
└───┘BH
─────────
┌───┬───┐
└───┴───┘AX
mul BX ┌───┬───┐
------ └───┴───┘AX
* ┌───┬───┐
;(DX:AX) := AX * BX └───┴───┘BX
──────────────────
┌───┬───┐┌───┬───┐
└───┴───┘└───┴───┘
DX AX
Пусть мы имеем два максимальных двузначных десятичных числа
99 * 99 = 9801
Перемножение двузначного на двузначное дает число не более четырёх цифр.
Диапазон байта 0..255
0..(28 - 1)
(28 - 1) * (28 - 1) = 65025 < (216 - 1),
а диапазон слова: 0..65535, 0..(216 - 1)
(216 - 1)* (216 - 1) = 4294836225<(2^32 - 1).
Т. к. при умножении формируется результат удвоенной длины, то физическое переполнение невозможно.
Однако именно в команде умножения формируются синхронно два флага CF и OF. Значение '1' определяет ситуацию переполнения, которая сигнализирует о том, что значение произведения превышает длину исходных операндов.
Пример: ┐
AL=25│
* ├─0..255
BH=25│
┘
───────
AX=625
┌───┬───┐
│ 02│ 71│-> CF=1, OF=1
└───┴───┘
Обычно при выполнении вычислений используются операнды одной длины. Если это байты, тогда если при умножении не возникает переполнения, то в качестве результата можно использовать его младшую половину.
15 * 15 = 225 = E1h
┌───┐
│ 0F│AL
└───┘
* ┌───┐
│ 0F│BH
└───┘
─────────
┌───┬───┐
┌──│ 00│ E1│AX
│ └───┴───┘
V └─┬─┘
OF=0 └──────>результат в AL
CF=0
Все остальные флаги в команде формируются хаотично.