我正在读一些代码,不知道这是什么线做:

movq (%rsp), %rsp
有帮助吗?

解决方案

movq(假设你在谈论86)是一个四字(64位值)的举动。这个特定的指令:

movq (%rsp), %rsp

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

举例来说,这个代码序列(基于真实代码,并在英特尔宁可AT&T格式)超越它是0将不断加载从其内容的堆栈指针,直到该值的16个字节。

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

这是可能的它可能不是堆栈帧行走代码,但它是不寻常,因为它会被贿买堆栈指针的东西它不是通常用于

它的就是不寻常的,向上移动堆栈帧通常包括堆栈指针和基址指针但是这通常只是上升一个等级(即,从功能的返回)。

对于上面要移多个级别,显示排序的代码,它可能更快只使用堆栈指针,直到你得到你需要要,然后在弹出的基指针关闭然后(调用约定往往会推改变它之前,在当前的基指针,使得简单的流行将恢复旧值)。

其他提示

有一个64位的值MOV。其因为在MOVQ所述的“q”,这是四和四的64位为64bit。

有可以是其他例子如MOVL其中L为32位。

但在MOVQ(%RSP)的情况下,使用ATT语法%RSP ..

在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本身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top