C语言编译器优化问题

zhangxichao 2010-02-17 11:12:13
函数中包含一个汇编jmp语句时,编译器不再进行优化,如下面的fun1函数,如果将return换成jmp,编译器生成的代码质量就会非常差,没有任何的优化。
由于应用特殊,函数fun1不能被直接调用,而进入时只能通过指令跳转方式,退出时也需要使用跳转,请问其中的C语言代码能有什么方法使编译器编译时对其优化吗?

int t, next, rr;
void fun1(void)
{
int tmp = t * 2;
t = tmp +1;
next = rr;
return ;//__asm jmp next;
}
int _tmain(int argc, _TCHAR* argv[])
{
t = 1;
__asm mov rr, offset ext;
next = (int) fun1;
__asm jmp next;

ext:
printf("%d\n",t);

return 0;//这个小程序只是用来说明问题的例子
}
...全文
270 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzx714 2010-02-20
  • 打赏
  • 举报
回复
引用 9 楼 zhangxichao 的回复:
引用 4 楼 yzx714 的回复:
手工优化…………
不写汇编,怎么手工优化?
当然是手工优化一次编译器生成的汇编代码了
zhangxichao 2010-02-20
  • 打赏
  • 举报
回复
引用 4 楼 yzx714 的回复:
手工优化…………

不写汇编,怎么手工优化?
lwouyang 2010-02-19
  • 打赏
  • 举报
回复
引用 5 楼 arong1234 的回复:
你是不是需要naked调用约定?看看:http://blog.vckbase.com/arong/archive/2004/06/09/409.html
我觉得你还是把你为什么不能使用普通的函数调用方式的原因说出来,让大家参详参详,你这样问恐怕得到的答案也不是你想要的

长见识了!学习ing!
zhangxichao 2010-02-18
  • 打赏
  • 举报
回复
还言之,如下面例子:
int t;
void fun(void)
{
int tmp = 5;
if (tmp > 5) {
t = 1;
//__asm jmp ext;
} else {
t = 2;
}
ext:
printf("t=%d\n", t);
}
没有jmp语句时,编译后函数直接输出t=2,前面的if else均被优化掉了,但若加上那个jmp,编译器就不知道怎么优化了。现在的问题是jmp不得不用了,;还能让编译器优化生成的目标码吗?
zhangxichao 2010-02-18
  • 打赏
  • 举报
回复
做模拟器,比如在X86上模拟SPARC处理器,用X86指令解释一条SPARC指令,解释过程中包含一条X86的CALL指令会严重影响模拟效率,压栈、出栈过程更是不能要。记得学编译原理时似乎有goto, jmp 会影响归约什么的。
arong1234 2010-02-18
  • 打赏
  • 举报
回复
你是不是需要naked调用约定?看看:http://blog.vckbase.com/arong/archive/2004/06/09/409.html
我觉得你还是把你为什么不能使用普通的函数调用方式的原因说出来,让大家参详参详,你这样问恐怕得到的答案也不是你想要的
yzx714 2010-02-18
  • 打赏
  • 举报
回复
手工优化…………
fly_new 2010-02-18
  • 打赏
  • 举报
回复
fun1函数进入的时候有压栈操作,出去直接jmp的话,栈帧有出入哦。
如果是汇编调入,汇编返回。干麻不做成这样的那?

FUN1 PROC
;符号入口,即函数入口

call fun_main ;上面fun1的主体实现

ENDP ;函数完成


这个不是X86汇编形式,不知道是否是你需要的。你把fun_main函数用C语言写,开优化编译就可以了。
lovesi3344 2010-02-17
  • 打赏
  • 举报
回复
没学过汇编的路过
mLee79 2010-02-17
  • 打赏
  • 举报
回复
偶的神啊...
比 setjmp 还恐怖...

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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