我在将以下 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;

我的代码正确吗?

笔记:
我不允许使用全局变量。

最佳答案

你有一点错误,首先,你在编码它就像你得到一个名字和一个年龄作为参数,你不是,你只需要 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;

关于assembly - 英特尔 IA-32 组装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2728610/

10-11 16:42