Assembly 装配AT&;T:movq%rdi,%rdx?
AT&T x86主组件 我想翻译汇编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
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的补码整数的绝对值习惯用法。