以下所述均为在GNU C语言中嵌入ARM汇编指令。
1、 所述嵌入汇编均指在GNU C语言中内嵌ARM汇编指令。
2、 两个参数的嵌套语句
3、 此类汇编适用于简单语句,参数限定输入输出格式如下所示。
4、 汇编语句与C语言之间的关联,主要通过上述asm声明中可选的输出操作数列表和输入操作数列表来实现。至于破坏列表的作用,将在后续内容中进行说明。
5、 将C语言的整型变量传入汇编,左移一位后,结果再传回另一个C语言整型变量。
6、 每个asm语句由冒号分为四个部分。
7、 将汇编指令置于第一部分的引号内。
8、 接下来是可选的输出操作数列表,位于冒号之后。每个条目由一对方括号包围的符号名构成,其后紧跟约束字符串,再后是圆括号及其括住的C语言变量。本例中仅包含一个这样的条目。
9、 冒号后为输入操作符列表,其语法与输入操作列表相同。
10、 通过换行、空格和C风格注释,可提升代码可读性。
11、 );
12、 代码中百分号后跟随的符号,对应方括号内相同操作符列表中的某一项。
13、 y代表第二部分的C变量,x代表第三部分的C变量。
14、 符号操作符拥有独立的命名空间,因此它们使用单独的符号表。这意味着无需担心所用符号名是否已在C代码中被占用。在早期C语言编程中,实现循环移位必须采用更为繁琐的写法。
15、 在汇编代码中,操作数通过%后接数字来引用,如%1表示第一个操作数,%2表示第二个,依此类推。尽管最新编译器仍支持此方式,但这种方式不利于代码的后期维护和阅读,容易造成混淆,降低程序可读性与可维护性。
16、 示例代码如下
17、 汇编代码文件以.s为扩展名
18、 编译指令:
19、 {
20、 }
21、 实现将首个输入参数进行编码转换的处理功能。
22、 将数据左移8位,与0x8000异或后复制至第三个参数位置。
23、 将首个参数指向的数据与0x8000进行异或运算,获取解码结果。
24、 将数据右移8位后复制到第三个参数中
评论
更多评论