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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

第三章 3.2 3.3 3.4 3.6 3.8 3.9 3.12

第三章23468912

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存入通用寄存器中不包括PCR15
    (Page 70)

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

  8. ADD R3, [R3], R7

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

  9. LDR R11, [R15, R8]! correctR15+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
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6