Intel 汇编语言程序设计(第五版)--续二

--堆栈操作:运行时栈在系统层上(由硬件直接实现)处理子过程调用。是由CPU直接管理的内存数组,使用两个寄存器:SS和ESP。堆栈指针寄存器ESP指向最后压入到堆栈上的数据。运行时栈在内存中总是向下增长的(由高地址到低地址)

  压栈PUSH堆栈指针减4.出栈POP堆栈指针加4.

  堆栈指针ESP之下的区域从逻辑上讲是空白的。

  过程内的局部变量在堆栈上创建,过程结束时,这些变量被丢弃。

  调用过程时,通过压栈传递输入值(参数)

  CALL时,CPU用堆栈保存当前被调用过程的返回地址。

--PUSH r/m16

  PUSH r/m32

  PUSH imm32

--POP r/m16

  POP r/m32

--PUSHFD指令在堆栈上压入32位的EFLAGS寄存器的值

  POPFD指令弹出堆栈顶部的值并送至EFLAGS寄存器

  类似的PUSHF和POPF用在实地址模式下,FLAGS寄存器。

  .data

  saveFlags DWORD ?

  .code

  pushfd    ;标志入栈

  pop saveFlags    ;复制到变量

  ......

  push saveFlags   ;将保存的标志入栈

  popfd

--PUSHAD指令在堆栈上按EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI顺序压入所有的32位通用寄存器。

  POPAD以相反顺序从堆栈中弹出。

  类似的实地址模式下的指令:PUSHA和POPA

  保护和恢复寄存器的值。

--在32位模式下,CPU总是执行EIP(指令指针寄存器)所指向的内存地址处的指令;在16位模式下,CPU总是执行IP寄存器所指向的内存地址处的指令。

  CALL指令把返回地址(紧跟CALL指令的地址,CALL指令的机器码需要5个字节,00000020+5)压入堆栈并把被调用过程的地址复制到指令指针寄存器中。

  RET指令从堆栈中弹出返回地址并送到指令指针寄存器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值