来自汇编的 C 循环代码

C loop code from assembly

我得到了这个汇编代码和一个 for 循环的框架。我应该填写骨架中的空白(此处用“____”表示)。我还提供了我非常确定是正确的,但我不是 100% 肯定的。这是程序集:

foo:
      pushl %ebp
      movl %esp,%ebp
      movl 8(%ebp),%ecx
      movl 16(%ebp),%edx
      movl 12(%ebp),%eax
      decl %eax
      js .L3
 .L7:
      cmpl %edx,(%ecx,%eax,4)
      jne .L3
      decl %eax
      jns .L7
 .L3:
      movl %ebp,%esp
      popl %ebp ret

很简单吧?我还得到了这个函数的框架:

int foo(int *a, int n, int val) {
  int i;
  for (i = _________; ____________________________ ; i =___________) {
     ;
  }
  return i; 
}

这是我写的:

int foo(int *a, int n, int val){
    int i;
    for(i = val--; i>= 0 && n != a[4*i]; i = val--){
        ;
    }
    return(i);
}

如果您认为这看起来不错,请告诉我。我认为我可能出错的地方是 i 的存储位置。认为它是用 decl %eax 完成的,因为这是具有返回内容的寄存器,并且在骨架中提供给我。

在伪代码中,这是:

// ecx <- int *a; edx <- int val; eax <- int n;

n = n - 1;
if (n < 0)
    goto end;

loop:

if (a[n] != val)
    goto end;

n = n - 1;
if (n >= 0)
    goto loop;

end: return; // return n in eax.

它正在检查数组 a[n] 中的每个元素是否等于 val,来自 a[n - 1] .. a[0]。它 returns 元素的索引,其中 a[i] != val,如果所有元素都等于 val,则 i in {n - 1, .., 0}-1。例如,

for (i = n - 1; i >= 0 && a[i] == val; i = i - 1)