欢迎光临散文网 会员登陆 & 注册

(基于ARM的)微机原理与接口技术笔记(5)

2021-10-14 22:53 作者:会整活的剑人  | 我要投稿

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.存储器访问指令

分为单寄存器操作指令多寄存器操作指令

ldrstr访问内存变量

程序加载数据到PC实现散转

单寄存器加载/存储可以实现32位/16位/8位

零偏移:Rn就是地址

前索引偏移:先对[]计算OFFSET,得到地址,然后取地址 !执行完Rn变化

程序相对偏移:

后索引偏移:先对[]取地址后算OFFSET 下一次影响

ldr r2,[r5] ;把r2
str r1,[r2,#0x04] ;把r1的值扔到[r2+0x04]的地址 r2的值不变


pdf下载:


(基于ARM的)微机原理与接口技术笔记(5)的评论 (共 条)

分享到微博请遵守国家法律