文章目录
汇编语言长什么的样子呢?
-
举例:向寄存器中一个值添加100
x86:add eax,#100
68K:ADD #100,D0
ARM:add r0,r0,#100 -
举例:从一个寄存器指针加载到寄存器
x86:mov eax,DWORD PTR[ebx]
68K:MOVE L (A0),D0
ARM:ldr r0,[r1] -
举例:ARM起始代码结构
-
ARM汇编指令格式:
Operation[cond]{status} Rd,Rn, Operand2
ARM汇编
指令条件和状态Status码
- 条件码(cond)
- 状态码(Status)
ARM汇编寻址方式
- 立即数寻址:
ADD R0,R0,#0x3F - 寄存器寻址:
ADD R0,R1,R2 - 寄存器间接寻址
LDR R0,[R1]
STR R0,[R1] - 寄存器移位寻址
ADD R3,R2,R1,LSL #2 (R1 左移两位再加上R1,然后赋值给R3) - 基址地址寻址
LDR R0,[R1,#4] (把R1地址加上4所指向的值赋值给R0)
LDR R0,[R1],#4(把R1地址取出的值加上4赋值给R0)
LDR R0,[R1,R2] - 多寄存器寻址
LDMIA R0,{R1,R2,R3,R4} - 相对寻址
BL NEXT (跳转到NEXT)
MOV PC,LR
数据操作(ALU操作)
逻辑操作(与,或,非,异或)
比较操作
内存操作
单寄存器读写指令
多寄存器读写指令
- 地址模式
(1)数据块模式:IA(传输后地址加4),IB(传输前地址加4),DA(传输后地址减4),DB(传输前地址减4)
(2)堆栈模式:满底层堆栈,EA(空递减堆栈),FD(满递减堆栈),ED(空递增堆栈),FA(满递增堆栈)
数据交换指令
跳转,状态操作
Opcode | Operands | Description | Function |
---|---|---|---|
B | 跳转指令 | pc<-label | |
BL | 带返回的连接跳转 | pc->-label | |
BX | 跳转并切换状态Thumb | ||
BLX | 带返回的跳转并切换状态Thumb |
状态寄存器操作
状态寄存器操作:把32位指令分为四个域:[7:0]控制位域c,[15:8]扩展位域x,[23:16]状态位域s,[31:24]条件标志位域f
Opcode | Operands | Description | Function |
---|---|---|---|
MRS | 把程序状态寄存器的值传送到通用寄存器 | ||
MSR | CPSR R0 ;SPSR,R0;CPSR_c R0 | 通用寄存器到程序状态寄存器 |
异常产生指令
Opcode | Operands | Description | Function |
---|---|---|---|
SWI | SWI 0x02 | 软中断指令 | |
BKPT | BKPT | 断点中断指令 |
ARM伪指令
在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。
- 基本常用伪指令
汇编语言程序中常用的符号
- 符号命名约定:
(1)符号区分大小写,同名的大小写符号会被编译器认为是两个不同的符号。
(2)符号在其作用范围内必须唯一。
(3)自定义的符号不能与系统的保留字相同。
(4)符号名不应与指令或伪指令同名 - 符号,变量
ARM(Thumb)汇编程序所支持的变量有数字变量,逻辑变量和字符串变量
- 常量
(1)数字常量一般是32位的整数,当作为无符号数时,其取值范围为0 ~ 232-1,当作为有符号数时,其取值范围为-231 ~ 231-1
(2)逻辑常量只有两种取值情况:真或假
(3)字符串常量为一个固定的字符串,一般用于程序运行时的信息提示 - 变量代换符
程序中的变量可通过代换操作取得一个常量。代换操作符为:“”$“”
Sample:
LCLS S1
LCL S2
S1 SETS "Test!"
S2 SETS "This is a $S1" ;字符串变量S2的值为 This is a Test!
- 表达式和运算符
寄存器操作
寄存器操作
数据定义伪汇编
数据定义伪汇编
控制伪指令
Sample:
GBLL Test ;声明一个全局的逻辑变量,变量名为Test
……
IF Test = TRUE
指令序列1
ELSE
指令序列2
ENDIF
GBLA Counter ;声明一个全局的数学变量,变量名为Counter
Counter SETA 3 ;由变量Counter控制循环次数
……
WHILE Counter < 10
指令序列
WEND
MACRO
$OP hello world $param1,$param2
MOV R3,#0x02
MEXIT
MEND