网上找了很多没看到比较有用的信息
1
konar 2021-01-19 09:47:06 +08:00
是抛弃栈顶元素?
|
2
rdZZZ 2021-01-19 09:54:42 +08:00
用 gcc 编译的么?对%rsp 进行+/-8 的操作,就是出栈入栈的操作。
|
3
konar 2021-01-19 09:59:07 +08:00
栈顶元素出栈后又放入栈顶,然后栈顶指针下移,那就是抛弃栈顶元素的意思吧
不过为什么不直接 subq/addq 呢 |
4
nifury 2021-01-19 10:09:19 +08:00
只放数据到 rsp,不+8
为什么不 debug 看一眼呢 |
5
konar 2021-01-19 10:33:23 +08:00 1
|
6
konar 2021-01-19 10:34:14 +08:00
关于 push/pop %esp 的,pushq/popq %rsp 应该类似
|
8
airqj 2021-01-19 11:49:55 +08:00
楼主专攻汇编吗?
ID 都是为汇编而生啊 :) |
10
lewis89 2021-01-19 13:59:47 +08:00
一般不会对 rsp 进行 pop/push 操作 至少我看了这么多 gcc 的反汇编 没有遇到过.. fastcall 的约定是 被调用方保护好 调用方的 rbp 指针就行了,rsp 一般都是用完之后 在当前帧返回之前恢复状态就行了 一般都是当前帧一开始 sub rsp, 0x8 然后当前帧返回前 add rsp, 0x8,这 8 个字节栈空间就是当前函数帧存放变量的位置..
|
11
6e25h 2021-01-19 16:47:02 +08:00
csapp 我记得有解释过这个东西,记得好像就是 4 楼所说的
|
12
Crimilals 2021-01-19 17:08:38 +08:00 via iPhone
|
13
Crimilals 2021-01-19 17:11:15 +08:00 via iPhone
@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. |
16
laumm1314 2021-01-20 11:00:24 +08:00
pop 和 push 命令相反
push 把数据压入栈顶,然后 sp 减去机器字节长度 pop 把 sp 加上机器字节,然后数据弹出到目的数 在 amd64 机器上,sp 对应 rsp popq 中的 q 标识数据宽度是 8 个字节,既是 64 位 |
17
laumm1314 2021-01-20 11:02:52 +08:00
栈是向低方向拓展的,所以 rsp 值变大对应栈收缩,rsp 值变小,栈扩大
|