【提问】GCC下内嵌汇编的问题

sunny3106 2010-05-04 03:37:04
inline汇编,用的AT&T汇编格式。

调用输入输出参数时碰到问题了,有个参数是类指针this,这个应该写成什么格式的啊?

比如:

__asm__(
****
: /* no output */
: "X"(this) /* input */
);


我不知道这个this指针该用什么表达方式,就用了个X,出现错误很奇怪。。

/tmp/cczhaDRO.s:87: Error: junk `(%ebp))' after expression
/tmp/cczhaDRO.s:104: Error: register value used as expression

有谁能给点意见么?
...全文
225 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2010-05-04
  • 打赏
  • 举报
回复
解决了? :)
大熊猫侯佩 2010-05-04
  • 打赏
  • 举报
回复
现在没环境,你把出错的指令和整个编译后函数的反汇编贴出来。
sunny3106 2010-05-04
  • 打赏
  • 举报
回复
ok,我自己继续再调试看看!

谢谢了,受益匪浅!
大熊猫侯佩 2010-05-04
  • 打赏
  • 举报
回复
你要自己调试哦,不能指望别人每一步都帮你。

遇到这种GCC嵌入asm的问题,大体的步骤是这样:

1 首先必须能通过编译

2 检查编译后的机器指令码,看一下是不是你想要的。这里的潜台词是
你在第一步之前就要用机器码组织逻辑,否则你无法正确完成步骤1
我的意思是你必须知道怎么样写是正确的!!!

3 如果觉得是正确的,但是运行有错误。这时找到出错指令附近,检查上下文。

4 从第一步开始,直到语法和逻辑都正确。

5 打完收工!
sunny3106 2010-05-04
  • 打赏
  • 举报
回复
编译没问题,运行时报Segmentation fault

是这段语句的逻辑有问题么? 还是语法有问题?

望达人指点!
sunny3106 2010-05-04
  • 打赏
  • 举报
回复
赞!
好像确实这样写就没问题了:lea %0, %%eax
我再看下逻辑,回来结贴了

[Quote=引用 7 楼 mydo 的回复:]
C/C++ code

__asm__ /*__volatile__*/("movl (%1), %%eax ; \n\t"
"movups (%%ecx), %%xmm4 ; \n\t"
"movups 16(%……
[/Quote]
大熊猫侯佩 2010-05-04
  • 打赏
  • 举报
回复

__asm__ /*__volatile__*/("movl (%1), %%eax ; \n\t"
"movups (%%ecx), %%xmm4 ; \n\t"
"movups 16(%%ecx), %%xmm5 ; \n\t"
"movups 32(%%ecx), %%xmm6 ; \n\t"
"movups 48(%%ecx), %%xmm7 ; \n\t"
"movss (%%eax), %%xmm0 ; \n\t"
"shufps $0, %%xmm0, %%xmm0 ; \n\t"
"mulps %%xmm4, %%xmm0 ; \n\t"
"movss 4(%%eax), %%xmm1 ; \n\t"
"shufps $0,%%xmm1, %%xmm1 ; \n\t"
"mulps %%xmm5, %%xmm1 ; \n\t"
"movss 8(%%eax), %%xmm2 ; \n\t"
"shufps $0,%%xmm2, %%xmm2 ; \n\t"
"mulps %%xmm6, %%xmm2 ; \n\t"
"movss 12(%%eax), %%xmm3 ; \n\t"
"shufps $0,%%xmm3, %%xmm3 ; \n\t"
"mulps %%xmm7, %%xmm3 ; \n\t"
"lea %0, %%eax ; \n\t"
"addps %%xmm1, %%xmm0 ; \n\t"
"addps %%xmm3, %%xmm2 ; \n\t"
"addps %%xmm2, %%xmm0 ; \n\t"
"movups %%xmm0, (%%eax) ; \n\t"
:"=m"(Result):"a"(&P):"%ecx");
sunny3106 2010-05-04
  • 打赏
  • 举报
回复
谢谢吗,这个确实是ecx。
但是,似乎编译 还是通不过。。。

[Quote=引用 1 楼 mydo 的回复:]
看一下gcc中实际this指针从哪个寄存器传递,是不是ecx,然后套用。
[/Quote]
sunny3106 2010-05-04
  • 打赏
  • 举报
回复
嗯 谢谢
确实是ecx,我换成了ecx,这个错误没有,又冒出来一个:
/tmp/ccL4UNOd.s: Assembler messages:
/tmp/ccL4UNOd.s:101: Error: register value used as expression
这个tmp下的文件好像找不到。。。

编译的代码是这个:

#if ASM_X86
#ifdef __GNUC__

__asm__ /*__volatile__*/("movl (%1), %%eax ; \n\t"
"\n\t"
"movups (%%ecx), %%xmm4 ; \n\t"
"movups 16(%%ecx), %%xmm5 ; \n\t"
"movups 32(%%ecx), %%xmm6 ; \n\t"
"movups 48(%%ecx), %%xmm7 ; \n\t"
"\n\t"
"movss (%%eax), %%xmm0 ; \n\t"
"shufps $0, %%xmm0, %%xmm0 ; \n\t"
"mulps %%xmm4, %%xmm0 ; \n\t"
"\n\t"
"movss 4(%%eax), %%xmm1 ; \n\t"
"shufps $0,%%xmm1, %%xmm1 ; \n\t"
"mulps %%xmm5, %%xmm1 ; \n\t"
"\n\t"
"movss 8(%%eax), %%xmm2 ; \n\t"
"shufps $0,%%xmm2, %%xmm2 ; \n\t"
"mulps %%xmm6, %%xmm2 ; \n\t"
"\n\t"
"movss 12(%%eax), %%xmm3 ; \n\t"
"shufps $0,%%xmm3, %%xmm3 ; \n\t"
"mulps %%xmm7, %%xmm3 ; \n\t"
"\n\t"
"lea (%0), %%eax ; \n\t"
"addps %%xmm1, %%xmm0 ; \n\t"
"addps %%xmm3, %%xmm2 ; \n\t"
"addps %%xmm2, %%xmm0 ; \n\t"
"movups %%xmm0, (%%eax) ; \n\t"
"\n\t"
:"=m"(Result) /* output */
:"a"(&P) /* input */
:"%ecx");
#else
#error Please implement for your compiler.
#endif
//"movl (%2), %%ecx ; \n\t"
#else
Result.X = P.X * M[0][0] + P.Y * M[1][0] + P.Z * M[2][0] + P.W * M[3][0];
Result.Y = P.X * M[0][1] + P.Y * M[1][1] + P.Z * M[2][1] + P.W * M[3][1];
Result.Z = P.X * M[0][2] + P.Y * M[1][2] + P.Z * M[2][2] + P.W * M[3][2];
Result.W = P.X * M[0][3] + P.Y * M[1][3] + P.Z * M[2][3] + P.W * M[3][3];
#endif


[Quote=引用楼主 sunny3106 的回复:]
inline汇编,用的AT&T汇编格式。

调用输入输出参数时碰到问题了,有个参数是类指针this,这个应该写成什么格式的啊?

比如:

C/C++ code

__asm__(
****
: /* no output */
: "X"(this) /* input */
);



我不知道这个……
[/Quote]
fdisksys 2010-05-04
  • 打赏
  • 举报
回复
你应该把内联的大部分代码放出来
fdisksys 2010-05-04
  • 打赏
  • 举报
回复
r,a,b,c,d,m任意取
2010-05-04
  • 打赏
  • 举报
回复
直接用 r 好像没什么问题
大熊猫侯佩 2010-05-04
  • 打赏
  • 举报
回复
看一下gcc中实际this指针从哪个寄存器传递,是不是ecx,然后套用。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