请教一段gcc汇编

发布于 2022-09-12 16:35:20 字数 644 浏览 9 评论 3

  1. static inline unsigned short from32to16(unsigned a)  
  2. {
  3.         unsigned short b = a >> 16;
  4.         asm("addw %w2,%w0nt"
  5.             "adcw $0,%w0n"
  6.             : "=r" (b)
  7.             : "0" (b), "r" (a));
  8.         return b;
  9. }

复制代码里面的%w0是什么意思?查了一些gcc内嵌汇编的文章,都没有看到这个。
谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

各空 2022-09-18 12:10:37

%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位。

我不会写诗 2022-09-14 08:26:36

我觉得编译出来之后objdump一下~ 看看编译出来的机器码就知道了~ = =a~

痴梦一场 2022-09-13 02:37:15

回复 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,%w0nt"
  5.    5.             "adcw $0,%w0n"
  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.

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文