Board logo

标题: [分享] 汇编基础一日一学习6 [打印本页]

作者: 柔肠寸断    时间: 2009-5-21 00:55     标题: 汇编基础一日一学习6

    大家好,今天我们来讲解一下栈的延伸,“堆栈”。算是把昨天的整个理论基础概念,给大家讲解下。

   运行时栈(RUNTIME stack)--我们通常称为“堆栈”,这是由我们cpu硬件直接支持的,也是实现过程的调用和过程返回机制的基本组成部分。

    不知道大家是否知道RTL是什么意思。如果学过程序的人都应该知道这个就是运行时库,它是我们程序运行时必须的库。例如我们BCB中的VCL RTL。我们的bcb程序必须依赖vcl的运行时库。
     
    堆栈是由我们cpu直接管理的内存区域(也可以形容其数组,因为它的确有相似数组的特性)。其实大家昨天已经感受到了堆栈的特性。就是“后进先出,向下扩展”的特性。

     
堆栈的用途:

1.寄存器在用做多种用途的时候,堆栈可以方便的作为临时保存区域。在寄存器使用完毕后,可恢复其原始值。
2.调用子程序的时候放过程返回的地址。

3.子程序的局部变量在堆栈中创建,结束时,变量丢弃

4.调用子程序的时候,可以通过堆栈传输输入值。


昨天已经讲解了push pop指令。
push 压栈  相应的esp寄存器-4,如果是实模式-2
pop  出栈  相应的esp寄存器+4,如果是实模式+2

从以上我们就可以认识到堆栈的向下扩展的特性。因为压入堆栈,相应的esp减少,那么表示我们的堆栈往下扩展。


今天还要介绍两个与堆栈相关的汇编指令。pushad popad pusha popa

  pushad是将我们所有的32位通用寄存器压入堆栈,popad则是将我们所有的32位通用寄存器按压入时候相反的顺序取出堆栈。一般用于子程序保存但前的环境,例如我们的子程序需要修改一些寄存器的值,我们就可以用这个先保存,等子程序结束后,将其所有的备份的寄存器值在恢复,这样就不会破坏其他子程序运行的情况。
   
  这两个指令,在免杀方面比较常用。相信看过免杀课程动态恢复数据段ASCII字符串的朋友都应该知道。

pusha是将我们所有的16位通用寄存器压入堆栈,popa同理是将我们所有的16通用寄存器取出堆栈。


由于今天主要是为了把上节课程做一个补充的,所有的内容就这么多。堆栈到这里我们基本就讲解完了。其实我们只要理解了它的特性即可。。

小作业:

  1. push指令是否能使用立即数。
   
  2. pushad , popad 、pusha popa都是将哪些寄存器压入堆栈。分别列举。

  3. 举出一个例子来描述堆栈“后进先出,向下扩展”的特性,说明自己的观点。。

作者: cheng2102    时间: 2009-5-28 10:51

知道哥你开讲汇编 知道的太晚了
先贴到WORD消化下这十几天的了...
作者: EndTo偌枫    时间: 2009-5-29 07:54

学习了 LZ辛苦了
作者: plantseth    时间: 2009-5-29 19:33

这几天在看汇编,不过内容是8086的。
跟现在讲的有点脱节
作者: 自在飞花    时间: 2009-6-3 20:50

1. push指令是否能使用立即数。
   这个不清楚,语法中应该有规定。
  2. pushad , popad 、pusha popa都是将哪些寄存器压入堆栈。分别列举。
通用寄存器eax  ecx edx ebx          ax bx cx dx
  3. 举出一个例子来描述堆栈“后进先出,向下扩展”的特性,说明自己的观点。。
没学过编程,没有例子。
作者: scien    时间: 2009-6-7 18:53

难理解啊 看汇编书去
作者: hkhs615    时间: 2009-12-17 16:19

学习.................
作者: kisaly    时间: 2011-8-2 16:33

不错,学习了 啊!




欢迎光临 【3.A.S.T】网络安全爱好者 (http://3ast.com./) Powered by Discuz! 7.2