嵌入式思考题第三章.docx

上传人:b****8 文档编号:30554603 上传时间:2023-08-16 格式:DOCX 页数:7 大小:18.65KB
下载 相关 举报
嵌入式思考题第三章.docx_第1页
第1页 / 共7页
嵌入式思考题第三章.docx_第2页
第2页 / 共7页
嵌入式思考题第三章.docx_第3页
第3页 / 共7页
嵌入式思考题第三章.docx_第4页
第4页 / 共7页
嵌入式思考题第三章.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

嵌入式思考题第三章.docx

《嵌入式思考题第三章.docx》由会员分享,可在线阅读,更多相关《嵌入式思考题第三章.docx(7页珍藏版)》请在冰豆网上搜索。

嵌入式思考题第三章.docx

嵌入式思考题第三章

嵌入式思考题(第三章)

嵌入式思考题(第三章)

1)Arm指令是有条件执行,常用的条件助记符EQ,NE,HI,LS是何意义?

条件码

助记符后缀

标志

含义

0000

EQ

Z置位

相等/是否为0

0001

NE

Z清零

不相等

1000

HI

C置位并且Z清零

无符号数大于

1001

LS

C清零或Z置位

无符号数小于或等于

2)一些指令不需要后缀“S”,也能更新条件码标志,是哪几个?

CMP,CMN,TST,TEQ(其唯一功能就是更新条件码标志)

3)第二操作数做立即数时,哪些是有效的,哪些是无效的?

立即数不能做为目标操作数的,但可以作为源操作数。

MOVAX,1234H这是正确的

MOV1234H,AX这是错误的

4)LSL、LSR、ASL、ASR、ROR、RRX的含义?

LSL:

逻辑左移(按操作数所指定的数量向左移位,低位用零填充)

LSR:

逻辑右移

ASL:

算术左移指令(每执行一次,将D通道中的数据按位左移一位最高位移到CY中,0移进最低位)

ASR:

算术右移指令

ROR:

循环右移指令(每执行一次,将D通道中的数据连同CY的内容,按位循环右移一位)

RRX:

带扩展的循环右移(按操作数所指定的数量向右循环移位,左端用进位标志位C来填充)

5)根据下面的指令,写出执行的结果:

ADDR3,R2,R1,LSR#2

R3=R2+R1>>1

LDRR0,[R1,R2,LSL#2]

将存储器地址为R1+R2<<2的字数据读入寄存器R0中

LDRR0,[R1,#4]!

将存储器地址为R1+4的字数据读入寄存器R0中,并将R1+4的值存入R1

LDRR0,[R3],-R8

将存储器地址为R3的字数据读入寄存器R0中,并将R3-R8的值存入R0

LDRR0,[R3],R8,LSL#2

将存储器地址为R3的字数据读入寄存器R0中,并将R3+R8<<2(即R3+R8*4)的值存入R0

STRBR0,[R3,-R8,ASR#2]

将寄存器R0的最低有效字节传送给R3-R8>>2(即R3-R8/4),R3和R8不变

LDREQSHR11,[R6]

(有条件地)将寄存器R6的值传送给R11,加载16位半字,带符号扩展到32位

STRHR4,[R0+R1]

将寄存器R4的值传送给地址为R0+R1的寄存器

STRDR4,[R9,#24]

将寄存器R4的值传送给地址为R9+24的寄存器,将寄存器R5的值传送给地址为R9+28的寄存器

6)根据下面的指令,写出执行的结果:

LDMIAR1,{R0,R2,R5}

((R1))->R0,((R1)+4)->R2,((R1)+8)->R5

LDMIBR1,{R0,R2,R5}

((R1)+4)->R0,((R1)+8)->R2,((R1)+12)->R5

LDMDAR1,{R0,R2,R5}

((R1))->R0,((R1)-4)->R2,((R1)-8)->R5

LDMDBR1,{R0,R2,R5}

((R1)-4)->R0,((R1)-8)->R2,((R1)-12)->R5

7)理解多寄存器寻址和堆栈寻之间的联系,分别写出堆栈寻找LDMFA、LDMED、STMEA、STMFD所对应的多寄存器寻找指令。

多寄存器寻址:

LDMIA:

 每次传送后地址加4;LDMIB:

 每次传送前地址加4;

LDMDA:

 每次传送后地址减4;LDMDB:

 每次传送前地址减4;

堆栈寻址:

LDMFA:

 满递减堆栈;LDMED:

 空递减堆栈;

STMFD:

 满递增堆栈;STMEA:

 空递增堆栈。

8)理解BIC、ORR、TST、EOR等指令的用途

BIC:

BIC(位清除)指令对Rn中的值和Operand2值的反码按位进行逻辑“与”运算。

BIC是逻辑”与非”指令,实现的BitClear的功能。

ORR:

ORR逻辑"或"操作指令指令格式为ORR{cond}{S} Rd,Rn,operand2。

ORR指令将操作数operand2 与Rn 的值按逻辑"或",结果存放到目的寄存器Rd 中。

TST:

Test测试指令用于将一个寄存器的值和一个算术值做比较。

条件标志位根据两个操作数做“逻辑与”后的结果设置。

EOR:

逻辑异或EOR(ExclusiveOR)指令将寄存器中的值和的值执行按位“异或”操作,并将执行结果存储到目的寄存器中,同时根据指令的执行结果更新CPSR中相应的条件标志位。

9)利用MRS/MSR如何禁止或者使能IRQ和FIQ的中断?

