
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Команды управления циклами команда цикла loop
Loop met
┌─────┐
│CX:=n│
└──┬──┘
┌──────>х met:
│ ┌──┴──┐
│ │тело │
│ │цикла│
│ └──┬──┘
│ ┌────┴────┐
│ │CX:=CX-1 │
│ └────┬────┘
│ нет / ^\ да
└────/CX=0\────┐
\ / │
\/ │
v
Команда Loop не проверяет и не изменяет значения флагов, она только уменьшает регистр СХ на единицу и сравнивает последний с нулём.
Пример: подсчитать сумму элементов массива.
x db 10 dup(?)
n dw ?
s dw 0
sub al,al
lea bx,x
mov cx,n
m:
add al,[bx]
inc bx
loop m
mov s,al
Команды переходов loopz, loope
Мнемоники различны, но команда одна и та же:
Loopz met ( Loope met)
┌──────────────┤ MET:
│ ┌──────┴──────┐
│ │тело цикла с │
│ │формированием│
│ │ ZF │
│ └──────┬──────┘
│ ┌──────┴──────┐
│ │ CX := CX-1 │
│ └──────┬──────┘
│ / \ да
│ /ZF=1 \──────────┐
│ \ / │
│ \/ │
│ │ │
│ нет / \ да │
└───────────/CX=0 \─────┬────┘
\ / │
\/ v
Команда имеет дополнительный выход из цикла, по значению ZF=1.
В массиве Х определить первый элемент, значение которого = 5.
X DW 10 DUP (?)
N DW ?
NOM DW ?
;----------------------------
X ┌─────┬─────┬─────┬───────────┬─────┐
│X1=-1│ X2=2│ X3=5│ ......... │ Xn │
└──┴──┴──┴──┴──┴──┴───────────┴──┴──┘
Просмотр массива будет завершен после определения X3 = 5
mov cx,n
mov si,-2
met:
inc si
inc si
cmp [si],5
loopz met
jnz m1 ;в массиве нет элементов равных 5
;SI := (nom-1)*size(x)
;nom:= SI/2 +1
;после выхода из цикла
;SI указывает на исходный элемент
shr si,1
inc si
mov nom,si
jmp kon
m1: ;выдача сообщения 'в массиве нет элементов, равных 5'
КОМАНДЫ ПЕРЕХОДОВ LOOPNZ, LOOPNE содержат дополнительный выход из цикла при ZF=0. С помощью этой команды можно найти первый элемент массива, который <> заданному.
Команд цикла, которые проверяют условия >= и <= нет, для этого случая требуется самостоятельно организовывать доп. выход из тела цикла.