4

次の Java コードを Intel IA-32 アセンブリに変換するのに少し苦労しています。

 class Person() {
   char name [8];
   int age;

   void printName() {...}

   static void printAdults(Person [] list) {
     for(int k = 0; k < 100; k++){
       if (list[k].age >= 18) {
         list[k].printName();
       }
     }
  }
}

私の試みは:

Person:
    push ebp; save callers ebp
    mov ebp, esp; setup new ebp
    push esi;    esi will hold name
    push ebx;    ebx will hold list
    push ecx;    ecx will hold k

init:
    mov esi, [ebp + 8];
    mov ebx, [ebp + 12];
    mov ecx, 0;    k=0

forloop:
    cmp ecx, 100;
    jge end;    if k>= 100 then break forloop 
    cmp [ebx + 4 * ecx], 18 ;
    jl auxloop;    if list[k].age < 18 then go to auxloop
    jmp printName;

printName:


auxloop:
    inc ecx;
    jmp forloop;

end:
    pop ecx;
    pop ebx;
    pop esi;
    pop ebp;

私のコードは正しいですか?

注: グローバル変数の使用は許可されていません。

4

2 に答える 2

2

少し間違っています。まず、名前と年齢をパラメーターとして取得するようにコーディングしていますが、そうではありません。アドレスをリストに保持するために ebx が必要なだけです。そして、文字が1バイト(したがって、配列内で8バイト)、整数とポインターが4バイトであると仮定すると、ポインターの計算が少しずれます。これはうまくいくかもしれません:

Person:
    push ebp; save callers ebp
    mov ebp, esp; setup new ebp

init:
    mov ebx, [ebp + 4];
    mov ecx, 0;    k=0

forloop:
    cmp ecx, 100;
    jge end;    if k>= 100 then break forloop 
    cmp [ebx + 8 + 12 * ecx], 18 ; 12 * ecx to advance 12 bytes (8 char 4 int), plus 8 to compare the integer, which is 8 bytes away from the start of the pointer.
    jl auxloop;    if list[k].age < 18 then go to auxloop
    jmp printName;

printName:


auxloop:
    inc ecx;
    jmp forloop;

end:
    pop ebp;
于 2010-04-28T10:43:32.993 に答える
1

これが私のバージョンです。少し速くなるはずです(スタックフレームポインターを使用すると、おそらく削除できます:P)

_start:
    PUSH EBP
    MOV EBP,ESP
    PUSH EDI
    PUSH ESI
    MOV ESI, [EBP + 8]      ; __stdcall assumed -> get arg: list
    MOV EDI, 100        ; i=100 -> iterations of the loop

_loop:
    CMP [ESI + 8], 18       ; pPerson->age >= 18
    JL _next
    MOV ECX,ESI
    CALL printName      ; __thiscall assumed

_next:
    ADD ESI,12          ; list += sizeof(person)
    SUB EDI,1                    ; i--
    JNZ _loop

_end:
    POP ESI
    POP EDI
    POP EBP
    RETN 4
于 2010-04-28T17:13:29.970 に答える