
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Адресация по сумме базового регистра и смещения
MOV [BX+3],AL ;-> аналогично предыдущему способу
MOV BX,[BP+2]
BX:=((BP)+2); <- слово
При такой форме записи адресация по SS, т. е. осуществляется прямое обращение к стеку без использования PUSH и POP.
Задача: по значению элементов массива Х сформировать массив Y, в котором
X[i-1] + X[i+1]
Y[i] = -----------------------
2
i = 2,3 .. n-1
Y[1] = X[1]; Y[n] = X[n]
----------------------------------
X DW 20 DUP(?)
Y DW 20 DUP(?)
N DW ?
----------------------------------
MOV AX,X ; AX:=X[1]
MOV Y,AX ; Y[1]:=X[1]
MOV CX,N
SUB CX,2
MOV SI,2 ;индекс Х[2]
ML: MOV DI,offset Y+2
MOV AX,X[SI-2] ; AX:=X[i-1]
ADD AX,X[SI+2] ; AX:=X[i-1]+X[i+1]
MOV BX,2
CWD
IDIV BX
MOV [DI],AX
ADD DI,2
ADD SI,2
DEC CX
JNZ ML
; после выхода из цикла SI указывает на Х[n], а DI - на Y[n]
MOV AX,X[SI]
MOV [DI],AX
Адресация с базированием и индексированием
(BX)+(DI) = EA
(BP)+(DI) = EA
MOV [BX+SI],AL – одинаковые команды
MOV [BX][SI],AL
d w mod reg r/m
┌───────┬───┬───┐ ┌───┬───┬───┐ команда двухбайтная т. к. нет
│ KOП │ 0 │ 0 │ │ 00│000│000│ смещения
└───────┴───┴───┘ └───┴───┴───┘
Пример использования такой команды – обработка матриц.
A DB 15 DUP(?)
M DW 3 ; число строк
N DW 5 ; число столбцов
; ┌───┬───┬───┬───┬───┐
; │A11│A12│A13│A14│A15│>┐ Пусть BX содержит начальный
; └───┴───┴───┴───┴───┘ │ адрес поля А
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A21│A22│A23│A24│A25│>┐
; └───┴───┴───┴───┴───┘ │;
; ┌───────────────────────┘
; │ ┌───┬───┬───┬───┬───┐
; └>│A31│A32│A33│A34│A35│
; └───┴───┴───┴───┴───┘
MOV BX,offset A
;В дальнейшем BX будем использовать для адресации строк. В
;исходном состоянии BX указывает одновременно на 1-ю строку
;Дельта BX = m * size(элемента)= m * 1; длина строки в байтах
;Начальное значение SI = 0
SUB SI,SI
;SI указывает на текущий элемент строки
;Дельта SI = size(элемента)=1.
;Условно BX соответствует индексу i, а SI - j
Команды MOV [BP+SI],BL
MOV AX,[BP+SI]
выполняются аналогично, но адресуют поля байт или слов в стек.
АДРЕСАЦИЯ С БАЗИРОВАНИЕМ И ИНДЕКСИРОВАНИЕМ + d8
MOV [BX+SI-1],AL
┌───┬───┬───┬───┬───┐
│A11│A12│A13│A14│A15│>┐ Пусть [BX+SI] указывает на элемент
└───┴───┴───┴───┴───┘ │ А22, тогда [BX+SI-1] указывает на
┌───────────────────────┘ элемент А21. Считаем что элементы матрицы
│ ┌───┬───┬───┬───┬───┐ размером один байт.
└>│A21│A22│A23│A24│A25│>┐ Диапазон d8 -> -128..127
└───┴───┴───┴───┴───┘ │;
┌───────────────────────┘
│ ┌───┬───┬───┬───┬───┐
└>│A31│A32│A33│A34│A35│
└───┴───┴───┴───┴───┘
MOV [BX+SI-1],AL
d w mod reg r/m DISPL
┌───────┬───┬───┐ ┌───┬───┬───┐ ┌────┐
│ KOП │ 0 │ 0 │ │ 01│000│000│ │ FF │
└───────┴───┴───┘ └───┴───┴───┘ └────┘
EA = (BX) + (SI) + DISPL
(BX)+(SI)+d8(16) \ работают с DS
(BX)+(DI)+d8(16) /
(BP)+(SI)+d8(16) \ работают с SS
(BP)+(DI)+d8(16) /