
- •Конспект лекций по ассемблеру
- •Структурная схема эвм
- •Организация памяти
- •Порты ввода/вывода
- •Сегментация памяти
- •Логические и физические адреса памяти
- •Адресация команд
- •Адресация данных
- •Адресация сегмента стека
- •Перемещаемые программы
- •Структура микропроцессора
- •Назначение регистров микропроцессора
- •Регистр флагов
- •Ассемблер
- •Выражения
- •Структура машинного оператора
- •Директивы ассемблера
- •Директивы определения данных
- •Определение слова
- •Команды и способы адресации операндов
- •Режимы адресации
- •Команда сложения add
- •Команда сложения с переносом adc
- •Команда вычитания sub
- •Imul – команда умножения со знаком
- •Idiv – команда деления со знаком
- •Команда сравнения cmp
- •Команды безусловного перехода jmp
- •1. Короткий относительный переход
- •2. Внутрисегментный переход
- •Команды условных переходов
- •Знаковые
- •Беззнаковые
- •Специальные
- •Способы адресации
- •Двухоперандные команды
- •Косвенная адресация
- •Регистровая адресация
- •Прямая адресация с индексированием
- •Прямая адресация с базированием
- •Адресация по сумме d8 и индексный регистр
- •Адресация по сумме базового регистра и смещения
- •Адресация с базированием и индексированием
- •Прямая адресация с базированием и индексированием
- •Двухоперандная команда, в которой второй операнд непосредственный
- •Формат двухоперандных команд с акумулятором и но
- •Форматы команды inc
- •Форматы команд pop и push
- •Однобайтные команды без операндов
- •Команды передачи данных mov
- •Команда обмена xchg
- •Команда загрузки исполнительного адреса lea
- •Команды управления циклами команда цикла loop
- •Команды переходов loopz, loope
- •Команды вызова подпрограмм call
- •Структура подпрограммы
- •Команды возврата
- •Передача параметров в процедуру
- •Примеры на обработку матрицы
- •Функции ввода/вывода
- •Функция вызова команды int 21h
- •Вывод на экран дисплея
- •Ввод с клавиатуры
- •Процедура ввода числа форматом слово
Idiv – команда деления со знаком
idiv OP – работает аналогично div, но при этом формирует знак частного и знак остатка, которые всегда равны.
Пример:
AX := 14 / (-3)
AX BH
┌───┬───┐ ┌───┐
AL :=│ 00│ 0E│ div │ FD│
└───┴───┘ └───┘
AX BH
┌───┬───┐ ┌───┐
AH :=│ 00│ 0E│ mod │ FD│
└───┴───┘ └───┘
AX
┌───┬───┐
│ FE│ FC│
└───┴───┘
-2 -4
При подготовке к делению знаковых чисел необходимо в регистр AH распространить знаковый разряд регистра AL (деление на байт). При делении на слово знаковый разряд AX необходимо распространить в регистр DX.
Пример:
b
y = -
c
y db ?
b db -4h
c db 2h
; program
mov AL,b
cbw ;расширение байта в слово
idiv c
mov y,AL
CBW – расширение байта в слово
AL = -4
AX
┌┬┬┬┬┬┬┬──────┐
┌────────┐ ┌────────┐
│11111111│ │11111100│
└────────┘ └────────┘
В некоторых случаях подготовка не требуется, если делению предшествует операция умножения:
mov AL,2
imul b
idiv c
mov y,AL
Для подготовки деления на слово используется команда:
CWD – расширение слова в двойное слово
DX AX>0
┌┬─────┬────┐
┌────────┐ ┌────────┐
│00.....0│ │0.......│
└────────┘ └────────┘
Пример:
A^2 - B^3 + 3*C B^3 - X/4
X = --------------- Y = ----------
2*A^2 - C A
sseg segment stack 'stack'
db 64 dup(0)
sseg ends
dseg segment
a db -3
b db 5
c db 2
x db ?
y db ?
dseg ends
cseg segment
assume ss:sseg,ds:dseg,cs:cseg
;Директива assume определяет сегментные регистры
;с помощью которых будет выполняться адресация
;к сегментам программы
lab1 proc far
;главную программу будем оформлять в виде
;дальней процедуры
push ds ; необходимы для
sub ax,ax ; возвращения (mov ax,0)
push ax ; в ДОС.
;++++++++++++++++++++++++++++++++++++++++++++++++++
mov ax,dseg; инициализация
mov ds,ax ; регистра ds
;++++++++++++++++++++++++++++++++++++++++++++++++++
;В регистр DS заносится адрес сегмента
;данных параграфа. В этом случае
;DS установлен на начало сегмента данных
;Две команды, потому что команды mov ds,dseg
;не существует
;При запуске exe-файла ОС в сегментные
;регистры ds и es заносит адрес PSP, т.е.
;эти регистры не инициализированы
;В сегментный регистр ss заносится адрес
;при наличии параметра stack. В нашем
;случае ss инициализирован
;Сегментный регистр cs инициализируется
;всегда ОС.
mov al,a
imul al ;al=a^2
mov bh,al ;a^2->bh
mov al,b
imul al ;al=b^2
imul b ;al=b^3
mov bl,al ;b^3->bl
mov al,3h
imul c ;al=3*c
add al,bh ;a^2+3c
sub al,bl ;a^2-b^3+3c
mov ch,al
mov al,2
imul bh ;2*a^2
sub al,c
mov cl,al ;2*a^2-c
mov al,ch ;\
cbw ; в ax - числитель
idiv cl
mov x,al
;закончено вычисление 1-ой формулы
mov cl,4h
cbw
idiv cl ;x/4
neg al ;-x/4
add al.bl ;b^3-x/4
cbw
idiv a
mov y,al
ret
lab1 endp
cseg ends
end lab1
;Последний end в поле операндов, которое соответствует
;стартовому адресу программы. В данном случае это начало
;процедуры или адрес 1-ой команды программы. Относительно
;начала сегмента этот адрес равен 0, поэтому в регистр IP
;заносится 0.
Если будет указано другое имя, то программа начнет выполняться с команды, адрес которой соответствует этому имени. В этом случае стартовый адрес <> 0.