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

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

rep stosb
;m1
mov bx,j-1;j=0..m-1
mov cx,j
m2:
push cx;вложенные циклы
cmp v[bx],0
je m6
;m3
mov si,i-1;i=0..n-1
mov cx,i
mov k,0
m4:
mov al,u[si]
mul byte ptr v[bx]
xor dx,dx
mov dl,w[bx+si+1]
add ax,dx
xor dx,dx
mov dl,k
add ax,dx;t=(ax)? временная переменная
push dx
xor dx,dx
div b;t mod b
mov ah,dl
pop dx
mov k,al
mov w[bx+si+1],ah
;m5
dec si
loop m4
mov al,k
mov w[bx],al
m6:
dec bx
pop cx
loop m2
pop si
endm
sub_sign_N macro minuend,deduction,N
local cycl,m1
;старший байт по младшему адресу
push si
mov cl,N
mov si,N-1
cycl: mov al,deduction[si]
sbb minuend[si],al
; jnc m1
; neg minuend[si]
m1: dec si
loop cycl
pop si
endm
add_unsign_N macro carry,summand_1,summand_2,N
local cycl,end_p
mov cl,N
mov si,N-1
cycl: mov al,summand_2[si]
adc summand_1[si],al
dec si
loop cycl
jnc end_p
adc carry,0
end_p: nop
endm
div_sign_N macro u,N,v,w,r
local m1
;старший байт по младшему адресу
mov r,0
lea si,u;j=0
xor di,di;j=0
mov cx,N
xor dx,dx
xor bx,bx
m1: mov ax,256;основание с.с.
mul word ptr r;результат в dx:ax
mov bl,[si]
add ax,bx
div v
;сформировать результат:
mov w[di],al;частное
mov r,ah;остаток в r
inc si
inc di
loop m1
;если нужно – получим модуль (уберите знаки комментария)
; mov cx,N;длина операнда
; lea bx,w
; call calc_abs_r
endm
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.