Assembly movq汇编函数
我正在阅读一些代码,不确定这行代码的作用:Assembly movq汇编函数,assembly,x86-64,att,Assembly,X86 64,Att,我正在阅读一些代码,不确定这行代码的作用: movq (%rsp), %rsp movq(假设您谈论的是x86)是四字移动(64位值)。本特别说明: movq (%rsp), %rsp 看起来非常像将遍历堆栈帧的代码。此特定指令获取当前堆栈指针指向的四字,并将其加载到堆栈指针中,覆盖它 举例来说,此代码序列(基于实代码,采用Intel而非AT&T格式)将从堆栈指针的内容持续加载堆栈指针,直到超出其16字节的值为0 576 cmpq [rsp+0x10],0x0 582 jz
movq (%rsp), %rsp
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 ...
它可能不是堆栈帧遍历代码,但这是不寻常的,因为它将为它通常不用于的东西次遍历堆栈指针
这是不寻常的,因为向上移动堆栈帧通常涉及堆栈指针和基指针,但这通常只用于向上移动一个级别(即,从函数返回)
对于上面显示的要向上移动多个级别的代码,在到达需要的位置之前,使用堆栈指针,然后弹出基本指针可能会更快(调用约定通常会在更改当前基本指针之前推送它,这样简单的弹出将恢复旧值).它是一个64位的值mov。它是64位的,因为movq中的“q”是四位的,四位是64位的 也可以有其他示例,例如movl,其中l为32位 但对于movq(%rsp),%rsp使用ATT语法 movq(%rsp),%rsp->movq称为操作码,(%rsp)称为源或src,%rsp称为目标或dst 它所做的是在寄存器%rsp中查找得到它的值并进入该值的内存[括号“()”表示进入内存值],然后将其分配给%rsp 虽然两者都是相同的寄存器,但区别在于%rsp的值发生了变化 例如:假设%rsp的值为22。但是%rsp的内存是30 使用此指令movq(%rsp),%rsp %rsp的新值为30。同样是因为(%rsp)获取%rsp的值,该值为22,然后(%rsp)进入内存值30,然后将其分配给目标上的%rsp,即%rsp本身