将ASM转换为C?
我正在尝试将下面的ASM转换为C,但我无法理解跳转语句在做什么。有人能帮我弄清楚到底发生了什么事吗将ASM转换为C?,c,assembly,64-bit,C,Assembly,64 Bit,我正在尝试将下面的ASM转换为C,但我无法理解跳转语句在做什么。有人能帮我弄清楚到底发生了什么事吗 func_a: .LFB0: .cfi_startproc testq %rdx, %rdx js .L3 movslq %edi, %rdi movslq %esi, %rsi addq %rdi, %rsi cmpq %rdx, %rax jg .L4 rep ret .L3: movl
func_a:
.LFB0:
.cfi_startproc
testq %rdx, %rdx
js .L3
movslq %edi, %rdi
movslq %esi, %rsi
addq %rdi, %rsi
cmpq %rdx, %rax
jg .L4
rep ret
.L3:
movl $0, %eax
ret
.L4:
movq %rdx, %rax
.p2align 4,,4
ret
.cfi_endproc
如果设置了
%rdx
的符号(MSB)(即如果%rdx
为负,js
跳到.L3
)
如果%rax
大于%rdx
(AT&T语法,操作数反转),则jg
跳到.L4
代码符号的其余部分将
%edi
和%esi
扩展到64位,然后将它们相加。跳转的哪一部分不清楚?您是否已阅读说明集参考资料,其中说明了每一项功能?另外,您确定复制的函数正确吗rax
似乎是未初始化的(至少按照标准调用约定)。第一个跳转到。L3
为RDX
为正。如果RDX
大于RAX
@Barmar,则第二个选项转到.L4
。@Barmar您得到了这两个值:)我尝试复制代码,但得到了L4。和L1。相反,@VBoi编译器指定的标签号是不可预测的,生成的确切程序集也是不可预测的。您不能期望从汇编代码中准确地重构源代码,以便编译器将您的重构编译到同一个汇编。