Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОНСПЕКТ ЛЕКЦИЙ ПО АССЕМБЛЕРУ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
471.55 Кб
Скачать

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.