|
|
|
|
для: Crux
(22.05.2008 в 06:49)
|
| Я знаю TASM и то только для микроконтроллеров, но у меня есть в "заначках" готовое из билиотек и прочего и для "старших собратьев". Вот примеры деления:
;это так
;Если длина источника = байт, то делимое = AX, частное = AL, остаток = AH
;Если длина источника = слово, то делимое = DX:AX, частное = AX, остаток = DX
; ***********************************************
; * Деление длинного целого 32-х битового числа *
; ***********************************************
;
; Вход:
; EDX:EAX - делимое
; ECX - делитель
;
; Выход:
; EDX:EAX - частное
; ECX - остаток
;
_LDIV32 proc far
jecxz LDIV32 ; нулевой делитель
push esi ; сохранить ESI
mov esi,eax ; мл. часть делимого
mov eax,edx ; ст. часть делимого
xor edx,edx ; реально: 0:EDX
div ecx ; EAX - частное, EDX - остаток
xchg eax,esi ; SI - частное
div ecx ; EAX - частное, EDX - остаток
mov ecx,edx ; реальный остаток
mov edx,esi ; ст. часть частного
pop esi ; восстановить ESI
LDIV32: ret ; деление выполнено
_LDIV32 endp
*************
;деление с импользованием цикла и опеpаций add и sub
;=======================================
;= Entry: ax=numerator, cx=denominator =
;= Exit: ax=result, dx=remainder =
;=======================================
Divide proc near
push cx bx ; Save used registers
mov bx,cx
xor dx,dx
Main_Loop:
cmp ax,cx
jb Done
add cx,bx
jc Done
inc dx ; Calculate result
jmp Main_Loop
Done:
sub ax,cx ; Calculate remainder
add ax,bx
xchg dx,ax ; <= result in ax, remainder in dx
pop bx cx ; Restore used registers
retn
Divide endp
|
| |
|
|