一道汇编语言题,望一步一步解释下出栈和入栈到底是怎么进行的,谢谢了

已知(EAX)=123456H (EBX)=01020304H (ECX)=05060108H (SP)=2000H
执行: PUSH EAX
PUSH AX
POP BX
PUSH EBX
PUSH CX
POP EAX
POP CX
后,各寄存器的值分别为多少

关于上次对您的提问表示歉意!
因为在画堆栈图时把AX当成EAX了,在此表示歉意。
对你的回复已做了相应的更正,望即时查看。

首先,明白EAX是32位的寄存器,AB是16位的寄存器。分别需要4字节、2字节的堆栈空间。知道这个方便我们计算SP的值。sp是16位的。

一般是没有这样的代码的!在有EAX的系统中高位为AH低位为AL,不过没有关系,系统也会认识,这就是windows的向下兼容。ax是早期的16的操作系统用的,EAX是现在大家用的XP,还有64位的WIN7.

按您的意思....
代码分析如下:
PUSH EAX 入栈EAX,需4字节,故SP-4 00123456H入栈
PUSH AX 需2字节,故SP-4-2 00123456h ,入栈3456H 。
POP BX 废弃2字节,故SP-4-2+2 00123456 3456,出栈3456H,BX=3456H,EBX=0102 3456H
PUSH EBX 入栈EBX,需4字节,故SP-4-2+2-4 00123456 入栈 01023456H
PUSH CX 需2字节,故SP-4-2+2-4-4 00123456 01023456 入栈0108H
POP EAX 废弃2字节,故SP-4-2+2-4-4+4 00123456 01023456 0108 出栈34560108 AX=0108H,EAX =34560108H
POP CX 废弃2字节,故SP-4-2+2-4-4+4+2 00123456 0102 出栈0102 CX=0102H ECX=05060102H
因而 EAX=34560108H
EBX=01023456H
ECX=05060102H
SP=1FFAH
不要看答案,照我的思路计算下来就对了。
POP AX,出栈2字节,PUSH AX,入栈2字节,POP EAX 出栈4字节,PUSH EAX ,入栈4字节。
SP就是根据这个来变化的。

不管你采纳谁的答案,希望你采纳一个,这样才有人想帮您。
也希望这些能对你有一些帮助。上一个问题即时查看。
汇编是一门比较贴近硬件的语言。如果有机会查看相关书籍不要错过。盲目的学,会浪费你不少的时间。比如,堆栈究竟是什么?数据究竟怎么存放?为什么要这样放....Win32下可不像Win16..也许换个系统你就不会了.加油!
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-06
更具从上到下的顺序,如下:
第一步将EAX(123456)压入栈顶;
又将AX压入栈顶;
出栈数据到BX(AX);
将EBX(01020304)压入栈,此时是第二层;
又将CX压入栈(三层);
出栈数据到EAX(CX);
出栈数据到CX(01020304);
各寄存器值EAX(CX);(EBX)=01020304H ;(ECX)=05060108H ;SP(2000H-1);AX不变;
BX(AX);CX(01020304H)追问

第一次出栈时,栈顶是AX,把栈顶的内容送到BX,BX在哪,这点我不明白,到底是怎么回事啊,谢谢

相似回答