Сборник по задачам и примерам Assembler

           

Деление с учетом знака значения размером 2 байта на значение размером 1 байт



Деление с учетом знака значения размером 2 байта на значение размером 1 байт

:div_sign.asm - программа на ассемблере деления с учетом знака значения

;размером 2 байта на значение размером 1 байт.
:Вход: и - делимое; v - делитель.
:Выход: w - частное, г - остаток.

.data значения в и и v нужно внести

и dw ? ;делимое

v db ? ;делитель

w db О

г db О

.code

div_sign proc

mov ax.u

idiv v сформировать результат:

mov г,ah :остаток



mov w.al ;частное

:если нужно получить модуль - уберите знаки комментария : mov cx.l ;длина операнда ; lea bx.w : call calc_abs ;или ; neg w

ret

div_sign endp main:

call div_sign

end main

Деление чисел большей размерности (4/8 байтов) выполняется аналогично. Необходимо заменить директивы DB на DW/DD, регистр АХ на EAX/EDX:EAX, регистр AL на АХ/ЕАХ, регистр АН на DX/EDX.

Деление N-разрядного беззнакового целого на одноразрядное число размером 1 байт

:div_uns1gn_N_1.asm - программа на ассемблере деления без учета знака значения

:размером N байт на значение размером 1 байт.

;Порядок следования байтов - старший байт по младшему адресу (не Intel) :Вход: и - делимое; v - делитель. :Выход: w - частное, г - остаток.

.data значения в и и v нужно внести

u db ? ;делимое

N=$-u :длина в байтах значения и

v db ? :делитель

w db N dup (0)

г dw 0 :остаток

.code

div_unsign_N_lproc

mov г.О

хог si.si ;j»0

mov cx.N

хог dx.dx

хог bx.bx @@ml: movax.256 основание с.с.

mul г результат в dx:ax

mov bl ,u[si]

add ax.bx

div v сформировать результат:

mov w[si].al :частное

shr ax.8

mov г.ах юстаток в г

inc si

1oop @@ml

ret

d i v_uns i gn_N_lendp main:

call div_unsign_N_l

end main

Сегмент данных может быть задан, например, так:

.data значения в и и v нужно внести

u db 5.6.7 :делимое

N=$-u :длина в байтах значения и

v db 15 ;делитель

w db N dup (0)

г dw 0 :остаток

В программе div_unsign_N_l.asm порядок следования байтов делимого неестествен для микропроцессора Intel. Поэтому на дискете приведен вариант программы div_unsign_N_l_I.asm, в котором эта проблема устранена.

Далее при рассмотрении программы деления многобайтных двоичных чисел нам понадобится макрокоманда divunsignN деления N-разрядного беззнакового целого на одноразрядное число размером 1 байт (порядок следования байтов не характерен для процессоров Intel, то есть старший байт находится по младшему адресу). Текст макрокоманды приведен на дискете.



Содержание раздела