来自汇编的 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)
我得到了这个汇编代码和一个 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)