2016-08-30 3 views
-5

私は次のコードを与えられましたが、理解しようとしています。 .bssのコードは、それはしかし、それはそれは良いよりも多くを混乱することを恐れて、私は私の思考を提供することができ要求したりneccessary 0アセンブラのこのコードは何をしますか?

1 fib : file format elf 32−i386 
2 
3 Disassembly of section.text : 
4 
5 0 x08048080 <start>: 
6 0 x08048080 : mov eax , 0x80490d0 <array> 
7 0 x08048085 : push eax 
8 0 x08048086 : mov eax , 0 x3 
9 0 x0804808b : push eax 
10 0 x0804808c : call 0 x8048098 <fib> 
11 0 x08048091 : pop eax 
12 0 x08048092 : pop eax 
13 0 x08048093 : jmp 0 x80480c1 <Lend> 
14 
15 0 x08048098 <fib>: 
16 0 x08048098 : mov ebx , [esp+0x8] 
17 0 x0804809c : mov ecx , 0 x2 
18 0 x080480a1 : xor edx , edx 
19 0 x080480a3 : mov [ebx] , edx 
20 0 x080480a5 : mov eax , 0x1 
21 0 x080480aa : mov [ebx+0x4] , eax 
22 0 x080480ad : jmp 0 x080480ba <Lloop_cond> 
23 
24 0 x080480b2 <Lloop >: 
25 0 x080480b2 : push eax 
26 0 x080480b3 : add eax , edx 
27 0 x080480b5 : mov [ebx+ecx∗4] , eax 
28 0 x080480b8 : pop edx 
29 0 x080480b9 : inc ecx 
30 
31 0 x080480ba <Lloop_cond>: 
32 0 x080480ba : cmp ecx , [esp+0x4] 
33 0 x080480be : jle 0x080480b2 <Lloop> 
34 0 x080480c0 : ret 
35 
36 0 x080480c1 <Lend>: 
37 0 x080480c1 : mov ebx , 0 x0 ; Exit code 0 = success 
38 0 x080480c6 : mov eax , 0 x1 ; Select System call exit 
39 0 x080480cb : int 0 x80 ; System call 
40 
41 Disassembly of section.bss : 
42 
43 0 x080490d0 <array>: 
44 . . . 

で前もって初期化されるに

アレイは、十分な大容量のメモリにpoitingされます。 建設的な助けをありがとう。

+3

私はこの正確な質問は、[宿題](http://www3.informatik.uni-erlangen.de/Lehre/GRa/Klausuren/として使用気づきましたklausur-gra-2012-04-13.pdf)を数年前にドイツの大学で学びました。あなたの考えや理解できないコードに関する具体的な質問やあなたの現在の理解がなければ、あなたは現時点であなたの宿題を依頼しています。 –

+1

@MichaelPetchこれはあなたがリンクしたPDFから文字通りコピーされたようです。 – fuz

+0

@MichaelPetchもしあなたが研究をうまく行っているなら、現在ドイツで休暇があり、休暇中に宿題がないことを知っているので、私は次の宿題について良い発言が必要なので、 。しかし、何でも。通常、SOについての有用なコメントは得られませんが(回答については言及しません)、リバースエンジニアリングを行い、どのように動作するかを理解するのに十分なコメントがあります。 – blauerschluessel

答えて

2

この関数はfibと呼ばれ、フィボナッチシーケンスの配列を作成しています。作業の本体は、ラベルLloopの後のいくつかの指示で行われます。

Lloop: 
    push eax    ; save current term 
    add eax , edx   ; add previous term 
    mov [ebx+ecx*4] , eax ; write to array 
    pop edx     ; retrieve previous term for next loop 
    inc ecx     ; loop control and array index 

Lloop_cond: 
    cmp ecx , [esp+0x4]  ; end test 
    jle Lloop    ; repeat 
    ret      ; done 

私はあなたに残ります。

+0

ああ。緑のダニはすぐに取り下げられ、下垂体に置き換えられます。いいね!私はページ上部の質問に答えて、コードの本質的な部分に注釈をつけました。 –

+0

これはそうです、あなたは何を期待しましたか?あなたはここで感謝や感謝を得ることはありません。しかし、何でも。私はあなたの応答に感謝します。私はそれを使用し、私の質問を再編集し、自分の発言にコメントを付けます。 – blauerschluessel

+0

なぜ緑のダニを撤回したのですか?あなたは完全なリバースエンジニアを期待しましたか? –

1

適切な答えが既に与えられていて、質問の理由が日陰であるかもしれませんが、私も自分の議論に取り組む必要があり、楽しい演習でした。

マイリバースエンジニアリングfibが、この関数に沸く:

void fib_simple(int* array, int n) 
{ 
    int i, j, tmp; 
    int count = 2; 

    array[0] = i = 0; 
    array[1] = j = 1; 

    for (count = 2; count <= n; count++) { 
     tmp = j; 
     j = array[2] = i + j; 
     i = tmp; 
    } 
} 

は今のコースだけ簡潔音訳です。実際のリバースエンジニアリング機能がより次のようになります。

void fib(int* array, int n) 
{ 
    int ecx, edx, tmp; 

    /* mov ebx , [esp+0x8]; ebx is the array */ 
    /* mov ecx , 0x2; ecx is a counter, starting from 2 */ 
    ecx = 2; 

    /* xor edx, edx ; set edx to zero  */ 
    edx = 0; 

    /* mov [ebx], edx; set array[0] to edx */ 
    array[0] = edx; 

    /* mov eax , 0x1 */ 
    eax = 1; 

    /* mov [ebx+0x4] , eax */ 
    array[1] = 1; 

    /* The while loop condition is checked with a loop condition: 
    <Lloop_cond>:   ; place to jump back to every iteration 
    cmp ecx , [esp+0x4] ; compare to n 
    jle 0x080480b2 <Lloop> ; if ecx <= n, jump to loop 
    */ 
    while (ecx <= n) { 
     /* 
     This is the inner loop 
     <Lloop >: 
     */ 

     /* push eax; eax is temporarily saved to stack */ 
     tmp = eax; 

     /* add eax, edx */ 
     eax += edx; 

     /* mov [ebx+ecx∗4], eax */ 
     array[ecx] = eax; 

     /* pop edx */ 
     edx = tmp; 

     /* inc ecx */ 
     ecx++; 
    } 

    /* ret */ 
    return; 
} 
+0

なぜdownvote?それは私にはうまくいっているようです。 – Johan

+0

私は質問が好きで、適切な答えが与えられOPが質問を理解するので、多かれ少なかれ自分のためにそれを働かせました。私のポストは思考を提供する以上のことをしており、ストレートアップは宿題を解決します。 (まさにSOで意味されているものではない) –

関連する問題