2016-09-15 8 views
-2

更新、そのことについて申し訳ありません:Traduction小さなコードアセンブリ - コード付き> C

アセンブリ:

01: cmp edi, 5 
02: ja   short loc_10001141 
03: jmp ds:off_100011A4[edi*4] 
04: loc_10001125: 
05: mov esi, 40h 
06: jmp short loc_10001145 
07: loc_1000112C: 
08: mov esi, 20h 
09: jmp short loc_10001145 
10: loc_10001133: 
11: mov esi, 38h 
12: jmp short loc_10001145 
13: loc_1000113A: 
14: mov esi, 30h 
15: jmp short loc_10001145 
16: loc_10001141: 
17: mov esi, [esp+0Ch] 
18: … 
19: off_100011A4 dd offset loc_10001125 
20:  dd offset loc_10001125 
21:  dd offset loc_1000113A 
22:  dd offset loc_1000112C 
23:  dd offset loc_10001133 
24:  dd offset loc_1000113A 

擬似C:私は小さなアセンブリコードを変換する必要が

switch(edi) { 
case 0: 
case 1: 
// goto loc_10001125; 
    esi = 0x40; 
    break; 
case 2: 
case 5: 
// goto loc_1000113A; 
    esi = 0x30; 
    break; 
case 3: 
// goto loc_1000112C; 
    esi = 0x20; 
    break; 
case 4: 
// goto loc_10001133; 
    esi = 0x38; 
    break; 
default: 
// goto loc_10001141; 
    esi = *(esp+0xC) 
    break; 
} 

Cに組み込みプログラミングのトータルnoobとして、私はあなたの助けが必要です。

練習問題は本から来ているので、私はすでに解決策を見つけていますが、理解するのには役立ちません。

私は、ソリューション内のアセンブリコードとスイッチの関係を理解し​​ようと努力しました。これは、コードがアセンブリコードでどのように実行されているかを正確に伝えることができないためです。

(更新:より明確に/具体的な質問^^作るしようとすると):ジャンプテーブルの動作んどのように、どのようにコードが実行される - アセンブリコードではなく、Cを - ;)

私はありません私が言ったように、私はここで初心者です、そして、英語は私の母国語ではありません! ^^

+5

あなたの質問にコードを投稿してください。 – Banex

+0

a)あなたのコードを掲示し、b)あなたが使用しているプラ​​ットフォームを教えてくれたら助けになるかもしれません。リンクをしないでください... – 4386427

+2

あなたがリンクしている本が法的に無料で入手できないことが合理的に確かです(リンクを違法と非道の間にする) – UnholySheep

答えて

1

ここにコードがあります。 組立

01: cmp  edi, 5 
02: ja  short loc_10001141  
03: jmp  ds:off_100011A4[edi*4] 
04: loc_10001125:     
05: mov  esi, 40h    
06: jmp  short loc_10001145 
07: loc_1000112C:     
08: mov  esi, 20h    
09: jmp  short loc_10001145 
10: loc_10001133:     
11: mov  esi, 38h    
12: jmp  short loc_10001145 
13: loc_1000113A:     
14: mov  esi, 30h    
15: jmp  short loc_10001145 
16: loc_10001141:     
17: mov  esi, [esp+0Ch]  
18: ... 
19: off_100011A4 dd offset loc_10001125 
20: dd offset loc_10001125   
21: dd offset loc_1000113A 
22: dd offset loc_1000112C 
23: dd offset loc_10001133 
24: dd offset loc_1000113A 

擬似C

switch(edi) { 
    case 0: 
    case 1: 
    // goto loc_10001125; 
    esi = 0x40; 
    break; 
    case 2: 
    case 5: 
    // goto loc_1000113A; 
    esi = 0x30; 
    break; 
    case 3: 
    // goto loc_1000112C; 
    esi = 0x20; 
    break; 
    case 4: 
    // goto loc_10001133; 
    esi = 0x38; 
    break; 
    default: 
    // goto loc_10001141; 
    esi = *(esp+0xC) 
    break; 
} 
... 

アセンブリコードを分析することにより、あなたは、EDI == 1のためにとのEDI == 0のために、あなたは同じ命令にジャンプすることがわかります。同じことがedi == 2とedi == 5に当てはまります。擬似Cでは、あなたは奇妙なケースステートメントの順序を持​​っていますが、そのうちのいくつかは最後に壊れています。

edi == 2の場合、疑似Cでケース2に行き、疑似Cでケース5に行き、0x30をesiに割り当てます。 edi == 5を想像すると、疑似Cのケース5に行き、0x30をesiに割り当てます。擬似Cは、命令を少なくするためにこのように作られ、最終的に実行可能なものは小さくなります。

関連する問題