2010-10-04 56 views

回答

21

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

movq (%rsp), %rsp 

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

通过示例的方式,该代码序列(基于真实代码,并在英特尔宁可AT &Ť格式)超越它是0。

将不断从加载其内容的堆栈指针,直到该值的16个字节
576 cmpq [rsp+0x10],0x0 
582 jz  594 
588 movq rsp,[rsp] 
592 jmp  576 
594 ... 

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

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

对于上面想要向上移动多个层次的代码,使用堆栈指针可能会更快,直到您到达需要的位置,然后关闭基本指针(常常调用约定在改变它之前推动当前的基本指针,这样一个简单的弹出将恢复旧值)。

+0

这当然是64位的,因为RSP寄存器只存在于64位(在IA32体系结构上,我不记得使用RSP的另一种体系结构)。它的目的分析听起来也很合理。 – Zooba 2010-10-04 05:32:37

9

这是一个64位值mov。它的64位因为movq中的“q”是四和四位,所以它是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本身。