强大的栈啊(1)

什么是栈

对于栈的研究:栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于
最后进入这个空间的数据,最先出去
栈如果化为具体的事物理解我们可以想象栈就是水桶,我们将水到入桶底,如果我们需要用水,那也只能从最上面用
这里我们用一下王爽汇编书的图
在这里插入图片描述CPU提供的栈的机制
现今的CPU中都有栈的设计

PUSH入栈 POP出栈(指令)

这里直接用例子来描述
Ag:
设将10000H~1000FH内存当作栈来使用
mov ax 0123
push ax
mov bx,2266
push bx
mov cx,1122
push cx
pop ax
pop bx
pop cx
如图执行push ax
在这里插入图片描述
再执执行push bx
在这里插入图片描述
在执行push cx 后
在这里插入图片描述在执行pop ax后 ax=1122
依次下去,最后空栈
注意空栈后其实数据还在,只是下一次写入push可以将其覆盖

问题

1.CPU如何知道一段内存空间被当作栈使用?
8086CPU中栈段寄存器SS
栈顶寄存器SP
ss:sp(段地址:偏移地址)
2.执行push和pop的时候,如何知道哪个单元是栈顶单元?
ss:存放栈顶的段地址
sp:存放栈顶的偏移地址
任意时刻,ss:sp指向栈顶元素
push ax的执行,由以下两步完成
(1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新栈顶;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
pop则和push相反
再次强调高字节,低字节

栈的操作

mov ax,1000
mov ss,ax
mov sp,0010
在之前的博客中说到段寄存器无法直接mov进入数据,同样这里的ss也是属于段寄存器所以只能这样写
当执行完上面指令时,我们看看此时的栈(栈空时)

在这里插入图片描述除此我们也可以发现可以通过栈,push和pop将不同寄存器的内容进行交换

栈顶超界问题

如上图如果我们继续push或者pop下去,则会超出我们所规定的栈的空间
,这是很危险的!
栈空和栈满都是超界
CPU不会保证栈的超界问题,电脑无法解决,只有程序员知道
为了防止超界问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界问题;防止出栈时栈空了仍然继续出栈而导致的越界

我提一下,对于pwn来说会运用栈的溢出来寻找漏洞,通常如果没有栈的溢出,可以创造栈的溢出从而找到漏洞,或者去实现恶意的代码。

小结

push和pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指出的。与C语言的指针类似

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Back~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值