前馈科技

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 421|回复: 0

gcc内嵌汇编

[复制链接]

97

主题

97

帖子

539

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
539
发表于 2023-1-5 11:22:31 | 显示全部楼层 |阅读模式
内联汇编格式:
  1. __asm__("asm statements" : outputs : inputs : registers-modified);

  2. __asm__("汇编语句"
  3.                 :输出寄存器
  4.                 :输入寄存器
  5.                 :会被修改的寄存器
  6.                 )
复制代码
汇编语句以":"分隔成四个部分,其中第一部分就是汇编代码本身,通常称为指令部,其格式和在汇编语言中使用的格式基本相同。指令部分是必须的,而其它部分则可以根据实际情况而省略,如果使用了后面的部分,而前面部分为空,也需要用“:”格开,相应部分内容为空.

举个例子:
  1. asm(“add %2, %0” : “=r”(a) : “0”(a), “r”(b));
复制代码
“=r”(a) 为输出操作数,为%0,且与变量a绑定
“0”(a)为输入操作数,对“逻辑”输入操作数1指定数字规则”0”,表示这个逻辑操作数占用和操作数0一样的“位置”(占用同一个寄存器)
“r”(b)也是输入操作数,r表示寄存器变量。
以上内嵌汇编表示:a=a+b。


常用的constraints有以下几个(更多细节参见gcc手册):
m    内存操作数
r    寄存器操作数
i    立即数操作数(整数)
f    浮点寄存器操作数
F   立即数操作数(浮点)

gcc内联汇编操作符和修饰符:
  1. 操作符/修饰符    说明
  2. =                被修饰的操作数只写
  3. +                被修饰的操作数具有可读可写属性
  4. &                被修饰的操作数只能作为输出
复制代码


  1. __asm__ __volatile__(
  2. "cli":        ------>这个是汇编指令部分
  3. :                ------->这个是输出部分,为空
  4. :                -------->这个是输入部分,为空
  5. "memory"        -------->这个是破坏描述部分
  6. )

  7. "__asm__" 表示后面的代码为内嵌汇编,“asm”是“__asm__”的别名。
  8. “__volatile__” 表示编译器不要优化代码,后面的指令保留原样,“volatile”是它
  9. 的别名。 括号里面是汇编指令。
  10. __asm__ __violate__ ("movl %1,%0" : "=r" (result) : "r" (input));
复制代码

“movl %1,%0"是指令模板;”%0"和"%1"代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语言表达式与指令操作数相对应。指令模板后面用小括号括起来的是C语言表达式,“result"和"input”,他们按照出现的顺序分 别与指令操作数"%0","%1"对应,操作数至多有10 个
在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限制或者说要求
“result"前面的限制字符串是”=r",其中"="表示"result"是输出操作数,“r” 表示需要将"result"与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是"result"本身,当然指令执行 完后需要将寄存器中的值存入变量"result",从表面上看好像是指令直接对"result"进行操作,实际上GCC做了隐式处理
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|计算机控制

GMT+8, 2024-4-29 19:55 , Processed in 0.050109 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表