汇编中pop和push是成对使用的,如果我只用push不用pop,最后执行时会出现无效命令,求大神指教。

.MODELSMALL.STACK64DIOSPSEGMENTAT40HORG17HKBSTATDB?DIOSPENDS.DATADISSHITEDB'INPUTSHIT... .MODEL SMALL
.STACK 64
DIOSP SEGMENT AT 40H
ORG 17H
KBSTAT DB ?
DIOSP ENDS
.DATA
DISSHITE DB 'INPUT SHITE'
DISCHAR DB 'INPUT CHAR'
DISALT DB 'INPUT ALT'
.CODE
MAIN PROC FAR
MOV AX,DIOSP
MOV ES,AX
MOV BL,ES:KBSTAT
A10:
MOV AH,10H
INT 16H
CMP AL,0DH
JE A50
TEST BL,00000011B
//JZ A30
LEA BP,DISSHITE
CALL DISPLAY

A50:
MOV AX,4C00H
INT 21H

MAIN ENDP
DISPLAY PROC NEAR
PUSH ES
MOV AX,@data
MOV ES,AX
MOV AX,1300H
MOV BX,0017H
MOV CX,11
MOV DX,1520H
INT 10H
RET
DISPLAY ENDP
END MAIN
展开
 我来答
Slayer_nux
推荐于2017-12-16 · TA获得超过793个赞
知道小有建树答主
回答量:226
采纳率:100%
帮助的人:212万
展开全部
典型的堆栈不平衡嘛。这样肯定会有问题,想都不要想。
就像楼上说的,如果在retn前没有平衡堆栈,那么retn的时候,返回地址是错的,程序会跑哪去都有可能。
call的时候会将下一条指令地址压栈,retn的时后会pop一次,弹出之前保存的eip,然后将当前eip的值还原,这样才能实现整个call的正常调用。
如果调用的时候堆栈没平衡好,就比如lz说的push之后忘了pop,那么程序执行retn的时候,还是会认为栈顶是保存的eip值,照样会设置eip的值,这样程序就乱套了,给什么样的错误提示就看系统心情了。
鲲鹏展翅LHY
2014-01-26 · TA获得超过2637个赞
知道小有建树答主
回答量:642
采纳率:0%
帮助的人:967万
展开全部
因为程序中有子程序返回指令RET,它要求出栈的断点应该和你调用CALL时入栈保护的断点一致才能正确返回,这就要求程序中PUSH和POP指令成对出现,否则就会出现错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2014-01-25 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
DISPLAY PROC NEAR

PUSH ES ;ES压栈
……
……

;没有POP

RET ;那就以ES内容,当做返回地址

;出现什么情况,都是可能的。

DISPLAY ENDP
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wgq930
2014-01-25 · TA获得超过2262个赞
知道大有可为答主
回答量:4926
采纳率:51%
帮助的人:1919万
展开全部
必须成对出现,
就如: 出门上班,下班回家.
上/下车;
等等
否则程序无法执行.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式