movq汇编函数

时间:2010-10-04 04:50:14

标签: assembly x86-64 att

我正在阅读一些代码并且不确定这行是做什么的:

movq (%rsp), %rsp

2 个答案:

答案 0 :(得分:29)

movq(假设您正在谈论x86)是四字(64位值)的移动。这条特别的指示:

movq (%rsp), %rsp

看起来非常像将通过堆栈帧向上走的代码。这个特殊指令抓取当前堆栈指针指向的四字,并将其加载到堆栈指针中,覆盖它。

举例来说,这个代码序列(基于实际代码,以及Intel而不是AT& T格式)将从其内容中连续加载堆栈指针,直到超出它的16个字节为0。

576  cmpq    [rsp+0x10],0x0
582  jz      594
588  movq    rsp,[rsp]
592  jmp     576
594  ...

它可能不是堆栈帧行走代码,但它是不寻常的,因为它会为堆栈指针提供不常用的东西。

是不寻常的,因为向上移动堆栈帧通常涉及堆栈指针和基指针,但这通常只是上升一级(即从函数返回)。

对于你想要向上移动多个级别的上面显示的代码类型,在你到达你需要的位置之前使用堆栈指针可能更快,然后关闭基本指针(调用约定通常会推送)更改之前的当前基指针,以便简单的弹出将恢复旧值。)

答案 1 :(得分:12)

这是一个64位值的mov。它的64位是因为" q"在movq中,quad和quad是64位。

可以有其他例子,例如movl,其中l是32位。

但是在movq(%rsp)的情况下,%rsp使用ATT语法..

movq(%rsp),%rsp - > movq称为操作码,(%rsp)称为源或src,%rsp称为目标或dst。

它的作用是在寄存器中查找%rsp获取其值并转到内存[括号"()"表示进入该值的内存值,然后将其分配给%rsp。

虽然两者都是相同的寄存器,但区别在于%rsp的值会发生变化。

EG:假设%rsp的值为22.但%rsp的内存为30.

使用此指令movq(%rsp),%rsp

%rsp的新值是30.再次因为(%rsp)得到%rsp的值,假定为22,然后(%rsp)转到内存值30,然后将其分配给目标上的%rsp ,这是%rsp本身。