一:ARM 汇编的标准
在 ARM 汇编中,所有标号都必须在一行顶格书写, 且前面不须要增加高级语言所用的冒号,而所有的指令都不能顶格书写。ARM 汇编器对标识符的大小写敏感,书写标号和指令时,字母大小写必须统一。在 ARM 汇编程序中, 一条 ARM 指令、伪指令或寄存器名,能够全副为大写字母, 也能够全副为小写字母, 但不能大小写混合编写应用。正文应用“;”(分号), 正文内容由“;”(分号)开始到此行完结,正文能够在一行的顶格书写。
规范的 ARM 指令格局为:[标号] < 指令 | 条件 |S> < 操作数 >[; 正文]
源程序中容许有空行, 适当的插入空行能够进步源代码的可读性。如果单行太长, 能够应用字符“\”将其分行,“\”后不能有任何字符, 包含空格和制表符等等。对于变量的设置,常量的定义,其标识符必须在一行的顶格书写。
汇编指令正确的例子和谬误的例子如下:
正确的例子:
谬误的例子:
二:符号
ARM 汇编中,符号能够代表地址、变量、数字常量,当符号代表地址时又称为标号,符号就是变量的变量名、数字常量的名称、标号,符号的命名规定如下:
1. 符号由大小写字母、数字以及下划线组成;
2. 除部分标号以数字结尾外,其它的符号不能以数字结尾;
3. 符号辨别大小写,且所有字符都是有意义的;
4. 符号在其作用域范畴内是惟一的;
5. 符号不能与零碎外部或零碎预约义的符号同名;
6. 符号不与指令助记符、伪指令同名。
三:常量
常量有数字常量、字符常量、布尔常量三种。
1. 数字常量有三种示意形式:
十进制数,如:12,5,876,0;
十六进制数,如:0x4387,0xFF0, 0x1;
n 进制数,用 n -XXX 示意,其中 n 为 2~9,XXX 为具体的数。如 2 -010111,8-4363156 等。
2. 字符常量
字符常量由一对单引号及两头字符串示意,规范 C 语言中的本义符也可应用。如果须要蕴含双引号或 $,必须应用""""和 $$ 代替。
例如:Hello SETS "Hello World!"
Errorl SETS "The parameter ""VFH""error$$2"
3. 布尔常量
布尔常量的逻辑真为 {TRUE},逻辑假为{FALSE}。
例如:testno SETS {FALSE}
四:指令的根本格局及阐明
ARM 是指令的根本格局为:
<opcode> {<cond>} {s} <Rd>, <Rn> {,<operand2>}
其中 <> 号内的项是必须的,{}号内的项是可选的。
各项阐明如下:
opcode: 指令助记符
cond: 执行条件
s: 是否影响 CPSR 寄存器的值
Rd: 指标寄存器
Rn: 第一个操作数的寄存器
operand2: 第二个操作数
条件码“cond”的应用能够实现高效的逻辑操作(节俭跳转和条件语句),进步代码效率。所有的 ARM 指令都能够条件执行,而 THUMB 指令只有 B(跳转)指令具备条件执行性能。如果指令不表明条件代码,将默认为无条件(AL)执行。
五:ARM 指令条件域
ARM 指令个别分为 5 个域:
第一个域是跟条件执行相干的 cond,即条件码域;
第二个域是指令代码域,即 opceode;
第三个域是地址基址 Rn,即第一个操作数,为寄存器
第四个域是指标或源寄存器 Rd;
第五个域是地址偏移或操作寄存器,操作数区,即 Op2;
上述指令的 5 个域为:0000 0010 1001 0001 0000 0000 0000 1000
条件的指令执行中,cond 有 4 位,共 16 种组合,跟 CPSR 配合决定指令是否执行,如表 2.1 所示。
例如:指令 ADDEQ R4,R3,#1,带 EQ 标记位,只有 CPSR 当中的 Z 地位才执行该指令。
其中,条件后缀和 S 后缀的关系如下:
1. 如果既有条件后缀又有 S 后缀,则书写时 S 排在前面,如 ADDEQS R1,R0,R2 该指令在 Z = 1 时执行,将 R0+R2 的值放入 R1,同时刷新条件标记位。
2. 条件后缀是要测试条件标记位,而 S 后缀是要刷新条件标记位。
3. 条件后缀要测试的是执行前的标记位,而 S 后缀是根据指令的后果扭转条件标记。
小结:
通过本节课的学习,咱们理解了在 ARM 汇编的标准、指令条件域以及 ARM 指令的格局:<opcode> {<cond>} {s} <Rd>, <Rn> {,<operand2>},其中 <> 号内的项是必须的,{}号内的项是可选的。