![](/img/trans.png)
[英]Is i686 32 bit? Why does my gcc/g++ fail compiling .cpp and .c files?
[英]Reverse engineering C codes with GCC -march=i686
這是我的C代碼:
int test(int x, int y){
int val=4*x;
if (y>0){
if (x<y) val=x-y;
else val=x^y;
}
else if (y<-2) val=x+y;
return val;
}
這是我在GCC命令行中輸入的內容:
gcc -O1 -S -march=i686 test.c
這是我得到的S文件(只有計算部分):
pushl %ebx
movl 8(%esp), %ecx
movl 12(%esp), %edx
testl %edx, %edx
jle L2
movl %ecx, %eax
subl %edx, %eax
movl %edx, %ebx
xorl %ecx, %ebx
cmpl %edx, %ecx
cmovge %ebx, %eax
jmp L4
L2:
leal 0(,%ecx,4), %eax
addl %edx, %ecx
cmpl $-2, %edx
cmovl %ecx, %eax
L4:
popl %ebx
ret
我的問題是:我可以使用上面的S文件找回完全相同的C代碼嗎? 我的意思是完全一樣的。 例如,我可以確定val
的默認值是4*x
(C代碼的第2行)嗎? 我可以確定每個if
語句的test-expression嗎?
我真的需要你的幫助。 謝謝!!!
在這種情況下,您可以發現每個寄存器對應一個變量:
%eax
- var
%ebx
- 上下文臨時變量 %ecx
- x
%edx
- y
如果對標識符的意思是“確切”,則只有在名為“符號表”的特殊結構時才有可能。 (在GCC中使用-g
標志編譯)
無論如何,您應該知道編譯器始終可以優化代碼。 這意味着,在這種情況下,您的代碼將更改為具有相同數學含義的另一個代碼。 如果你的代碼是后向翻譯的,那應該是這樣的。
int test(int x, int y) {
int val;
if (y > 0) {
if (x < y)
val = x - y;
else
val = x ^ y;
} else {
if (y < -2)
val = x + y;
else
val = 4 * x;
}
return val;
}
如果您不想進行優化,請使用標志-O0
而不是-O1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.