1、基本格式

__asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modify);

注意:内联汇编最多三个冒号,隔开了四个部分:指令、输出、输入和破坏性说明。

2、指令部分

指令必须用引号括起来,可以每条指令一对引号,也可以所有指令公用一对引号,Linux常用的格式是:

__asm__ __volatile__(".align 2\n\t"

"movl %eax, %ebx\n\t"

"test %ebx, %ecx\n\t"

"jne error\n\t"

"sti\n\t"

"error: popl %edi\n\t"

"subl %ecx, %ebx");

3、输出部分

Output用来指定当前内联汇编语句的输出。我们看一看这个例子:

__asm__("movl %%cr0, %0": "=a" (cr0));

这个内联汇编语句的输出部分为"=a"(cr0),这个输出操作由两部分组成:括号括住的部分(cr0)和引号引住的部分"=a"。表示cr0 = eax,最终这一点被转化成汇编指令就是movl %eax, address_of_cr0。

除了=a,还有其他的定义:

=a   从eax中得到输出;

=d   从edx中得到输出;

其他更多定义请参考后面的“限定符”

4、输入部分

Input域的内容用来指定当前内联汇编语句的输入。我们看一看这个例子:

__asm__("movl %0, %%db7" : : "a" (cpu->db7));

例中Input域的内容为一个表达式"a"(cpu->db7),被称作“输入表达式”,用来表示一个对当前内联汇编的输入。像输出表达式一样,一个输入表达式也分为两部分:带括号的部分(cpu->db7)和带引号的部分"a"。这两部分对于一个内联汇编输入表达式来说也是必不可少的。

5、破坏说明部分

表示本内联汇编部分破坏了哪些东西,可以写:"%eax", "%edx", "memory"等

6、限定符

分类            限定符                    描述

通用寄存器       “a”               将输入变量放入eax

这里有一个问题:假设eax已经被使用,那怎么办?

其实很简单:因为GCC 知道eax 已经被使用,它在这段汇编代码

的起始处插入一条语句pushl %eax,将eax 内容保存到堆栈,然

后在这段代码结束处再增加一条语句popl %eax,恢复eax的内容

“b”               将输入变量放入ebx

“c”               将输入变量放入ecx

“d”                将输入变量放入edx

“s”               将输入变量放入esi

“d”               将输入变量放入edi

“q”              将输入变量放入eax,ebx,ecx,edx中的一个

“r”               将输入变量放入通用寄存器,也就是eax,ebx,ecx,

edx,esi,edi中的一个

“A”              把eax和edx合成一个64 位的寄存器(use long longs)

内存            “m”             内存变量

“o”             操作数为内存变量,但是其寻址方式是偏移量类型,

也即是基址寻址,或者是基址加变址寻址

“V”             操作数为内存变量,但寻址方式不是偏移量类型

“ ”             操作数为内存变量,但寻址方式为自动增量

“p”             操作数是一个合法的内存地址(指针)

寄存器或内存    “g”             将输入变量放入eax,ebx,ecx,edx中的一个

或者作为内存变量

“X”            操作数可以是任何类型

立即数

“I”             0-31之间的立即数(用于32位移位指令)

“J”            0-63之间的立即数(用于64位移位指令)

“N”             0-255之间的立即数(用于out指令)

“i”             立即数

“n”            立即数,有些系统不支持除字以外的立即数,

这些系统应该使用“n”而不是“i”

匹配            “ 0 ”,         表示用它限制的操作数与某个指定的操作数匹配,

“1” ...               也即该操作数就是指定的那个操作数,例如“0”

“9”            去描述“%1”操作数,那么“%1”引用的其实就

是“%0”操作数,注意作为限定符字母的0-9 与

指令中的“%0”-“%9”的区别,前者描述操作数,

后者代表操作数。

&                     该输出操作数不能使用过和输入操作数相同的寄存器

操作数类型        “=”          操作数在指令中是只写的(输出操作数)

“+”          操作数在指令中是读写类型的(输入输出操作数)

浮点数            “f”          浮点寄存器

“t”           第一个浮点寄存器

“u”          第二个浮点寄存器

“G”          标准的80387浮点常数

%                   该操作数可以和下一个操作数交换位置

例如addl的两个操作数可以交换顺序

(当然两个操作数都不能是立即数)

#                   部分注释,从该字符到其后的逗号之间所有字母被忽略

*                     表示如果选用寄存器,则其后的字母被忽略

7、例句

__asm__ __volatile__(" " : : : "memory" ); // 表示更改过内存

__asm__ __volatile__("rdtsc" : "=a"(low) : : "edx"); //rdtsc将64位tsc寄存器分别放在eax和edx寄存器里,各32位

__asm__ __volatile__("mov %%eax, %%ebx" : "=b"(rv) : "a"(foo) : "eax", "ebx");

__asm__ __volatile__("lidt %0": "=m" (idt_descr));

__asm__ __volatile__("subl %2,%0\n\t"

"sbbl %3,%1"

: "=a" (endlow), "=d" (endhigh)

: "g" (startlow), "g" (starthigh), "0" (endlow), "1" (endhigh));

