(基于ARM的)微机原理与接口技术笔记(5)
ARM(7TDMI)的指令(复习)
一般的ARM指令形式: 32位ARM指令集(4字节) 16位Thumb指令集(2字节)
一般的ARM汇编格式,其中<>
内是必须的 {}
内的是可选的.
Rd
目标寄存器 Rn
操作数 operand2
第二操作数
<opcode> {<cond>}{s} <Rd>,<Rn>{,<operand2>}
数据处理
存储器访问
分支跳转
条件码:基于状态寄存器高4位(N
负数标志,Z
零标志,C
进位借位,V
溢出)指令条件执行
operand2
可以是
寄存器 R0-R15
寄存器进行移位以后
立即数
#immed_8r
常数表达式 可以由8位二进制数通过循环右移偶数位可以得到的数算术移位(右)
逻辑移位(左,右)
寄存器方式下
operand2
即为寄存器的值例如
sub r1,r2,r2
addeq r2,r4,r5;条件执行sub r0,r0,r1,lsl #4
;r0是目标寄存器 r0减(r1逻辑左移位4)扔到r0寄存器移位方式
立即数方式
ARM(7TDMI)的寻址方式
寻址:
处理器如何根据指令中的地址来寻找真实操作数的地址
外设(IO口等)可以映射到内存里当做内存处理
操作数可能在
(1)指令中直接给出
(2)寄存器
(3)内存单元
ARM处理器8种寻址方式
寄存器寻址
操作数就是寄存器 取寄存器的数值 来的很快
举例
mov r1,r2;把r2的值扔到r1里面
sub r0,r1,r2;把[r1的值减去r2的值]扔到r0里面设r1:
0x55
r2:0xaa
在
mov r1,r2
后r1:0xaa
r2:0xaa
立即寻址
immediate
指令里面带操作数举例
subs r0,r0,#1 ;把r0减1扔到r0并影响状态位
mov r0,#0xff000 ;把0xff000扔到r0设r0:
0xaa
执行mov r0,#0xff000
寄存器偏移寻址
ARM指令集特有,寄存器值移位后
举例
mov r0,r2, lsl #3 把[r2左移3位]扔到r0
ands r1,r1,r2,lsl r3 ;把[r2左移[r3]位 和r1与]扔到r1注意r2的真实值不变
寄存器间接寻址
从内存读数据/写内存
举例
ldr r1,[r2];此处r2储存的是地址(类比指针) 把r2指向的内容扔到r1
swp r1,r1,[r2];把r1的值的r2指向的存储内容交换注意r2是地址.执行时间要长()
基址寻址
基址寄存器中内容(地址)+偏移量OFFSET得一个地址
offset为0则为间接寻址
举例
ldr r2,[r3,#0x0c] ;r3是地址 offset 0x0c
str r1,[r0,#-4] ;把r1的内容保存到[r0的地址-4]的内容先算offset再寻址
多寄存器寻址
一次搬一堆,把内存中一堆连续32位数搬到多个寄存器
或者反过来把多个寄存器的值扔到内存中
最多16个
举例
ldmia r1!,{r2-r7,r12};把r1储存的地址处连续的数据扔到{r2到r7,r12} (r1自动偏移)
stmia r0!,{r2-r7,r12};把{r2到r7,r12}的值扔到r1储存的地址处(连续的 r0自动偏移)r1!
表示执行完指令r1的值会变化这个指令ARM指令集肯定有 Thumb可能没有
堆栈寻址(其实只是用的栈)
STACK
是一个按特定顺序进行存取的区域.后进先出.人为在内存中划的(可以认为是"设置栈指针和栈大小")主要保存临时数据,"函数调用栈"
STACK OVERFLOW
有2种 上溢/下溢 (也有可能没事?但是会导致runtime error )向上生长(扔一个数进栈,栈指针向上)
向下生长(栈从高地址开始,扔一个数进栈,栈指针向下)
栈指针
SP
进栈LDM 出栈STM
后期arm指令有PUSH或者POP like this
相对寻址
基于PC(R15)的寻址,加上OFFSET得到一个地址
(可能有错)
ARM指令集(及其汇编语言)
全部是ARM7的ARM指令
先上例子
area example1,code,readonly ;用分号注释
entry
code32
start mov r0,#0
mov r1,#10
loop bl add_sub
b loop
add_sub
adds r0,r0,r1
mov pc,lr
end
1.存储器访问指令
分为单寄存器操作指令和多寄存器操作指令
ldr
和str
访问内存变量
程序加载数据到PC实现散转
单寄存器加载/存储可以实现32位/16位/8位
零偏移:Rn就是地址
前索引偏移:先对[]
计算OFFSET,得到地址,然后取地址 !
执行完Rn变化
程序相对偏移:
后索引偏移:先对[]
取地址后算OFFSET 下一次影响
ldr r2,[r5] ;把r2
str r1,[r2,#0x04] ;把r1的值扔到[r2+0x04]的地址 r2的值不变
pdf下载: