Иллюстрированный самоучитель по задачам и примерам Assembler

Деление двоичных чисел

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

.data значения в и и v нужно внести
u db 5.6.7:делимое
N=$-u:длина в байтах значения и
v db 15;делитель
w db N dup (0)
r dw 0:остаток

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

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

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

ПРОГРАММА div_unsign_NM
;----------------------------------------------------------
;div_unsign_NM.asm – программа на ассемблере деления (N+M)-разрядного беззнакового
; целого на число размером N байт
;(порядок – старший байт по младшему адресу (не Intel))
;Вход: U и V – u=um+n-1..+u1u0 – делимое; v=vn-1…v1v0-
;делитель, m – длина делимого;n – длина делителя; b=256 –
;основание системы счисления.
;Выход: q=qmqm-1…q1q0 – частное, r=rn-1…r1r0 – остаток.
;Ограничения: vn-1№0 OR 0ffh; N>1.
;----------------------------------------------------------
masm
model small,c
.data
;значения в u и v нужно внести
u0 db 0;дополнительный старший байт делимого для нормализации
u db 1fh,0c3h,12h,0ffh;делимое
m=$-u;длина в байтах значения u
v0 db 0;для компенсирующего сложения 0vn-1…v1v0
v db 3fh,50h;делитель
n=$-v;длина в байтах значения v
mm=m-n
w db m+1 dup (0);для промежуточных вычислений
q db mm dup (0);частное
qq dw 0;частичное частное;qq db 0
rr dw 0;частичный остаток
r db n dup (0);остаток
d db 0
temp dw 0
temp_r db n dup (0)
borrow db 0;факт заема на шаге D4
k db 0;перенос 0 Ј k < 255
b dw 100h;размер машинного слова
carry db 0
.stack 256
.486
.code
calc_complement_r proc
dec cx
mov si,cx
neg byte ptr [bx][si];дополнение первого байта
cmp byte ptr [bx][si],0;operand=0 – особый случай
jne short $+3
stc;установить cf, так как есть перенос
jcxz @@exit_cycl;для однозначного числа
@@cycl: dec si
not byte ptr [bx][si]
adc byte ptr [bx][si],0
loop @@cycl
@@exit_cycl: ret
calc_complement_r endp
mul_unsign_NM macro u,i,v,j,w
local m2,m4,m6
push si
;очистим w
push ds
pop es
xor al,al
lea di,w
mov cx,i+j
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.