在ARM处理器中,只有MSR指令可以对状态寄存器CPSR和SPSR进行写操作。

与MRS配合使用,可以实现对CPSR或SPSR寄存器的读-修改-写操作,可以切换处理器模式、或者允许/禁止IRQ/FIQ中断等。

1,使能IRQ中断:

ENABLE_IRQ

    MRS    R0, CPSR           ;将CPSR寄存器内容读出到R0

    BIC    R0, R0,#0x80    ;清掉CPSR中的I控制位

    MSR    CPSR_c,R0         ;将修改后的值写回 CPSR寄存器的对应控制域

MOV    PC,LR                 ;返回上一层函数

2,禁用IRQ中断:

DISABLE_IRQ

    MRS    R0CPSR                 ;将CPSR寄存器内容读出到R0

    ORR    R0, R0,#0x80    ;设置CPSR中的I控制位

    MSR    CPSR_c,R0          ;将修改后的值写回 CPSR寄存器的对应控制域

    MOV    PC,LR                  ;返回上一层函数

10)软中断指令SWI的立即数如何获取?

理解立即数作为中断号时,整个中断服务程序的调用过程。

(结合“ucosII已移植好的实验代码”)

1,获取immed_24操作数:

LDRR0,[LR,#-4](将链接寄存器LR的内容减去4后所获得的值作为一个地址,然后把该地址的内容装载进R0)

BICR0,R0,#0xFF000000(将R0的高8位清零,并把结果保存到R0,意思就是取R0的低24位)

2,使用参数寄存器:

在执行SWI指令之前,给R0赋予某个数值,然后在SWI异常处理子程序中根据R0值实现不同的分支处理。

11)LDR伪指令通过何种方式实现任意立即数的赋值?

1,LDRpc,=MyHandleIRQ表示将MyHandleIRQ符号放入pc寄存器中

2,LDRPC,MyHandleIRQ表示将读取存储器中MyHandleIRQ符号所表示的地址中的值,及需要多读一次存储器。

12)Thumb指令与ARM指令有哪些不同?

1,Thumb指令可以看作是ARM指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度但是它不如ARM指令的效率高。

Thumb不是一个完整的体系结构,不能指望处理只执行Thumb指令而不支持ARM指令集。

因此,Thumb指令只需要支持通用功能,必要时可以借助于完善的ARM指令集,比如,所有异常自动进入ARM状态。

2,Thumb指令集没有协处理器指令,信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其它指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。

Thumb指令集与ARM指令的区别一般有如下几点:

跳转指令

程序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。

数据处理指令

数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第3个寄存器中.数据处理操作比 ARM 状态的更少,访问寄存器 R8~R15 受到一定限制。

除 MOV 和 ADD 指令访问器 R8~R15 外,其它数据处理指令总是更新 CPSR 中的 ALU 状态标志。

访问寄存器 R8~R15 的 Thumb 数据处理指令不能更新 CPSR 中的 ALU 状态标志。

单寄存器加载和存储指令

在 Thumb 状态下,单寄存器加载和存储指令只能访问寄存器 R0~R7。

批量寄存器加载和存储指令

LDM 和 STM 指令可以将任何范围为 R0~R7 的寄存器子集加载或存储。

PUSH 和 POP 指令使用堆栈指令 R13 作为基址实现满递减堆栈。

除 R0~R7 外,PUSH 指令还可以存储链接寄存器 R14,并且 POP 指令可以加载程序指令PC。

13)在非特权模式下能否对CPSR寄存器设置?

能否读取CPSR寄存器的值?

(提示:

参考实验程序有相应的代码,运行测试一下)

只有在特权模式下才允许对当前程序状态寄存器CPSR的所有控制位直接进行读/写访问,而在非特权模式下只允许对CPSR的控制位进行间接访问,但可以读取CPSR的值。

14)在非特权模式下如何使能/禁止IRQ或FIO中断?

(提示:

可以先使用SWI指令切换到管理模式)

使用SWI指令切换到管理模式。

15)程序中能不能通过MSR指令直接修改CPSR中的T位来实现ARM状态/Thumb状态的切换?

不能。

如果这样做的话不会清空流水线,是不安全的。

可以使用BX指令进行状态切换,程序跳转的同时进行状态切换,当程序发生跳转时流水线会被清空,流水线中按原来处理器状态进行取指和译码的指令(与当前处理器状态不符的指令)会被清除,也就不会引起处理器的错误。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1