logo search
Pract / Prakt4

Приклади розв’язку задач.

Задача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