什么是堆栈——汇编语言入门

我们所接触到的段寄存器有四种:CS、DS、ES、SS,CS段是代码段,当然是存放代码的段了。DS和ES是存放数据的段。这个SS是堆栈段,什么是堆栈呢?堆栈又有什么用呢?
一、什么是堆栈
堆栈是一种线性表( 什么是堆栈鈥斺敾惚嘤镅匀朊就是像一条线一样存储的序列),堆栈是一种限制的线性表。堆栈只允许在一端进行插入和删除。允许插入和删除的一端称为栈顶(top),另一端称为栈底(button)。堆栈的插入叫做入栈,删除叫做出栈。根据堆栈的特点可知,最先入栈的总是最后出栈的,最后出栈的总是最先出栈的 什么是堆栈鈥斺敾惚嘤镅匀朊
ss段寄存器存储的是堆栈段的基地址,sp则存储堆栈段的栈顶。
注意!堆栈是向低地址生长的 什么是堆栈鈥斺敾惚嘤镅匀朊 什么是堆栈鈥斺敾惚嘤镅匀朊
为什么说栈底并不存在,假设现在sp指向栈底0x1003,如果再出栈(弹出一字节)的话,sp就会指向0x1004,这也可以。
二、堆栈操作
堆栈操作使用了两个指令:push入栈、pop出栈
1、push 操作数
将sp指向前一个字单元(或字节单元),并把操作数放在sp所指的字单元(或字节单元)中。
2、pop 操作数
将sp所指的字单元(或字节单元)中的数据放到操作数中,这时的操作数不能是立即数,只能是寄存器或内存地址,然后让sp指向下一个字单元(或字节单元)。
当然,也可以使用mov指令把sp所指向的数据挪到目的操作数中,只不过不改变sp的值。

现在假设堆栈为(b)的情况,sp指向0x1004,再假设0x1002中存储的数据为0x5555。问题:mov ax, [sp+2]之后,ax中的数据是什么?mov ax,[sp-2]之后,ax中的数据是什么? 什么是堆栈鈥斺敾惚嘤镅匀朊
sp+2指向0x1006(0x1004+0x2),所以ax中的数据是0x1234,同理sp-2指向0x1002,所以ax中的数据为0x5555。 什么是堆栈鈥斺敾惚嘤镅匀朊
三、堆栈的作用
这里只是简单的说明一下:
1、调用函数
2、暂时存储数据
3、保护寄存器数据
调用函数必然会有ip寄存器的变化,有时还需要存储参数,所以用到堆栈。有时为了保护一些暂时数据,使用堆栈无疑再好不过。为了防止函数改变寄存器的值,可以在进入函数时把寄存器入栈,离开函数时把寄存器出栈。
四、进出堆栈的顺序
切忌:先进后出,先出后进。
比如,要在某段指令前把ax和bx寄存器的值保护起来,就是压入堆栈,在这段指令之后再把它们恢复,看看下面的指令哪个对?
(a)
push ax
push bx
.....
pop ax
pop bx
 
(b)
push ax
push bx
.....
pop bx
pop ax
 
(a)是错的,因为先进后出,ax先入栈,应该最后出栈,而(a)执行后,ax和bx的数据就会颠倒。bx后入栈,应该出栈,却存到了ax中,ax先入栈,应该后出栈,却存到了bx中。
事实上,使用这种方法交换两个寄存器的值也不是不行: 什么是堆栈鈥斺敾惚嘤镅匀朊
push ax
push bx
pop ax
pop bx
不过还有更好的方法,以后学习。
 
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值