movq汇编函数

jam*_*tha 22 assembly x86-64 att

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

movq (%rsp), %rsp
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 30

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

movq (%rsp), %rsp
Run Code Online (Sandbox Code Playgroud)

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

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

576  cmpq    [rsp+0x10],0x0
582  jz      594
588  movq    rsp,[rsp]
592  jmp     576
594  ...
Run Code Online (Sandbox Code Playgroud)

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

不寻常的,向上移动堆栈帧通常包括堆栈指针和基址指针,但是这通常只是去上一级(即从一个函数返回).

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


bmm*_*bmm 14

它是一个64位的值mov.它的64位因为movq中的"q"是quad和quad是64bit.

可以有其他示例,例如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本身.