为什么死循环加上不跳转呢?谢谢高手.

zhengliyidi 2004-11-30 10:21:18
PRINTCHR MACRO REG1
PUSH DX
XOR DH,DH
MOV DL,REG1
CALL TURE
MOV AH,2
INT 21H
XOR DX,DX
POP DX
ENDM
DIVI MACRO REG1,REG2
MOV AX,REG1
XOR DX,DX
MOV BX,REG2
DIV BX
ENDM
STACK SEGMENT PARA stack
STACK_AREA DW 1000 DUP(?)
STACK ENDS
DATA1 SEGMENT PARA
MULTX DW 3206H
DW 2521H ; x=32062521H
MULTY DW 6400H
DW 0A26H ; y=64000A26H
ORG 1000
RESULT DW 0
DW 0
DW 0
DW 0
TEMP DW 0
FAG DW 0
JMP_TABLE DW LP1,LP2
DATA1 ENDS
CODE SEGMENT PARA
ASSUME CS:CODE,DS:DATA1,SS:STACK
TURE PROC
PUSH CX
XOR CX,CX
MOV CL,9H
CMP DL,CL
JBE LP1
ADD DL,37H
JMP SHORT LP2 ;我在jmp时候,为什么会不跳转呢?而且我这个是一个死循环,让我一直都不明白
POP CX
LP1: ADD DL,30H
LP2: NOP
RET
TURE ENDP
MAIN PROC FAR
MOV AX,DATA1
MOV DS,AX

MOV AX, MULTX+2
MUL MULTY+2
PUSH AX
MOV TEMP,DX ;06 x 21


MOV AX, MULTX
MUL MULTY+2
ADD AX,TEMP
ADC DX,0
PUSH AX
MOV TEMP, DX

MOV AX , MULTX+2
MUL MULTY
POP BX
ADD AX,BX
ADC DX,0
ADD DX,TEMP
ADC FAG,0
PUSH AX
MOV TEMP,DX

MOV AX, MULTX
MUL MULTY
ADD AX,TEMP
ADC DX,0
ADD AX,FAG
ADC DX,0
MOV RESULT+6,DX
MOV RESULT+4,AX
PUSH AX
PUSH DX

MOV CX,0
LP3: INC CX
POP DX
DIVI DX,1000H
PRINTCHR AL
DIVI DX,100H
PRINTCHR AL
DIVI DX,10H
PRINTCHR AL
DIVI DX,1H
PRINTCHR AL
CMP CX,4
JNZ LP3

MOV AH,4CH
INT 21H

MAIN ENDP
CODE ENDS
END MAIN





...全文
169 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
iceuct 2004-12-06
  • 打赏
  • 举报
回复
你用debug调试的时候,注意堆栈数据变化。ret的返回地址是call语句执行时相当与PUSH IP;JMP [LABLE]来构造的。你子程序出问题时注意一下返回地址就可以判断是否平衡堆栈了。还有,你那个CX影响的死循环是CX值与TRUE中的某指令地址相同造成的。否则就出现不可预料的错误。
clumsy 2004-12-05
  • 打赏
  • 举报
回复
两个 Word 相乘, 结果最大范围为 4 个 Word. 那个循环, 一次显示一个 Word 的内容, 所以要 4 次循环才能显示完结果
Knuthocean 2004-12-05
  • 打赏
  • 举报
回复
你当然会死循环啦!!!
你每次判定CMP CX,4
JNZ LP3
而在TURE里面总是将CX清0,故总是跳转
注::::没有认真看你的所有程序,因为没注释,只是怀疑!
Knuthocean 2004-12-04
  • 打赏
  • 举报
回复
基本同意楼上的。
还有你的那个CMP CX,4
JNZ LP3
是什么意思呀?
jk88811 2004-12-04
  • 打赏
  • 举报
回复
同意楼上的!
wxf0204 2004-12-01
  • 打赏
  • 举报
回复
我帮你顶吧,实在太长了,没耐心看哦!你能不能处理一下,把最关键的拿出来?!
z_kai 2004-12-01
  • 打赏
  • 举报
回复
哇,好长的源码啊!
clumsy 2004-12-01
  • 打赏
  • 举报
回复
TURE 子程中堆栈的平衡问题:

TURE PROC
PUSH CX
XOR CX,CX
MOV CL,9H
CMP DL,CL
JBE LP1
ADD DL,37H
JMP SHORT LP2
; POP CX ;* POP CX 放在这里起不到作用的
LP1: ADD DL,30H
LP2: NOP
POP CX ;* 把上面的 POP CX 挪到这里
RET
TURE ENDP
lcstudio 2004-12-01
  • 打赏
  • 举报
回复
問題應該是先前將cx壓棧,而後面的jmp到ret的時候沒有清理多出來的這個word。所以,不知所以的死鎖產生與cx的值有關。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