程序集,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 出现“找不到变量”错误