C 程序集,1个文件中有两个函数,获取错误:junk`(%ebp)和#x27;表达后
具有注释c版本的程序集函数: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 *****
/*
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。我想我现在真的很饿:Pcmplebx,ebp+16
?我自己从来不使用AT&T语法,但是你不应该从这些地址中删除美元符号吗?(例如,cmpl 16(%ebp),%ebx
)lol,非常明显。谢谢@Michael。我想我现在真的很饿:Pcmplebx,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