我必须从C程序集中逆向转换C语言中的switch语句。当我编译使用-S标志来从我写到C的汇编代码,这是不正确的。任何有关我在做什么错误的见解?逆向工程C语言中的switch语句来自x86程序集
在此先感谢!
这是大会
.file "switch_prob-soln.c"
.text
.globl switch_prob
.type switch_prob, @function
switch_prob:
.LFB0:
.cfi_startproc
subq $50, %rsi
cmpq $5, %rsi
ja .L2
jmp *.L7(,%rsi,8)
.section .rodata
.align 8
.align 4
.L7:
.quad .L3
.quad .L2
.quad .L3
.quad .L4
.quad .L5
.quad .L6
.text
.L3:
leaq 0(,%rdi,4), %rax
ret
.L4:
movq %rdi, %rax
sarq $2, %rax
ret
.L5:
leaq (%rdi,%rdi,2), %rdi
.L6:
imulq %rdi, %rdi
.L2:
leaq 10(%rdi), %rax
ret
.cfi_endproc
.LFE0:
.size switch_prob, .-switch_prob
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
这是CI写道
long switch_prob(long x, long n){
long result = x;
switch(n){
case 50:
case 51:
result + 4;
break;
case 52:
result >> 2;
break;
case 53:
result + result + 2;
merge:
result * result
break;
default:
result * 10;
break;
}
return result;
}
除了这个事实,'长期结果 - X;'并不意味着什么,并没有你的计算有任何副作用,也有一个函数中定义的函数,它不是C. – jxh
*“......它是不正确的。”*如何?你没有解释实际问题是什么。 – user694733
您应该将您的C代码编译为'gcc -Wall -S -O -fverbose-asm',并且您需要改进代码,直到没有任何警告。注意'result * 10;'(第4行到最后一行)没有可观察的副作用,因此可能会被优化和删除。也许你的意思是“返回结果* 10”,而这只是一种猜测。 –