Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly movq汇编函数_Assembly_X86 64_Att - Fatal编程技术网

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