linux 64位module内联汇编,@yuanbor: Linux内联汇编总结相关推荐

  1. linux 64位内存划分,linux 64位内存空间大小?(linux 64 bits memory space size? [closed])

    linux 64位内存空间大小?(linux 64 bits memory space size? [closed]) 在Linux 32bit中,内核占用1GB的内存,而用户空间将占用剩余的gigs ...

  2. Linux 64位进程地址空间分布概况

    对于Linux 64位系统,理论上,64bit内存地址可用空间为0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF(16位十六进制数),这是个相当庞大的空间,Linux实际 ...

  3. linux es连接mysql_LINUX下使用elasticsearch-jdbc工具实现MySQL同步到ElasticSearch 以及linux 64位centos系统安装jdk1.8...

    第一步:环境匹配 1)elasticsearch 2.3.3 成功安装部署 2)mysql安装成功,增删改查无误~~. 3)要保证elasticsearch-jdbc的版本要与elasticsearc ...

  4. Kali Linux 64位架构安装Veil-Evasion

    Kali Linux 64位架构安装Veil-Evasion Veil-Evasion是一种生成有效载荷可执行文件的工具,可绕过常见的防病毒软件.由于技术的发展,大部分人都选择安装的Linux系统架构 ...

  5. LINUX下使用elasticsearch-jdbc工具实现MySQL同步到ElasticSearch 以及linux 64位centos系统安装jdk1.8

    标签: 第一步:环境匹配 1)elasticsearch 2.3.3 成功安装部署  2)mysql安装成功,增删改查无误~~. 3)要保证elasticsearch-jdbc的版本要与elastic ...

  6. linux卸载minicoda2,MiniConda2下载 MiniConda python 2.7 v4.3.30.2 Linux 64位 官方免费版(附安装步骤) 下载-脚本之家...

    MiniConda python 2.7 Linux版是一款可以在Linux系统下使用的Python 环境管理工具,同时MiniConda是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软 ...

  7. 【dotnet跨平台】VSCode Linux 32位和Linux 64位下载地址分享

    [dotnet跨平台]VSCode Linux 32位和Linux 64位下载地址分享 首先给个百度云的地址:http//pan.baidu.com/s/1qXPV5Ha 然后提供个微软某个cdn地址 ...

  8. 【Linux】CentOS7下安装Ngnix代理服务器详细过程 附Linux 64位 Ngnix压缩包百度云盘分享

    [Linux]CentOS7下安装Ngnix代理服务器详细过程 附Linux 64位 Ngnix压缩包百度云盘分享 Ngnix基本概况 Nginx (读作"engine X") 由 ...

  9. linux的tomcat下载,tomcat linux 64位下载

    tomcat 8发布了,这里为大家带来了 linux版本下载,此版本为8.0.32 tomcat linux 64位下载,它是由Apache 所开发的一个核心项目,由于Tomcat 产品的技术先进.性 ...

最新文章

  1. JavaScript类型判断
  2. python socket实现文件传输(防粘包)
  3. Swift之深入解析如何自定义操作符
  4. django按钮点击后想刷新当前页面的view写法
  5. idea android 模块,IntelliJ IDEA 12 - 新的Android应用程序模块向导失败,“无法找到模块的资源目录”...
  6. labelme实例分割_MaskRCNN在多个实例数据集上实践
  7. 福昕高级PDF编辑器Mac版PDF编辑器注册机激活下载版
  8. Axure 9 编辑窗口中的负坐标空间
  9. 计算机安全中采用的用户身份验证技术主要有,探究用户身份认证技术在信息安全中运用的意义...
  10. Excel换行显示的几种方法,你知道吗?
  11. 应用Joyoshare VidiKit裁剪视频的小技巧
  12. 初识MIMO(六):MU-MIMO的仿真
  13. 几个常用的免费高清无版权图片网站
  14. 国三数据库系统工程师与软考中的数据库工程师,谁的难度更高?
  15. android 手柄助手,新游手柄助手app
  16. 苹果7 plus手机显示无服务器,天了噜!iPhone 7 Plus 居然有这些功能!非买不可!...
  17. 如何把 Node.js 嵌入自己的项目中
  18. GWAS-性状间相关性图的绘制
  19. JAVA练习114-猫和老鼠
  20. LeetCode 回旋镖的数量

热门文章

  1. Python代码优化之in关键字
  2. 计算机管理员初级试题及答案,计算机管理员测试题及答案.doc
  3. mybatis 自定义转换规则_Mybatis使用小技巧-自定义类型转换器
  4. 【数据结构----笔记1】查找算法之【顺序查找和折半查找】
  5. 爬虫推特数据分析的外文文献_高效阅读英文文献你必须知道的技巧
  6. matlab 判断元素索引_MATLAB通过索引访问数组元素
  7. C++基础与深度解析第零章:C++基础笔记
  8. r统计建模与r软件期末考试题_“统计学诺贝尔奖”授予 R 语言软件工程师 Hadley Wickham | 科研圈日报...
  9. Linux系统如何配置64个IP,Linux系统配置IP
  10. h710阵列卡支持最大硬盘_戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)