第三章《嵌入式系统原理与实践》--沈建华 王慈 清华大学出版社 课后部分习题个人答案

文章详细介绍了ARM处理器支持的多种寻址方式,包括立即寻址、寄存器寻址、移位寻址、间接寻址、基址寻址、相对寻址和多寄存器寻址。还讨论了ARM指令的条件码,以及一些特定指令的含义,如SUB、MCRP和MLA。此外,文章还涵盖了堆栈操作,包括满堆栈、空堆栈和递增/递减堆栈的概念,并演示了一个简单的堆栈排序算法示例。

第三章 3.2 3.3 3.4 3.6 3.8 3.9 3.12

第三章2,3,4,6,8,9,12

3.2

ARM 处理器支持几种基本寻址方式?举例并分别说明。

  1. 立即寻址,立即数寻址
    操作数紧跟在操作码后面,与操作码一起放在指令代码段中

    MOV R0, #0001 立即数0001放入寄存器R0中

  2. 寄存器寻址
    操作数的值存在寄存器,指令中给出寄存器编号,执行时拿出寄存器的值操作

    MOV R1, R2 R2值存入R1

  3. 寄存器移位寻址
    类似寄存器寻址,但是加了一步位移操作

    MOV R1, R2, LSL #2 R2左移两位存入R1

  4. 寄存器间接寻址
    给出通用寄存器编号,把寄存器里面的 数据指向的储存单元的数据赋值给另一个寄存器

    LOD R1,[R2] R2内部数据直接给R1

  5. 基址寻址
    类似寄存器间接寻址,但加了一个立即数。寄存器里面的 数据 + 立即数表示的偏移量指向的储存单元的数据赋值给另一个寄存器

    LOD R1, [R2 + 100] R2+100地址的数据给到R1

  6. 相对寻址
    对寻址,相对寻址和基址变址寻址方式类似,以程序计数器PC 的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。

    BEQ LOOP
    LOOP:
    

    此处跳转到LOOP使用相对寻址

  7. 多寄存器寻址,多寄存器寻址可以实现一条指令完成多个寄存器值的传送

    LDMIA R0, {R1, R2, R3, R4}
    意思为 R 1 ← [ R 0 ] R 2 ← [ R 0 + 4 ] R1\leftarrow [R0] R2\leftarrow [R0+4] R1[R0]R2[R0+4]依此类推

  8. 堆栈寻址,堆栈使用一个叫作堆栈指针的专用寄存器指示当前操作位置,堆栈指针总是指向栈顶,堆栈由低地址像高地址生成时递增堆栈;堆栈由高到低为递减堆栈

    STMFD SP!,{R1-R7, LR}   ;R1`R7,RL入栈 
    LDMFD SP!,{R1-R7, LR}   ;出栈
    

3.3

ARM指令条件码是啥?默认天骄吗是啥,距离ARM指令条件码对指令执行影响

ARM指令基本格式
<opcode>{<cond>}{S}<Rd>,<Rn>,{<Op2>}

其中{<cond>}表示一个可选条件吗默认为1110,即无条件执行,如跳转指令B可以加上后缀EQ变BEQ,表示相等即跳转

3.4

解释说明指令含义

    1. SUB R0, R1, #256
    2. MCR P3, 3, R0, C4, C5, 6
    3. MLAS R0, R1, R2, R3
  1. RO = R1 - 256

  2. P3(协处理器)把C4和C5经过3操作结果放入R0

    MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断
    详细内容参考ARM汇编指令MCR/MRC学习

  3. R0 = R1 * R2 + R3(参考62页)

3.6

即使B指令、BL、BX指令差别并举例使用方法

B指令是分支指令,BL带链接,BX带状态转换(page 64)

  1. B指令跳转在 2 26 B = 64 M B 2^{26}B = 64MB 226B=64MB(32位指令占6位)

    B WAITA 跳转到WAITA标号处

  2. BL实现跳转且把跳转前PC值存入到LR中,范围同B,

    BL DELAY跳转到DELAY处且把PC-4存入LR中

  3. BX带状态切换
    BX R1跳到R1的地址,并查看R1[0]位。目标地址处的指令既可以是ARM 指令(R1[0] == 0, 对CPSR的T位清零, ,也可以是Thumb指令(R1[0]==1 设置T位1))
    汇编跳转指令B、BL、BX、BLX 和 BXJ的区别

3.8

解释满、空、递增、递减堆栈以及ARM如何支持

  1. 满堆栈:堆栈指针SP指向最后压入堆栈的数据
  2. 空堆栈:SP指向下一个将要放入数据的空位置
  3. 递增堆栈:堆栈从低地址到高地址生产
  4. 递减堆栈:堆栈从高地址到低地址生成

通过LDM、STM以及8个可选类型在堆栈进行读写数据操作(page 54)

3.9

鉴定指令是否正确

  1. MOVS R1, 101

    101前未加#号,应为#101

  2. MVN R1, #0X10F correct

  3. STMDA R11, {R2 - R8} !

    ! 表示数据要写进去的寄存器,所以表示R11储存进占后会存放进R2~R8中的所有寄存器,显然这是错误的。

  4. ADD R0!, R2, #4 correct

  5. LDR R4. [R5]!

    LDR存储单个寄存器,根据page 54应去掉!

  6. MRS PC. CPSR

    MRS吧CPSR存入通用寄存器中,不包括PC(R15)
    (Page 70)

  7. LDMFDS R0!, {R5 - R8, R2} correct

  8. ADD R3, [R3], R7

    ADD不访问存储器,应该去掉[]

  9. LDR R11, [R15, R8]! correct,R15+18存入R11,且R15 = R15 + R8

参考LDR指令

3.12

ARM有连续存放的数据,起始地址0x0332,数据块大小50对内部数据降序排序

AREA Reset, DATA, READONLY      ;Reset是默认的入口地址
    DCD 0X12345678      ;参加从0x80000000开始运行且将后4字节内容分给栈指针
;定义0x12345678方便观察
;DCD一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化
    DCD Reset_Handler   ;定义标号,作为输出
    AREA CODE_SEGMENT, CODE, READONLY;声明此处到END是一个代码段


Reset_Handler proc      ;初始化部分
;proc是定义子程序的伪指令,位置在子程序的开始处,它和endp分别表示子程序定义的开始和结束两者必须成对出现
    export Reset_Handler [weak];拷贝到SRAM
    MOV R0, #0X0332
    LDR R1, =ARRAY  ;ARRAY在最后
    MOV R5, #49     ;标号从0开始
    MOV R2, #0


COPY
    CMP R2, R5      ;32位数比较
    BGT SORT        ;大于跳转(Branch if Greater Than)调用SORT
    LDR R3, [R1, R2];R1+R2地址处数据读出保存到R1
    STR R3, [R0, R2];把寄存器的值存到一个内存的虚地址内间——按字长大小拷贝,指定内存地址
    ADD R2, #4;按字长(4字节)大小拷贝
    B COPY


SORT 
    MOV R2, #0
LOOP
    MOV R1, R2
    CMP R1, R5
    BEQ EXIT        ;完成一轮排序
    ADD R2, R1 #1
    LDRB R3, [R0, R1];单字节内存载入寄存器
    LDRB R4, [R0, R2]
    CMP R3 R4
    BGE LOOP; R3>=R4跳转到LOOP否则交换R3R4的内存
    STRB R4, [R0, R1]   ;字节数据存储指令
    STRB R3, [R0, R2]
    B LOOP
EXIT
    SUBS R5, #1     ;R5>0未完成所有排序,跳转SORT
    BGT SORT
    NOP
    ENDP        ;回去


ARRAY DCB
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50
;DCB 分配一段字节的内存单元,其后的每个操作数都占有一个字节,操作数可以为-128~255的数值或字符串
END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值