+ -
当前位置:首页 → 问答吧 → 80386汇编中PUSH和PUSHA问题

80386汇编中PUSH和PUSHA问题

时间:2011-12-19

来源:互联网

我看的是杨季文的80386汇编,书中有几个地方我不理解(下面是书中的原文)
1、在调用通过堆栈传递入口参数的子程序时,把立即数直接压入堆栈操作能方便地把常量作为参数传递给子程序。
  PUSH 0F000H ;压入立即数
  PUSH 0 ;压入立即数
  CALL ECHOBD ;调用子程序
  ADD SP, 4 ;平衡堆栈

  这个最后一行的把SP加4平衡堆栈是什么意思

2、当用PUSH指令把堆栈指针SP或ESP压入堆栈时,80386/80286的处理方式不同于8086/8088.8086/8088是将SP减2后的值进栈,而80386/80286是将进栈操作前的SP(ESP)值入栈。

  这句话什么意思

望高手帮帮菜鸟我,谢谢各位

作者: redhat0921   发布时间: 2011-12-19

引用楼主 redhat0921 的回复:
我看的是杨季文的80386汇编,书中有几个地方我不理解(下面是书中的原文)
1、在调用通过堆栈传递入口参数的子程序时,把立即数直接压入堆栈操作能方便地把常量作为参数传递给子程序。
PUSH 0F000H ;压入立即数
PUSH 0 ;压入立即数
CALL ECHOBD ;调用子程序
ADD SP, 4 ;平衡堆栈

这个最后一行的把SP加4平衡堆栈是什么意思

……

(1)调用函数传递和使用参数有C方式、pascal方式和stdcall方式
其中c方式是将参数从右向左压栈(最右边的第一个压栈,最左边的最后一个压栈),被调用函数任务完成后,
不平衡栈,而是由调用者平衡。你的程序就是这样的。
(2)那都说的那么明白了,你怎么就不能明白呢?不就是压栈的内容调整了一下吗。比如:
push ax ,是sp先减2,然后将ax压栈,sp指向压栈的值
那push sp该怎么压栈呢?如果sp没压栈时的值是100,那push sp后,esp=98,可是压进栈的那个值是100呢还是98呢?你的那句话就是解决这个问题,以前是压的98,以后改为压100。


作者: gsy999   发布时间: 2011-12-19

2个参数,2个word = 16*2 = 32 ,所以是add 4,相当于push 2次

作者: mydo   发布时间: 2011-12-19

引用 1 楼 gsy999 的回复:
引用楼主 redhat0921 的回复:
我看的是杨季文的80386汇编,书中有几个地方我不理解(下面是书中的原文)
1、在调用通过堆栈传递入口参数的子程序时,把立即数直接压入堆栈操作能方便地把常量作为参数传递给子程序。
PUSH 0F000H ;压入立即数
PUSH 0 ;压入立即数
CALL ECHOBD ;调用子程序
ADD SP, 4 ;平衡堆栈

这个最后一行的把SP加4……

up

作者: yh_no_code   发布时间: 2011-12-19