首页
社区
课程
招聘
[原创]win32 汇编入门中应准确掌握的知识(二)
发表于: 2007-8-20 21:40 4488

[原创]win32 汇编入门中应准确掌握的知识(二)

2007-8-20 21:40
4488
堆和栈(heap和stack)篇
一、相同点:
堆(heap)与栈(stack也叫堆栈)都是为了临时储存某些信息而在内存中开辟的一个连续内存块。
二、不同点
1、堆(heap)是树型的数据结构,而栈(stack)是线性的,是一种按后进先出的次序组织的数据结构。
2、堆(heap)是系统中可供程序自由动态分配的内存空间,无法自动释放占用的内存。比如c++中用new TYPE来从堆中取得TYPE类型的一块内

存,用delete删除;而栈可以在程序中自己建立,是系统调用函数时临时分配的内存空间,用来保留一些必要的数据,函数运行后会自动释放

占用的内存。
3、heap一般是动态分配内存,而Stack一般是静态分配内存。例如我们经常使用的 string 类型变量,之所以把 string 变量存储在 Heap 中

,是因为字符串的长度是可变的,无法直接在堆栈中分配内存空间,因为堆栈是静态分配内存的。   
三、操作stack的指令
1、PUSH进栈指令
格式为:PUSH  SRC
执行的操作:(SP)<-(SP)-2 //先将栈顶(高地址)的指针下移2个单位
           ((SP)+1,(SP))<-(SRC) //然后先将高地址位的一个字节放到高地址,接着把较低地址的一个字节放到比它低一个字节的内存单元
例如:

push 1234h
第一步:
操作数 1234h中的12h是高地址位,这与我们的习惯相同,因此,先将栈指针下移一个单元,然后先将12h先入栈顶(即高地址位0008h),在把

栈指针又下移一个单元
|--------|-----------------|-----------------|
|        |                 |        12       |
|--------|-----------------|-----------------|
低 0006          0007             0008       高
                  ↑
               目前的SP
第二步:
然后再把栈指针又下移一个单元,把低地址位入栈到较低的内存单元。
|--------|-----------------|-----------------|
|        |        34         |       12      |
|--------|-----------------|-----------------|
低 0006          0007             0008       高
    ↑
现在的SP

2、POP出栈指令
格式为:POP  DST
执行的操作:(DST)<-((SP+1),(SP))
           (SP)<-(SP)+2
操作过程正好与 push 指令相反,先入操作数再上移栈指针。

push 和 pop 指令常用来中断和函数调用前后的保护和恢复现场,当然并不是只用于这些场合,还可以用于:
比如:我想把获得的句柄另行给个别名什么的,可以用2次mov指令实现:
例如:
mov eax,hWin ;注意:mov 指令不支持直接内存传送,因此,通过2次mov指令用寄存器桥接才能实现,并不是多此一举用2个mov指令
mov hWnd,eax
但也可以用push和pop组合指令实现。
push hWin
pop hWnd
这样的结果就是hWnd就是hWin,当然很有很多在编程中通过这2个指令的组合实现技巧,自己琢磨吧!

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
比如:我想把获得的句柄另行给个别名什么的,可以用mov指令实现,但也可以用push和pop组合指令实现。

这句话容易误导别人认为 mov hWnd,hWin 是正确的
这句是错误的原因:mov 指令的两个操作数不能都是内存地址
2007-8-20 23:43
0
雪    币: 111
活跃值: (61)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
非常感谢"十指紧扣"对我阐述的不严密性提出指正建议,的确如此,我的不严密阐述会误导正在走入这个门槛的爱好者!
2007-8-24 16:00
0
游客
登录 | 注册 方可回帖
返回
//