V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
movq
V2EX  ›  程序员

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

  •  
  •   movq · 2021-01-19 09:38:56 +08:00 · 2221 次点击
    这是一个创建于 1406 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    17 条回复    2021-01-20 11:02:52 +08:00
    konar
        1
    konar  
       2021-01-19 09:47:06 +08:00
    是抛弃栈顶元素?
    rdZZZ
        2
    rdZZZ  
       2021-01-19 09:54:42 +08:00
    用 gcc 编译的么?对%rsp 进行+/-8 的操作,就是出栈入栈的操作。
    konar
        3
    konar  
       2021-01-19 09:59:07 +08:00
    栈顶元素出栈后又放入栈顶,然后栈顶指针下移,那就是抛弃栈顶元素的意思吧
    不过为什么不直接 subq/addq 呢
    nifury
        4
    nifury  
       2021-01-19 10:09:19 +08:00
    只放数据到 rsp,不+8
    为什么不 debug 看一眼呢
    konar
        6
    konar  
       2021-01-19 10:34:14 +08:00
    关于 push/pop %esp 的,pushq/popq %rsp 应该类似
    movq
        7
    movq  
    OP
       2021-01-19 11:31:44 +08:00
    @nifury 因为我不会写汇编,只会看。。。
    airqj
        8
    airqj  
       2021-01-19 11:49:55 +08:00
    楼主专攻汇编吗?
    ID 都是为汇编而生啊 :)
    movq
        9
    movq  
    OP
       2021-01-19 12:13:08 +08:00
    @airqj 想不出啥名,注册的时候正在看汇编,就整了个这个,看起来比较 geek
    lewis89
        10
    lewis89  
       2021-01-19 13:59:47 +08:00
    一般不会对 rsp 进行 pop/push 操作 至少我看了这么多 gcc 的反汇编 没有遇到过.. fastcall 的约定是 被调用方保护好 调用方的 rbp 指针就行了,rsp 一般都是用完之后 在当前帧返回之前恢复状态就行了 一般都是当前帧一开始 sub rsp, 0x8 然后当前帧返回前 add rsp, 0x8,这 8 个字节栈空间就是当前函数帧存放变量的位置..
    6e25h
        11
    6e25h  
       2021-01-19 16:47:02 +08:00
    csapp 我记得有解释过这个东西,记得好像就是 4 楼所说的
    Crimilals
        12
    Crimilals  
       2021-01-19 17:08:38 +08:00 via iPhone
    Crimilals
        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.
    irytu
        14
    irytu  
       2021-01-19 17:50:43 +08:00
    @nifury @6e25h 是的 是在处理器体系结构讲到的,讲流水线的时候这个是个特例拿出来说的,就是重置栈指针
    movq
        15
    movq  
    OP
       2021-01-19 18:05:17 +08:00
    @6e25h 我也记得讲过,但是书太厚了不记得在哪里了,就拿出来问一下
    laumm1314
        16
    laumm1314  
       2021-01-20 11:00:24 +08:00
    pop 和 push 命令相反
    push 把数据压入栈顶,然后 sp 减去机器字节长度
    pop 把 sp 加上机器字节,然后数据弹出到目的数
    在 amd64 机器上,sp 对应 rsp
    popq 中的 q 标识数据宽度是 8 个字节,既是 64 位
    laumm1314
        17
    laumm1314  
       2021-01-20 11:02:52 +08:00
    栈是向低方向拓展的,所以 rsp 值变大对应栈收缩,rsp 值变小,栈扩大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5678 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:08 · PVG 17:08 · LAX 01:08 · JFK 04:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.