Sum=Red * RedCofOne + Green * GreenCofOne + Blue * BlueCofOne 这个语句用汇编语言该如何做呢,

laviewpbt 2012-03-24 10:46:00
请教个事,下面这个表达式
Sum=Red * RedCofOne + Green * GreenCofOne + Blue * BlueCofOne(各变量都为正数)

如果用汇编一步一步的翻译,应该是:

mov Sum,0
mov eax,Red
mul RedCofOne
mov Sum,eax
mov eax,Green
mul GreenCofOne
ADD sum,eax
mov eax,Blue
mul BlueCofOne
ADD sum,eax


由于mul指令隐藏了一个源操作数EAX,这样每次都要把一个被乘数移动到他那里, 我这样搞之后,编译的程序速度比高级语言写的还低了,各位有什么建议啊?
...全文
89 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
均陵鼠侠 2012-03-25
  • 打赏
  • 举报
回复
你还想怎样啊?我就不信高级语言编译之后,它就不用eax寄存器变来变去。
masmaster 2012-03-25
  • 打赏
  • 举报
回复
用GCC可以指定优化级别。不过,级别越高,反汇编代码的可读性越差! :-(
WJN92 2012-03-25
  • 打赏
  • 举报
回复
多使用寄存器,这样可以提高速度

还有你确认高级语言编译出来的会更快!?
使用VC++ ALT+F11看看它编译出来的汇编代码,就知道了
「已注销」 2012-03-25
  • 打赏
  • 举报
回复
不要迷信汇编语言,合适的高级语言其效能可能会超过您收过编写的汇编代码;对于您这样的颜色变换,合理的C代码完全可以再一个表达式中进行两次颜色变换;汇编仅仅在极其敏感的情况下,如使用MMX指令等。。。
「已注销」 2012-03-25
  • 打赏
  • 举报
回复
您的汇编代码效能有些问题:
1)以上表达式全是变量吗?(RedCofOne...),如果存在常量,乘法指令会被一系列的移位指令代替:在多数CPU中乘法指令速度很慢;(加减法及移位指令多数会在一个时钟周期内完成,乘法除法会很慢)
2)以上汇编代码过多的使用了内存变量(如SUM),内存的访问速度要低于寄存器;高级语言在优化时会尽量使用寄存器;具体做法:sum改成寄存器、每次乘法之后的结果不要只用EAX,如可以使用EBX、EDI。。。。

21,459

社区成员

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

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