组件,can';t将堆栈中的数组值添加到寄存器

组件,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));

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));
返回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;i
8(%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,这样做了。“更有效”的部分也是正确的。