好吧。。由于我对于公式的笨蛋理解。。把几行可以搞定的代码型成好几十行才搞定。。- -!
这是在本论坛看了,理解后的。。。非常感觉这个地方呀。让我学习到很多~
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 bx
push ax ;低位入栈保存
;构造高位除法
mov ax,dx
mov dx,0
div cx ;除法运算后,dx存放高位的余数,ax 存入高位的商
mov bx,ax ;将高位商存入bx
pop ax ;低位出栈, 此时dx中存放着高位除法运算后的余数
div cx ; 运算后,ax存放着低位的商,dx存放着低位的余数.-->即为整个除法运算的余数
mov cx,dx ;将余数存入cx
mov dx,bx ;高位商存入dx
;寄存器恢复
pop bx
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
[ chinatree 发表于 2011-07-29 19:41 ]
顶了
[ qingpengchen2011 发表于 2011-07-29 20:43 ]
呵呵~谢咯
[ 游客 发表于 2011-08-02 17:36 ]
恩,这个地方十分适合学习。
[ qingpengchen2011 发表于 2011-08-03 14:47 ]
~嗯~呵