assume cs:code,ss:stack
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,4241h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
; the divdw
; 功能:进行不会产生除法溢出的运算,被除数为dword型,除数为word型,结果为dword型
;参数:(ax)=dword型数据的低16位
; (dx)=dword型数据的高16位
; (cx)=除数
;返回值 :(dx)=结果的高16位,(ax)=结果的低16位 (cx)=余数
divdw:
;各种寄存器的保存
push es
push si
push bx
push di
push bp
;将被除数低位存入si
mov si,ax
;构造除数16位,被除数32 被除数为 H
mov ax,dx
mov dx,0
;进行除数运算,并将得到的商及余数入栈
div cx
push ax ;商入栈
push dx ;余数入栈
;将余数出栈,做乘法运算加上L,除去N,并将高位保存在bx,低位保存在DI
mov bp,sp ; 保存栈顶指向余数的地址
pop ax
mov bx,65535
mul bx
add ax,[bp] ;再次加上余数
adc dx,0
add ax,si ;将低位加上
adc dx,0 ; 以免加法有溢出
div cx
;数值的保存
mov es,dx ;es中保存高位.即后式的余数
mov di,ax ;di保存低位,即商
;将商出栈,并做乘法运算, 同时加上在BX,DI中的值,后得到最终结果返回
mov bp,sp ;保存指向栈的商的地址
pop ax
mul bx
add ax,[bp] ;再次加上商
adc dx,0
;加上后式的商
add ax,di
adc dx,0
mov cx,es ;后式的余数移入cx
; pop cx ;余数的出栈
;出栈寄存?
pop bp
pop di
pop bx
pop si
pop es
ret
code ends
end start
- [qingpengchen2011] 我的子程序是没错的,我在想是不是虚拟机的问题 08/08 12:17
- [qingpengchen2011] 嗯~行。我再认真详细看看,谢谢咯 08/08 10:38
- [tomato] 我运行了,不是地址的问题。也没有出现崩溃的现象,不过有的子程序功能好像不太对。子程序书中都有,建议你 08/07 22:07
- [tomato] 还是不行吗?我帮你看一下。 08/07 21:29
- [qingpengchen2011] table等标志的值都是在此安装程序中的偏移地址,所以那些子程序等等的地址都是要重新计算的。这点我倒 08/07 18:10
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [tomato] 结果也贴上来晾凉吧。 08/05 23:49
- [tomato] 我看不是死循环的问题,是子程序入口地址错了。告诉你一个解决思路,就是单步跟踪读取子程序地址那个地方, 08/05 23:45
- [tomato] 很有可能是你程序的问题,检查一下是不是死循环了。 08/05 23:41