B 无条件跳转:标志寄存器Z标志等于零,跳转到BEQ后的标签处 BL 无条件跳转带链接 BX 带状态切换的无条件跳转 BLX 带链接和状态切换的无条件跳转 B loc_地址 BEQ BNE BNE 跳转指令, 标志寄存器Z标志位不等于零时, 跳转到BNE后的标签处
存储器(主存, 内存) 存储器中的数据,可以是字符串,可以是数,也可以是地址,它可以放置各种类型的数据 存储地址单元:地址:(如0x000040000)存在于地址的值 LDR: 将数据从存储器加载到寄存器<--- Load LDR R8,[R9, #4] R8为待加载数据的寄存器, 加载值R9 0x4指向的存储单元 STR:存储存器的数据存储在存储器中 ---->Store STR R8,[R9, #4]将R8寄存器的数据存储到R9 0x4指向存储单元 LDM:将存储器的数据加载到寄存器列表中----> LDM R0,{
R1~R3}将R0指向存储单元的数据依次加载到R1, R2, R3寄存器中 STM:将寄存器列表的数据存储在指定的存储器中<--- PUSH:将寄存器值推入堆栈 POP:将堆栈值推向寄存器 SWP:交换寄存器和存储之间的数据 SWP R1, R1 [R0]将R1寄存器与R交换0指向存储单元的内容 堆, 队列:数据结构 栈是竖的:后进先出,数据只能从栈顶依次填充
MOV 将立即数或寄存器的数据输送到目标寄存器 MOV R0, #8 R0=8
ADD , SUB , MUL, DIV 有符号,无符号运算,带进位运算
与:AND 或:ORR 异或:EOR 移位:实质是乘, 除, 类似于小数点移位,但相反,小数点左移,数变小,右移变大 但逻辑移位,左移变大,右移变小,且按2的倍数进行,因为是2进制
LSL:逻辑左移
LSR:逻辑右移
LSL R0, R1 #2 R0=R1 * 4
CMP:比较
CMP R0 #0 R0寄存器中的值与0比较
标志位:如z位,这个都可以在动态调试时,寄存器窗口看到
立即寻址:MOV R0, #1234 R0=0X1234
寄存器寻址: MOV R0, R1 R0=R1
寄存器移位寻址:MOV R0, R1,LSL #2 R0=R1*4
寄存器间接寻址 LDR R0,[R1] 将R1寄存器中的值作为地址, 取出地址中的值赋予R0
寄存器间接基址偏移寻址:LDR R0,[R1, #-4]将R1寄存器的值-0x4的值作为地址,取出地址中的值给R0
对int a=0 这一句简单高级语言的汇编理解,首先开辟一个内存存储单元,然后把0x0这个数放入R0寄存器,然后在把R0寄存器的数据放入存储单元,所以
MOV R0, #0
STR R0,[R11, #014 + var_20]
八.其他指令:
协处理器指令:SWT(切换用户模式)
伪指令: DCB
<opcode>{
<cond>}{
S} <Rd>, <Rn>{
, <opcode2>}
其中, <>内的项是必须的, {
}内的项是可选的,如<opcode>是指令助记符,是必须的,而{
<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)
opcode 指令助记符, 如LDR STR等
cond 执行条件,如EQ, NE等
S 是否影响CPSR寄存器的值, 书写时影响CPSR, 否则不影响
Rd 目标寄存器
Rn 第一个操作数的寄存器
opcode2 第二个操作数
举例说明:
LDR R0, [R1] 读取R1地址上存储器单元内容,执行条件AL
BEQ DATAEVEN :跳转指令,执行条件EQ, 即相等跳转到DATAEVEN
ADDS R1, R1, #1 :加法指令, R1 + 1 = R1 影响CPSR寄存器, 带有S
SUBNES R1, R1, #0xD :条件执行减法运算(NE), R1-0xD=>R1, 影响CPSR寄存器,带有S