Assembly 装配AT&;T:movq%rdi,%rdx?

Assembly 装配AT&;T:movq%rdi,%rdx?,assembly,x86-64,Assembly,X86 64,AT&T x86主组件 我想翻译汇编 line 1: subq $8, %rsp line 2: movq %r11, (%rsp) line 3: movq %rdi, %rdx line 4: sarq $63, %rdx line 5: movq %rdi,%rax line 6: xorq %rdx,%rax line 7: subq %rdx,%rax line 8: movq (%rsp), %r11 line 9: add $8, %rsp line 10: ret %r11

AT&T x86主组件

我想翻译汇编

line 1: subq $8, %rsp 
line 2: movq %r11, (%rsp)
line 3: movq %rdi, %rdx
line 4: sarq $63, %rdx
line 5: movq %rdi,%rax
line 6: xorq %rdx,%rax
line 7: subq %rdx,%rax
line 8: movq (%rsp), %r11
line 9: add $8, %rsp
line 10: ret %r11
据我所知,%rsp是stackpointer,这里的stackpointer为qword字节创建了8个字节的空间

它在C中会像这样吗

int main() {

    long x;

return 0:
}
我不确定3号线会发生什么。我认为%rdi寄存器进入了%rdx。但这在C代码中会是什么样子呢?在我看来,登记册上没有任何东西


希望有人能帮我走过1-3号线

mov%src_reg,%dst_reg
将src复制到dst。
mov
指令始终是一个副本

RDI保存x86-64 System V调用约定中的第一个整数/指针函数arg


ret%r11
是非法语法。你不可能从反汇编程序那里得到

弹出返回地址后,不接受要添加到RSP的参数或
imm16
。(对于x86-64 System V不使用的被调用方pops约定,main也没有任何堆栈参数;它们都适合于寄存器)


无论如何,
sar
by reg width-1(将符号位广播到所有位)和XOR/SUB看起来像是有符号2的补码整数的绝对值习惯用法

在这个(和其他)调用约定中,返回值以RAX为单位。(或用于EAX中的
int main
。但此函数看起来不像
main
,除非它声明为
long argc
,而不是标准的
int

因此,可能是
long foo(long x)
返回绝对值,并存储到
volatile
本地并从中重新加载。但是IDK为什么编译器会认为
%r11
中有任何有用的东西

它显然是在启用优化的情况下编译的,因为它没有将RBP设置为堆栈指针,而使用GCC或非常旧的clang,因为它使用
sub$8,%rsp
而不是虚拟推送


或者是手写的;这可能是阅读
%r11
的唯一解释。也许是自定义调用约定,而不是x86-64 System V?

对,从这么多代码中,我们不知道最后一行在做什么。如果它是一个函数的开始,
rdi
保存第一个参数,但是
rdx
本身并没有给我们任何关于以后预期用途的信息。PS:您可能在第2行出现了复制粘贴错误,大概是
movq$11,(%rsp)
,这意味着
long x=11在您的C代码中。汇编代码中没有
返回0
。抱歉,Jester,添加了我们需要翻译为C的整个部分。这是作业的一部分,我想(并且希望)自己完成其余部分。所以请不要破坏太多:D它是%r11!登记Sorry什么是“x86主程序集?”我不确定“主程序集”指的是什么。您又犯了一些复制粘贴错误,没有
%rfx
ret%r11
。无论如何,
rdi
是第一个参数,在
main
argc
的情况下,
sar
按reg width-1(将符号位广播到所有位)和XOR/SUB看起来像是有符号2的补码整数的绝对值习惯用法。