我必須從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」,而這只是一種猜測。 –