汇编语言的指令格式目前有两种不一样的标准:Windows下的汇编语言基本上都遵循Intel风格的语法,好比:MASM、NASM,Unix/Linux下的汇编语言基本上都遵循AT&T风格的语法。 下面主要介绍Unix/Linux下的汇编,具体格式以下:express
[名称[:]] 指令码 源操做数SRC,目的操做数DST ;注释函数
开发一个OS,尽管绝大部分代码只须要用C/C++等高级语言,可是和硬件相关部分的代码须要使用汇编语言;因为启动部分的代码有大小限制,使用精练的汇编能够缩小目标代码的Size;另外,对于某些须要被常常调用的代码,使用汇编能够提升性能。
若是咱们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,由于GCC/GAS只支持这种汇编语法。下面介绍GCC的内嵌汇编语法。
GCC 支持在C/C++代码中嵌入汇编代码,这些汇编代码被称做GCC Inline ASM——GCC内联汇编。这是一个很是有用的功能,有利于咱们将一些C/C++语法没法表达的指令直接潜入C/C++代码中,另外也容许咱们直接写 C/C++代码中使用汇编编写简洁高效的代码。工具
基本格式以下:性能
__asm__ [__volatile__] ( assembler template : [output operand list] /* optional */ : [input operand list] /* optional */ : [clobbered register list] /* optional */ );
(1)关键字“__asm__”,其实也能够写成“asm”。可是“asm”并非全部版本的GCC编译器都支持的,并且有可能和程序中别的地方定义的变量或函数名冲突,因此用“__asm__”的话,兼容性会好一点。 开发工具
(2)“__volatile__”关键字,这个是可选的,其做用是禁止编译器对后面编写的汇编指令再进行优化。通常状况下,本身写的汇编代码确定是本身进行设计优化过了的,若是编译器再进行优化的话,颇有可能效果还不如不优化,并且也有可能会出现奇怪的错误,因此一般都会带上这个关键字。一样,“__volatile__”也能够写成“volatile”,但可能兼容性会没那么好。优化
(3)汇编代码由4部分组成,分别是汇编代码模板、输出操做数列表、输入操做数列表和修改寄存器列表,下面进行介绍。.net
1)汇编代码模板设计
汇编代码部分是必需的,因此即便一行汇编代码没有也须要传入空字符串(""),不然会报错。全部的汇编代码必须用双引号括起来。若是有多行汇编代码的话,每一条语句都要用双引号括起来,而且在代码后面要加上换行符(“\n”或者“\n\t”)。这样作是由于GCC会将汇编代码部分做为字符串形式直接传给汇编器,加上换行符后,汇编器就能准确知道哪些字符串表示的是一条汇编语句。同时,为了增长可读性,每条汇编语句均可以换行。blog
2)输入操做数列表与输出操做数列表开发
前面介绍了,第二部分和第三部分分别表示输出操做数列表和输入操做数列表。
输入操做数表示要做为汇编代码输入的C表达式,而输出操做数恰好相反,表示汇编代码处理完后要输出结果的C表达式。若是有多个输出或输入表达式,须要用逗号(“,”)将它们分隔开来。
能够再前面的汇编代码模板中直接应用定义的输出操做数和输入操做数,其用法是使用百分号(“%”)后面接一个数字,0表示定义的第一个操做数,1表示定义的第二个操做数,依次类推。下面举个例子:
__asm__("mov %0, %1, ror #1" : "=r" (result) : "r" (value) );
这里%0表明后面定义的第一个操做数,即输出操做数,表明C语言中的result变量。%1表明定义的第二个操做数,即输入操做数,表明C语言中的value变量。其做用是将value的值右移一位,而后保存到result中。
每个操做数由三部分组成,分别是修改符(Modifier),限定符(Constraint)和C表达式,其中修改符是可选的。具体形式以下:
"[modifier]constraint" (C expression)
修改符和限定符要用双引号括起来,而C表达式要用括号括起来。那么这些修改符和限定符又是什么呢?有什么做用呢?
咱们接下来先来讲说所谓的限定符。能够看出,操做数在这里的做用是将C语言定义的变量与汇编语言中要使用到的变量进行一一对应。但并非全部的汇编指令均可以接受任何类型的变量做为输入或输出变量的,所以汇编器须要知道这些变量到底用在什么地方,从而帮助在传递以前作一些转换。经常使用的限定符主要有如下一些,并且汇编语句究竟是ARM的仍是Thumb的,对限定符的定义也会不一样:
参考文章 :
(1)如何在C或C++代码中嵌入ARM汇编代码 https://blog.csdn.net/Roland_Sun/article/details/42921131
(2)汇编与C/C++内联嵌入汇编 https://blog.csdn.net/Levet/article/details/78516307