x64 汇编里面 popq %rsp 的结果是什么?先把栈顶的 8byte 元素放到%rsp,然后%rsp 里面的值再+8?

2021-01-19 09:38:56 +08:00
 movq

网上找了很多没看到比较有用的信息

1994 次点击
所在节点    程序员
17 条回复
konar
2021-01-19 09:47:06 +08:00
是抛弃栈顶元素?
rdZZZ
2021-01-19 09:54:42 +08:00
用 gcc 编译的么?对%rsp 进行+/-8 的操作,就是出栈入栈的操作。
konar
2021-01-19 09:59:07 +08:00
栈顶元素出栈后又放入栈顶,然后栈顶指针下移,那就是抛弃栈顶元素的意思吧
不过为什么不直接 subq/addq 呢
nifury
2021-01-19 10:09:19 +08:00
只放数据到 rsp,不+8
为什么不 debug 看一眼呢
konar
2021-01-19 10:33:23 +08:00
konar
2021-01-19 10:34:14 +08:00
关于 push/pop %esp 的,pushq/popq %rsp 应该类似
movq
2021-01-19 11:31:44 +08:00
@nifury 因为我不会写汇编,只会看。。。
airqj
2021-01-19 11:49:55 +08:00
楼主专攻汇编吗?
ID 都是为汇编而生啊 :)
movq
2021-01-19 12:13:08 +08:00
@airqj 想不出啥名,注册的时候正在看汇编,就整了个这个,看起来比较 geek
lewis89
2021-01-19 13:59:47 +08:00
一般不会对 rsp 进行 pop/push 操作 至少我看了这么多 gcc 的反汇编 没有遇到过.. fastcall 的约定是 被调用方保护好 调用方的 rbp 指针就行了,rsp 一般都是用完之后 在当前帧返回之前恢复状态就行了 一般都是当前帧一开始 sub rsp, 0x8 然后当前帧返回前 add rsp, 0x8,这 8 个字节栈空间就是当前函数帧存放变量的位置..
6e25h
2021-01-19 16:47:02 +08:00
csapp 我记得有解释过这个东西,记得好像就是 4 楼所说的
Crimilals
2021-01-19 17:08:38 +08:00
Crimilals
2021-01-19 17:11:15 +08:00
@Crimilals If the ESP register is used as a base register for addressing a destination operand in memory, the POP instruction computes the effective address of the operand after it increments the ESP register. For the case of a 16-bit stack where ESP wraps to 0H as a result of the POP instruction, the resulting location of the memory write is processor-family-specific.

The POP ESP instruction increments the stack pointer (ESP) before data at the old top of stack is written into the destination.
irytu
2021-01-19 17:50:43 +08:00
@nifury @6e25h 是的 是在处理器体系结构讲到的,讲流水线的时候这个是个特例拿出来说的,就是重置栈指针
movq
2021-01-19 18:05:17 +08:00
@6e25h 我也记得讲过,但是书太厚了不记得在哪里了,就拿出来问一下
laumm1314
2021-01-20 11:00:24 +08:00
pop 和 push 命令相反
push 把数据压入栈顶,然后 sp 减去机器字节长度
pop 把 sp 加上机器字节,然后数据弹出到目的数
在 amd64 机器上,sp 对应 rsp
popq 中的 q 标识数据宽度是 8 个字节,既是 64 位
laumm1314
2021-01-20 11:02:52 +08:00
栈是向低方向拓展的,所以 rsp 值变大对应栈收缩,rsp 值变小,栈扩大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/746155

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX