(基于ARM的)微机原理与接口技术笔记(6)
寻址方式(复习)
操作数可以在3个地方
(1)指令含有操作数 立即数寻址
(2)处理器内的寄存器 寄存器寻址 寄存器移位寻址
(3)存储器里面
间接寻址(操作数在存储器中 寄存器里面是指针)
基址寻址(指针+offset)
多寄存器寻址(寄存器组合[r0到r15])
堆栈寻址(指令里有sp 会有A/D,F/E
的标志 在ldm或stm
出现)
堆栈 STACK 内存中开的一片区域 初始化时规定大小
注:新一些的ARM有push和pop指令
起始:栈底 栈指针SP(指向栈顶)
递增栈:进栈SP向上增长
递减栈:进栈SP向下增长
空/满 堆栈
存储器访问
装载LDRxx
多寄存器加载LDM
把一片连续内存区域copy 低地址对应小编号寄存器
存储STRxx
多寄存器加载STM
后缀 A
执行后增减 B
执行前增减 I
增加 D
减少
举例:
ldmfd sp!,{r0-r7,pc}^ ;`^`表示带状态寄存器的恢复
stmfd sp!,{r0-r7,lr}
stmfd sp!,{r0-r7,pc}
数据处理指令
只能直接操作寄存器,不能操作内存.可以加s后缀以影响状态寄存器.
数值传送指令:mov
和mvn
(寄存器到寄存器/立即数到寄存器,不能访问内存) 和ldr
不同的是ldr
从存储器加载(只能访问内存)
mov r0,r1 ;把r0传送给r1
mvn r0,r1 ;把r0按位取反后传送给r1
算术运算 逻辑运算 位运算
加 减 与 或 异或 格式:opcode{cond}{s} rd,rn,opcode2
add r3,r1,#0x08 ;加法 r3=r1+8
adds r3,r1,#0x08 ;影响cpsr的高4位
adc r1,r2,r1;带进位加法
sub r1,r2,r1;减法
rsb r1,r2,r1;逆向减法
sbc r1,r2,r1;带进位减法
rsc r1,r2,r1;带进位逆向减法
and r3,r1,#0xff ;r3=r1取低8位 r3=r1&(0xff)
orr r3,r1,r2 ;r3=r1|r2 (位或`|` 组合一些数)
eor r3,r1,r2,lsl 0x03 ;r3=r1^(r2*8) `^`按位异或 有桶型移位器
bic r1,r2,#0x0f ;位清零 r1=r2&(~(0x0f))
比较
格式opcode{cond} reg,op
必然影响状态寄存器
;假设r3=5
cmp r3,r1;数值比较 做r3-r1(减法) cpsr[31:28]NZCV 1010 影响NZCV
cmn r3,r1;做r3-(~r1)
tst r3,#0x02 ;做r3&r2(位与) 测试第2位 cpsr[31:28] NZCV 0100
teq r3,r2; 做r3^r2(位异或)影响Z不影响CV
分支(branch)指令
分支跳转
格式B{L}{cond} <target_addr>
24位跳转范围 不能任意跳转 24位扩展到30位,左移2位,加上pc值
mov pc,r14 ;直接改pc跳转 仿真器调试
b main;强制跳转到main
bx ;跳转切换模式A/T
bl label;把下一条指令地址放到链接寄存器 多用于子程序跳转 有的处理器用call指令
ARM汇编程序
指示命令
if else endif
while wend
{标号} dcd {}
全局变量 GBLA数值 GBLL逻辑 GBLS字符串
局部变量 LCLA数值LCLL逻辑 LCLS字符串
变量赋值 SETA SETL SETS
RLIST 寄存器组合
符号定义
数据定义
汇编控制
assembly control
条件汇编宏定义
语法
[标号]<指令|伪指令|汇编指示指令>[;注释]
程序段
area
area word,core,readonly
num equ 28
entry
start
ldr r0,=src
ldr r1,=dst
mov r2,#num
wordcopy
ldr r3,[r0],#4
str r3,[r1],#4
subs r2,r2,#1
bne wordcopy
stop
mov r0,#0x18
ldr r1,=0x20026
svc #0x123456
area blockdata,data,readwrite
src dcd 1,2,3,4,5
dst dcd 0,0,0,0,0
end
gitee链接: