Сборка Intel IA-32 - PullRequest
       21

Сборка Intel IA-32

4 голосов
/ 28 апреля 2010

Мне немного трудно преобразовать следующий код 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;

Правильно ли указан мой код?

Примечание: Мне не разрешено использовать глобальные переменные.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2010

Вы немного ошиблись, во-первых, вы кодируете это так, как будто вы получаете имя и возраст в качестве параметров, а вам нет, вам просто нужен 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;
1 голос
/ 28 апреля 2010

вот моя версия, должна быть немного быстрее (с указателем фрейма стека, вероятно, может быть удалена: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...