Приклади розв’язку задач.
Задача1.
Написати програму, яка обчислює арифметичний вираз і результат записує в пам’ять
Z=(X4-16)-(Y2+75)/5,
де X,Y- операнди зі знаком і довжиною в байтах, згідно індексу.
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
X DW 1234h, 5678h
Y DW 9abch
Z DW 3 dup(0)
.CODE
mov ax,@data
mov ds,ax
mov dx,X+2
mov ax,X
sub ax,16
sbb dx,0
push dx
push ax
xor ax,ax
xor dx,dx
mov ax,Y
add ax,75
adc dx,0
mov bx,5
idiv bx
mov bx,ax
pop ax
pop dx
sub ax,bx
sbb dx,0
mov z,ax
mov z+2,dx
mov ah,4Ch
int 21h
end
Процедура яка передбачає, що введений дільник може бути значно менший за ділене і тому використання стандартної команди DIV неможливе. Така процедура повинна використовувати віднімання, поки старша частина діленого не стане меншою ніж дільник (процедура MY_DIV).
Для ділення подвійного слова на слово:
MY_DIV proc
sub cx,cx
sub bx,bx
mov dx,X+2
mov ax,X
M_D1: cmp dx,Y
jl M_D3
sub ax,Y
sbb dx,00
add cx,01
adc bx,0
jmp M_D1
M_D3: div Y
add cx,ax
adc bx,00
ret
MY_DIV ENDP
Тут передбачено, що X(4 байти)- ділене, Y(2 байти) – дільник, результат ділення буде: частка в BX:CX , остача в DX
Для ділення слова на байт:
MY_DIV proc
sub cx,cx
M_D1: cmp ah,bl
jb M_D3
sub al,bl
sbb ah,00
add cl,01
adc ch,0
jmp M_D1
M_D3: div bl
add cl,al
adc ch,00
ret
MY_DIV ENDP
Тут передбачено, що AX(2 байти)- ділене, BL(1 байт) – дільник, результат ділення буде: частка в CX , остача в AH