现在开始我们学习汇编的操作符
与C的运算符类似,汇编也包含大部分C支持的运算符,并且优先级设定都相似。
- 下面列举汇编中特有的操作符,注意SFB的使用
-
BYTE1 例子: BYTE1 0xABCD –> 0xCD
-
BYTE2 例子: BYTE2 0x12345678 –> 0x56
-
BYTE3,BYTE4
-
DATA1 当前秒
-
DATA2 分
-
DATA3~DATA6
-
HIGH 获取16位的高8位
-
LOW 低8位
-
HWRD 获取32位的高16位
-
LWRD 低16位
-
SFB SFB(section [{+|-}offset]) 获取section的开头加减偏移之后的地址,其中section变量就是定义的SECTION的名字
-
SFE section的结尾
-
SIZEOF SIZEOF section .SIZEOF 大小就是SFE-SFB (offset=0)
- 指令(Page79)
指令按功能可以分为多种,下面一一列举
- Module control directives(模块控制)
指令 | 注释 |
---|---|
name / program | 开始一个并定义一个module |
end | 结束module定义 忽略后面的代码 |
rtmodel | module link时的标识 |
PRESERVE8 | 模块属性设置,表明这个模块需要栈8字节对齐 |
REQUIRE8 | 模块属性设置,表明如果调用这个模块需要8字节对齐的栈 |
rtmodel作用详解, 格式:RTMODEL key, value
其中key和value都是字符串,当不同module中的rtmodel的key和value都一致的时候,表示这些模块不能link到一起。
- Symbol control directives(Symbol控制)
指令 | 注释 |
---|---|
EXTERN symbol | 导入一个外部的symbol |
IMPORT symbol | 与extern一样 |
EXTWEAK symbol | 同上,但是symbol可以是空 |
PUBLIC symbol | 导出一个symbol |
PUBWEAK symbol | 同上,但是可以重名覆盖 |
REQUIRE symbol | 链接时 包含定义这个symbol定义的文件 |
- Mode control directives(模式控制)
指令 | 注释 |
---|---|
arm /code32 | 指示接下来的指令时32位arm指令,并且labels 的bit0 永远置0,来确保4字节对齐 |
code16 | 16位thumb指令集,并且labels 的bit0 永远置1,确保2字节对齐 |
thumb | 根据cpu型号,可以时thumb-1 也可以是thumb-2 |
code | 代码段 |
data | 数据段 |
指令集切换需要跳转指令。
只有在code段的labels的bit0位是固定的,Data段的bit0是可以自由设定的。
-Section control directives(块控制)
指令 | 注释 |
---|---|
ALIGN align | 对齐,2的align次幂 |
ALIGNRAM align | 对齐,2的align次幂 ,对齐方式是以指针累加 |
ALIGNROM align | 对齐,2的align次幂 ,对齐方式是内容填充0 |
EVEN | 对齐到偶地址 |
ODD | 对齐到奇地址 |
SECTION segment :type [:flag] [(align)] | 定义一个section,其中[]里面变量可选 |
RSEG segment :type [:flag] [(align)] | SECTION 的别名 |
SECTION_TYPE type-expr {,flags-expr} | 设置section类型 |
type有下面几种:
- CODE,CONST,DATA
flag有下面几种:
- ROOT(默认)
- NOROOT :表示如果linker没有用到这个section,就忽略它。
- REORDER(默认),如果存在这个section就在这里面添加新的片段
- NOREORDER ,直接创建一个新section
-Value assignment directives(变量赋值指令)
指令 | 注释 |
---|---|
label ASSIGN value | 设定一个变量label,值=value |
SET ,SETA,VAR | 同上 |
label EQU value | 设定一个常量 ,可以使用public 导出,extern导入 |
= | 同上 |
label DEFINE value | 同上 |
-Conditional assembly directives(条件汇编)
IF,ELSE,ELSEIF,ENDIF 4个指令,与C类似
-Macro processing directives(宏处理)
指令 | 注释 |
---|---|
name MACRO var1,var2… | 定义一个宏叫做name,包含变量var1,var2… |
endm | 宏定义结束 |
REPT value | 循环value次 |
REPTC | 循环,并替代一个字符 |
REPTI | 循环,并以string代替 |
ENDR | 结束循环 |
EXITM | 退出宏 ,不能出现在循环里面 |
local symbol | 创建一个宏内的变量 |
如果有多个参数,那么用\1~\9 and \A-\Z表示其中的某一个
REPTC 和REPTI 区别见(Page 102~103)
-
Listing control directives(列表控制指令)
-
控制编译的某些信息的显示隐藏。
-
C-style preprocessor directives(C预定义指令)
IAR 汇编可以使用下列C风格的指令:
-
Data definition or allocation directives(数据定义指令)
指令 | 注释 |
---|---|
DC8,DCB | 8 BIT 常量 |
DC16,DCW | 16 BIT 常量 |
DC24 | 24 BIT 常量 |
DC32,DCD | 32 BIT 常量 |
DF32,DF64 | 32/64 浮点常量 |
DS8/DS value | 分配value个8bit数 |
DS16 value | 分配value个16bit数 |
DS24 value | 分配value个24bit数 |
DS32 value | 分配value个32bit数 |
- Assembler control directives(汇编程序控制指令)
指令 | 注释 |
---|---|
$file | include一个file,$必须是行的第一个字符 |
INCLUDE file | 同上 |
CASEOFF,CASEON | 禁用/启用 大小写敏感 |
radix value | 修改立即数的进制,默认10进制,可以用radix 16 改为16进制,但是改为10进制必须使用radix 0x0a |
-
Function directives(功能指令)
-
未使用