C 程序集,1个文件中有两个函数,获取错误:junk`(%ebp)和#x27;表达后

C 程序集,1个文件中有两个函数,获取错误:junk`(%ebp)和#x27;表达后,c,gcc,assembly,x86,att,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 *****

具有注释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
/********************************************************************************/
为什么??在同一个文件中有两个序言和结尾有什么关系? 这些误差线的基本位错数是正确的。

根据gcc,您需要删除用于位移的数值常量前面的美元符号:

需要记住的一点是,当disp/scale使用常量时,
'$'
不应作为前缀

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

需要记住的一点是,当disp/scale使用常量时,
'$'
不应作为前缀


我自己从来不使用AT&T语法,但你不应该从这些地址中删除美元符号吗?(例如,
cmpl 16(%ebp),%ebx
)lol,非常明显。谢谢@Michael。我想我现在真的很饿:P
cmplebx,ebp+16
?我自己从来不使用AT&T语法,但是你不应该从这些地址中删除美元符号吗?(例如,
cmpl 16(%ebp),%ebx
)lol,非常明显。谢谢@Michael。我想我现在真的很饿:P
cmplebx,ebp+16
?这是因为
$
应用于整个表达式,它使它立即生效。与普遍的看法相反,它不适用于下一个代币。这意味着,例如,要计算两个标签之间的距离,可以使用
movl$foo-bar,%eax
而不是
movl$foo-$bar,%eax
。这是因为
$
应用于整个表达式,使其成为立即表达式。与普遍的看法相反,它不适用于下一个代币。这意味着,例如,要计算两个标签之间的距离,可以使用
movl$foo-bar,%eax
而不是
movl$foo-$bar,%eax
fmap2.s:44: Error: junk `(%ebp)' after expression
fmap2.s:47: Error: junk `(%ebp)' after expression
fmap2.s:50: Error: junk `(%ebp)' after expression
    movl    $0, %ebx
L1: cmpl    16(%ebp), %ebx
    jge     out

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

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