2016-11-11 45 views
-2

我必須從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; 
    } 
+3

除了這個事實,'長期結果 - X;'並不意味着什麼,並沒有你的計算有任何副作用,也有一個函數中定義的函數,它不是C. – jxh

+0

*「......它是不正確的。」*如何?你沒有解釋實際問題是什麼。 – user694733

+0

您應該將您的C代碼編譯爲'gcc -Wall -S -O -fverbose-asm',並且您需要改進代碼,直到沒有任何警告。注意'result * 10;'(第4行到最後一行)沒有可觀察的副作用,因此可能會被優化和刪除。也許你的意思是「返回結果* 10」,而這只是一種猜測。 –

回答

0

只是下面的彙編代碼的邏輯,我猜是這樣的:

int switch_prob(int x, int n) { 
    int result = x; 

    switch (n - 50) { 

     case 0: 
     case 2: 
      result += 4; 
      break; 

     case 3: 
      result >>= 2; 
      break; 

     case 4: 
      result += 2; 

     case 5: 
      result *= result; 
      break; 

     default: 
      result += 10; 
    } 

    return result; 
} 

你可以測試你的解決方案的一種方法是編寫一個驅動程序,如:

test.c的

#include <stdio.h> 

int switch_prob(int x, int n); 


int main() { 

    printf("%d\n", switch_prob(1, 54)); 

    return 0; 
} 

,然後編譯彙編代碼,是否與您的系統兼容,與驅動程序:

gcc -Wall test.c switch_prob-soln.s 

然後編輯test1.c文件更改參數到switch_prob()看看你的假設是否成立。我猜跳轉表告訴我們介紹一下情況:

.quad .L3 # case 0: addition (LEA) 
.quad .L2 # default: (no case 1:) addition (LEA) 
.quad .L3 # case 2: is case 0: again 
.quad .L4 # case 3: right shift (SAR) 
.quad .L5 # case 4: addition (LEA) 
.quad .L6 # case 5: multiplication (IMUL) 
+0

這很有幫助,謝謝!我肯定會試一試 –

+0

最後一個問題,我知道lea可以用於操作,因爲它在這裏,但我也讀過它,它本質上是一種將某個索引移動到另一個索引的方式,比如在一個數組中,還是我解釋錯了? (對不起,我對裝配很陌生,OO的邏輯飛躍對我來說很難)。 –