|
主题 : : 实验10除法子程序中sp过小的问题 [待解决] |
回复[ 1次 ]
点击[ 366次 ] | |
荣誉值:0
信誉值:4
注册日期:2009-06-01 21:42 |
这个问题还要多谢zhenglxd指点出来,我把代码贴出来,显示堆栈区长度设置成12个字节,运行没问题,可单步调试出错,然后该成20个字节,一切正常,很想知道为什么!?
DATAS SEGMENT
;此处输入数据段代码
DB 2 DUP(0);保存DX值
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
DB 12 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
;初始化数据段指针
MOV AX,DATAS
MOV DS,AX
MOV SI,0
;初始化堆栈段指针
MOV AX,STACKS
MOV SS,AX
MOV SP,12
MOV BP,12
;F4240H/0AH
MOV AX,4240H
MOV DX,000FH
MOV CX,0AH
CALL DIVDW
MOV AH,4CH
INT 21H
DIVDW:
PUSH AX
PUSH DS
PUSH SI
PUSH DX
PUSH CX
MOV AX,DX
MOV DX,0
DIV CX
;上面计算H/N,商在AX中,余数在DX中
MOV [SI],AX;保存商
;下面算[rem(H/N)*65536+L]/N,其中rem(H/N)存在DX中
MOV AX,[BP-4];取出L,即低16位,
DIV WORD PTR [BP-12];进行32位除法,商在AX,余数在DX
MOV CX,DX ;把余数转移到CX,商放到CX(他也是整个表达式的值得低16位)
MOV DX,[SI];把高16位放到DX
POP CX
POP DX
POP SI
POP DS
POP AX
RET
CODES ENDS
END START
=====================================================================
DATAS SEGMENT
;此处输入数据段代码
DB 2 DUP(0);保存DX值
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
DB 20 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
;初始化数据段指针
MOV AX,DATAS
MOV DS,AX
MOV SI,0
;初始化堆栈段指针
MOV AX,STACKS
MOV SS,AX
MOV SP,20
MOV BP,20
;F4240H/0AH
MOV AX,4240H
MOV DX,000FH
MOV CX,0AH
CALL DIVDW
MOV AH,4CH
INT 21H
DIVDW:
PUSH AX
PUSH DS
PUSH SI
PUSH DX
PUSH CX
MOV AX,DX
MOV DX,0
DIV CX
;上面计算H/N,商在AX中,余数在DX中
MOV [SI],AX;保存商
;下面算[rem(H/N)*65536+L]/N,其中rem(H/N)存在DX中
MOV AX,[BP-4];取出L,即低16位,
DIV WORD PTR [BP-12];进行32位除法,商在AX,余数在DX
MOV CX,DX ;把余数转移到CX,商放到CX(他也是整个表达式的值得低16位)
MOV DX,[SI];把高16位放到DX
POP CX
POP DX
POP SI
POP DS
POP AX
RET
CODES ENDS
END START | | |