汇编,1个文件中的两个函数,得到错误:垃圾`(%ebp)'表达后

时间:2014-06-13 09:07:37

标签: c gcc assembly x86 att

使用注释c版本的程序集函数:

/*
int f (int x) 
{ 
    return x+2; 
}

void map2 (int* one, int * another, int n) 
{
    int i;
    for (i=0; i<n; i++)
      *(another+i) = f(*(one+i));
}
*/

.text

.globl f
f:

/********************************** prologue *************************************/
    pushl   %ebp        
    movl    %esp, %ebp          
/********************************************************************************/

    movl    8(%ebp), %eax
    addl    $2, %eax

/************************************* end **************************************/
    movl    %ebp, %esp
    popl    %ebp
    ret
/*********************************************************************************/

.text

.globl map2
map2:
/********************************** prologue *************************************/
    pushl   %ebp        
    movl    %esp, %ebp
    pushl   %ebx
    pushl   %esi
    pushl   %edi            
/********************************************************************************/

    movl    $0, %ebx
L1: cmpl    $16(%ebp), %ebx         // error
    jge     out

    movl    $12(%ebp), %esi         // error
    addl    %ebx, %esi  

    movl    $8(%ebp), %edi          // error
    addl    %ebx, %edi

/********************************** calls f *************************************/
    pushl   %eax
    pushl   %ecx
    pushl   %edx

    pushl   (%edi)
    call    f
    movl    %eax, (%esi)    /* *(another+i) = f(*(one+i));              */

    popl    %edx
    popl    %ecx
    popl    %eax
/********************************************************************************/

/************************************* end **************************************/
    popl    %edi
    popl    %esi
    popl    %ebx
    movl    %ebp, %esp
    popl    %ebp
    ret
/********************************************************************************/

我正在

fmap2.s:44: Error: junk `(%ebp)' after expression
fmap2.s:47: Error: junk `(%ebp)' after expression
fmap2.s:50: Error: junk `(%ebp)' after expression

为什么呢?在同一个文件中有两个序言和结尾有关吗? 这些错误行的基本错位数是正确的。

1 个答案:

答案 0 :(得分:4)

根据gcc documentation,您需要删除用于置换的数字常量前面的美元符号:

  

要记住的一点是,当一个常量用于disp / scale时,’$’不应该是前缀。

    movl    $0, %ebx
L1: cmpl    16(%ebp), %ebx
    jge     out

    movl    12(%ebp), %esi
    addl    %ebx, %esi  

    movl    8(%ebp), %edi
    addl    %ebx, %edi