- 50
- 0
- 约1.81万字
- 约 19页
- 2019-10-26 发布于湖北
- 举报
ARM 汇编程序语言设计
(教学使用,请勿转载)
By Li Yang
E-Mail:liyangth@
一. 内嵌汇编语法
使用内嵌汇编,要先编写汇编指令模板,然后将C语言表达式与指令的操作数相关联,并告诉GCC 对这
些操作有哪些限制条件。
例如在下面的汇编语句:
__asm__ __volatile__ (movl %1,%0 : =r (result) : r (input));
说明:
movl %1,%0\n\t是指令模板;
%0和%1代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语言表达式与指令操作数相
对应。
指令模板后面用小括号括起来的是C语言表达式,本例中只有两个:“result”和“input”,
他们按照出现的顺序分 别与指令操作数“%0”,“%1”对应;
注意对应顺序:第一个C 表达式对应“%0”;第二个表达式对应“%1”,
依次类推,操作数至多有10 个,分别用“%0”,“%1”….“%9”表示。
在每个操作数前面有一个用引号括起来的字符串,字符串的内容是对该操作数的限制或者说要求。
__asm__ __volatile__(
mov %0,%1\n\t
操作限制,r(只读寄存器), m(内存), =r(可写,左值),+r(读写,volatile)
: + (a) //输出部分:结果寄存器Rd;左值;
: r (b) //输入部分:Rn,Rm; 右值;
: r //物理寄存器,指出这个寄存器我修改过.
);
. 小结:
1. 输入部分输出部分
. r 输入部分,在进入asm前生成一段代码,用c变量更新占位符;
. 输入部分可以写常数;
. =r输出部分,在退出asm后生成一段代码,用占位符更新c变量;
2. 修饰符
. +r可读可写,一般在输出部分,在前后都更新;
+可读可写,如果为=则不能成为输入,即在进入asm前没有对作为输入部分的
a(%0)生成代码;
. =r, 影子寄存器
为每个占位符分配一个影子寄存器,不会用同一个寄存器来优化
3. 破坏部分
破坏:指出,告诉在进入__asm__前保存,出来后恢复这个你以后还会用到的物理寄存器。
二. 汇编程序设计语言
1. ARM数据处理指令
ARM 的数据处理指令由3类组成:
➢ 数据传输
➢ 算术逻辑运算
➢ 乘法指令
特点:
1. ARM CPU只能处理内部的寄存器,所以,ARM 数据处理指令只能对寄存器的内容进行操作.
2. 所有 ARM 数据处理指令均可选择使用 S 后缀,以影响状态标志.比较指令 CMP,CMN,TST
和 TEQ 不需要后缀 S,它们会直接影响状态标志.
1.1. 数据传输指令
MOV
将 8 位图立即数或寄存器(operant2)传送到目标寄存器 Rd,可用于
移位运算等操作.指令格式如下:
e.g:
MOV R1,#10 ;R1=10
MOV R1,R2 ;R1=R2
MVN
将 8 位图立即数或寄存器(operand2)按位取反后传送到目标寄存
器(Rd),因为其具有取反功能,所以可以装载范围更广的立即数.指令格式如下:
e.g:
MVN R1,#0XFF ;R1=0xFFFFFF00
MVN R1,R2 ;R1=~R2
1.2. 算术逻辑运算
1) 算术+-*法:
ADD
加法运算指令.将 operand2 数据与 Rn 的值相加,结果保存到 Rd 寄存器.指令格式如
下:
e.g:
ADD R1,R1,R2 ;R1=R1+R2
ADD R3
原创力文档

文档评论(0)