组件,can';t将堆栈中的数组值添加到寄存器
C主代码:组件,can';t将堆栈中的数组值添加到寄存器,c,arrays,assembly,x86,stack,C,Arrays,Assembly,X86,Stack,C主代码: #include <stdio.h> int add1 (int *a, int n); int main (void) { int a[] = {1, 2, 3, 4, 5}; printf("%d\n", add1(a, 5)); return 0; } #包括 int add1(int*a,int n); 内部主(空) { inta[]={1,2,3,4,5}; printf(“%d\n”,add1(a,5));
#include <stdio.h>
int add1 (int *a, int n);
int main (void)
{
int a[] = {1, 2, 3, 4, 5};
printf("%d\n", add1(a, 5));
return 0;
}
#包括
int add1(int*a,int n);
内部主(空)
{
inta[]={1,2,3,4,5};
printf(“%d\n”,add1(a,5));
返回0;
}
包含注释C版本的函数的汇编代码:
/*
int add1 (int *a, int n)
{
int i;
int s = 0;
for (i=0; i<n; i++) s += *a++;
return s;
}
returns the sum of the array elements
*/
.text
.globl add1
add1:
pushl %ebp
movl %esp, %ebp
pushl %ebx
pushl %esi
movl $0, %ebx
movl $0, %esi
L1:
cmpl 12(%ebp), %esi
jge out
addl 8(%ebp), %ebx
addl $4, 8(%ebp)
incl %esi
jmp L1
out:
movl %ebx, %eax
popl %esi
popl %ebx
movl %ebp, %esp
popl %ebp
ret
/*
int add1(int*a,int n)
{
int i;
int s=0;
for(i=0;i8(%ebp)
保存当前元素的地址,因此您所做的实际上是s++=a++;
而不是s++=a++;
您应该能够通过以下方式解决此问题:
movl 8(%ebp), eax /* eax = a */
addl (%eax), %ebx /* ebx += *a */
addl $4, 8(%ebp) /* a++ */
虽然在循环之前将8(%ebp)
移动到一个免费寄存器(如%edi
)中,然后执行addl(%edi),可能会更有效,但ebx
/addl$4,%edi
在循环内。谢谢@Michael,这样做了。“更有效”的部分也是正确的。