程序集,1 个文件中有两个函数,在表达式后出现错误:垃圾 `(%ebp)'

Posted

技术标签:

【中文标题】程序集,1 个文件中有两个函数,在表达式后出现错误:垃圾 `(%ebp)\'【英文标题】:assembly, two functions in 1 file, getting Error: junk `(%ebp)' after expression程序集,1 个文件中有两个函数,在表达式后出现错误:垃圾 `(%ebp)' 【发布时间】:2014-06-13 09:07:37 【问题描述】:

带有注释的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

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

【问题讨论】:

我自己从不使用 AT&T 语法,但您不应该从这些地址中删除美元符号吗? (例如cmpl 16(%ebp),%ebx 哈哈,太明显了。谢谢@迈克尔。猜猜我现在真的很饿:P cmpl ebx, ebp + 16 ? 【参考方案1】:

根据gccdocumentation,需要去掉用于位移的数字常量前面的美元符号:

要记住的一点是,当一个常量用于显示/缩放时,’$’ 不应作为前缀。

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

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

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

【讨论】:

那是因为$ 适用于整个表达式,它使它成为立即数。与流行的看法相反,它不适用于下一个令牌。这意味着例如计算两个标签之间的距离,您将使用movl $foo-bar, %eax 而不是movl $foo-$bar, %eax

以上是关于程序集,1 个文件中有两个函数,在表达式后出现错误:垃圾 `(%ebp)'的主要内容,如果未能解决你的问题,请参考以下文章

c#2005调试程序正常,生成了引用的dll文件,但是生成程序后在其他机器上使用,总是出现缺少程序集的错误

ASP.NET运行时错误:未能加载文件或程序集或它的某一依赖项.参数错误.

Rails 3.1 和 Coffeescript 出现“找不到变量”错误

C#中两个窗体间的函数调用

quartus2中有仿真模块modelsim时,出现Can't launch Modelsim,,怎么解决?

ArcGIS engine C#开发出现未能加载程序集ESRI.ArcGIS.AxControls