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

.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

典型的堆栈不平衡嘛。这样肯定会有问题,想都不要想。
就像楼上说的,如果在retn前没有平衡堆栈,那么retn的时候,返回地址是错的,程序会跑哪去都有可能。
call的时候会将下一条指令地址压栈,retn的时后会pop一次,弹出之前保存的eip,然后将当前eip的值还原,这样才能实现整个call的正常调用。
如果调用的时候堆栈没平衡好,就比如lz说的push之后忘了pop,那么程序执行retn的时候,还是会认为栈顶是保存的eip值,照样会设置eip的值,这样程序就乱套了,给什么样的错误提示就看系统心情了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-01-26
因为程序中有子程序返回指令RET,它要求出栈的断点应该和你调用CALL时入栈保护的断点一致才能正确返回,这就要求程序中PUSH和POP指令成对出现,否则就会出现错误。
第2个回答  2014-01-25
DISPLAY PROC NEAR

PUSH ES ;ES压栈
……
……

;没有POP

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

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

DISPLAY ENDP
第3个回答  2014-01-25
必须成对出现,
就如: 出门上班,下班回家.
上/下车;
等等
否则程序无法执行.

汇编中pop和push是成对使用的,如果我只用push不用pop,最后执行时会出现...
call的时候会将下一条指令地址压栈,retn的时后会pop一次,弹出之前保存的eip,然后将当前eip的值还原,这样才能实现整个call的正常调用。如果调用的时候堆栈没平衡好,就比如lz说的push之后忘了pop,那么程序执行retn的时候,还是会认为栈顶是保存的eip值,照样会设置eip的值,这样程序就乱套了,给什么...

汇编语言字符串复制指令?PUSH和POP指令必须成对出现吗?如果不必要那在...
根据我的理解,PUSH和POP并不是非用不可的指令,无非是临时保护一下有可能会被破坏的寄存器数据,你也可以手动将这些数值保存到一个中间暂存的寄存器,等突发事件(通常是中断)过后,再把原来的值取回来,效果一样,但你必须设置一些寄存器来做暂存器。但是用PUSH和POP可以更方便地保存一大堆需要保护的...

汇编 什么时候需要push pop,我见有些代码没有用也没出
push pop 是用来堆栈的。也就是一个寄存器原先有数据,后来又要有新的数据写入,原先的数据又有用处,这时候就要用push pop,先把原先的数据存着,这样有新数据写入原先的数据就不会丢掉,等要用的时候再拿出来。如果只要刷新数据,原先的数据不用了,就不用push pop。

汇编语言PUSH指令会不会把其他程序的空间占用掉?其他指令呢?
PUSH和POP指令必须成对出现,否则出错;在不影响返回后的程序的值,可不需要;一般中断程序都要用到

汇编 什么时候需要push pop,我见有些代码没有用也没出错
push和pop用于变量只是保存数值而已,例如把b的值给c,只能用a传数,就写成 push a a =b c =a pop a 等同于 d =a a =b c =a a =d

汇编push和pop指令
学习使用汇编语言中的push和pop指令进行栈操作,了解栈的基本概念以及这两条指令在栈操作中的作用。push指令用于将寄存器中的数据压入栈中,pop指令则用于从栈中弹出数据到寄存器中。具体操作如下:push寄存器:将指定寄存器的内容压入栈顶。pop寄存器:从栈顶弹出数据到指定寄存器中。下面通过一段汇编代码...

单片机汇编语言中push与pop
只写这么些就问错误原因,其它的怎么写的呢,暂就按这些分析吧 push direct pop 30H 1,这是两条指令,要写成两行 push direct pop 30H 2,在push direct 指令中出现了字符direct,在程序的前面要用伪指令来定义才行的,如 direct EQU 31H; 这个地址要根据你的需要来定义的。

汇编问题 PUSH与POP
push ds pop es 相当于 mov ax,ds mov es,ax push [1234h] ;(我不知道有没有这个写法,)类似的有 mov bx,1234h push [bx]就是"任意两个相邻单元的内容"因为PUSH操作是一次操作两个BYTE的

push和pop的区别是什么?
具体来说,"push" 操作会将一个数据项压入栈顶,通常会将栈顶指针向下移动(递增)。这个数据项可以是任何类型的数据,包括整数、浮点数、字符、指针等等。例如,在汇编语言中,可以使用 "push" 指令将一个寄存器的值压入栈顶。相反,"pop" 操作会从栈顶弹出一个数据项,并将其移除栈顶。通常会将...

在汇编中为什么PUSH CS是正确的?但是POP CS是错误的。
在汇编程序中,通常可以通过PUSH 指令将指定寄存器内容放入堆栈中保护,也可以通过POP指令将堆栈中的内容装入寄存器,而对于代码段寄存器CS,用户程序只有PUSH CS操作,如写出POP CS,编译程序会报错。这是因为随意变更CS寄存器内容,会造成程序跑乱,很可能造成系统瘫痪。在发生程序调用时,保护现场是由CP∪...

相似回答