免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4269 | 回复: 3
打印 上一主题 下一主题

请教一段gcc汇编 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-15 10:51 |只看该作者 |倒序浏览
  1. static inline unsigned short from32to16(unsigned a)  
  2. {
  3.         unsigned short b = a >> 16;
  4.         asm("addw %w2,%w0\n\t"
  5.             "adcw $0,%w0\n"
  6.             : "=r" (b)
  7.             : "0" (b), "r" (a));
  8.         return b;
  9. }
复制代码
里面的%w0是什么意思?查了一些gcc内嵌汇编的文章,都没有看到这个。
谢谢

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2010-04-15 13:23 |只看该作者
回复 1# jinglexy
  1.    1. static inline unsigned short from32to16(unsigned a)  
  2.    2. {
  3.    3.         unsigned short b = a >> 16;
  4.    4.         asm("addw %w2,%w0\n\t"
  5.    5.             "adcw $0,%w0\n"
  6.    6.             : "=r" (b)
  7.    7.             : "0" (b), "r" (a));
  8.    8.         return b;
  9.    9. }
复制代码
%0是指第0个操作数(从0开始计数),这里指b。

至于w,参见http://gcc.gnu.org/onlinedocs/gc ... tml#Output-Template

`%' followed by a letter and a digit says to output an operand in an alternate fashion. Four letters have standard, built-in meanings described below. The machine description macro PRINT_OPERAND can define additional letters with nonstandard meanings.

所以,具体的含义还需要查看相应的代码

论坛徽章:
0
3 [报告]
发表于 2010-04-15 23:15 |只看该作者
我觉得编译出来之后objdump一下~ 看看编译出来的机器码就知道了~ = =a~

论坛徽章:
0
4 [报告]
发表于 2010-04-27 10:45 |只看该作者
%w0,表示取%0的16比特。

w, 2字节(word), 如ax
b, 1字节, 如al
k, 4字节, 如eax
q, 8字节, 如rax

h, 高8位, 例如ah

还有一个z, 返回一个字符, 就是上头w/b/k/q/h之中的一个,也就是取operand size。

注意,这些东西,只能应用于 byte-addressable registers。 也就是像rax这样的,本身是64位的寄存器,但是你可以单独只访问它的低32位, 也可以只访问其低16位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP