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


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



Деление (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

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




- Начало -  - Назад -  - Вперед -