简答题
1.简述ARM Cortex-M3不支持的ARMv6 Thumb指令及其原因。
答:Cortex-M3支持绝大部分的ARMv6 Thumb指令,但不支持以下两个指令。
● BLX#im:在使用立即数做操作数时,BLX 总是要切入 ARM 状态。因为 Cortex-M3只在 Thumb 状态下运行,故以此指令为代表的,凡是试图切入 ARM 态的操作,都将引发一个用法错误。
● SETEND:是由 v6 引入的,在运行时改变处理器端设置的指令(大端或小端)。因为Cortex-M3不支持动态端的功能,所以此指令也将引发错误。
2.简述ARM Cortex-M3不支持的ARMv7 Thumb指令及其原因。
答:Cortex-M3支持部分的ARMv7 Thumb指令,但有少量在ARMv7 Thumb中列出的指令不被支持,这大部分是与协处理器相关的一些指令,因为 Cortex-M3 不支持协处理器。Cortex-M3不支持的ARMv7 Thumb指令包括如下一些。
● MCR指令,该指令把通用寄存器的值传送到协处理器的寄存器中。
● MCR2指令,该指令把通用寄存器的值传送到协处理器的寄存器中。
● MCRR指令,该指令把通用寄存器的值传送到协处理器的寄存器中,一次操作两个。
● MRC指令,该指令把协处理器寄存器的值传送到通用寄存器中。
● MRC2指令,该指令把协处理器寄存器的值传送到通用寄存器中。
● MRRC指令,该指令把协处理器寄存器的值传送到通用寄存器中,一次操作两个。
● LDC指令,该指令把某个连续地址空间中的一串数值传送至协处理器中。
● STC指令,该指令从协处理器中传送一串数值到地址连续的一段地址空间中。
● CPS .WA指令,原因是Cortex-M3没有“A”位。
● CPS.W #mode 指令,原因是 Cortex-M3 的 PSR 中没有“mode”位。
● DBG 指令,该指令服务于跟踪系统的一条 hint 指令。
● PLD指令,用于预取数据。这是服务于cache 系统的一条hint 指令。因为在CM3 中没有cache,该指令就相当于NOP。
● PLI指令,这是预取指令。这是服务于cache 系统的一条hint 指令。因为在CM3 中没有cache,该指令就相当于NOP。
● YIELD指令,该指令用于多线程处理。线程使用该指令通知给硬件:我正在做的任务可以被交换出去(swapped out),从而提高系统的整体性能。
3.简述预索引和后索引的区别。
答:带预索引的数据传送可以用在多种数据类型上,并且既可用于加载,又可用于存储。后索引也要使用一个立即数offset,但与预索引不同的是,后索引始终是使用基址寄存器Rd 的值作为数据传送的地址的。待到数据传送后,再执行Rd←Rd+offset。其中,offset 可以是负数。
4.简述ARM Cortex-M3如何访问多重存储器。
答:ARM Cortex-M3可以采用LDM/STM指令访问多重存储器,它们相当于把若干个LDR/STR给合并起来了,有利于减少代码量。例如,
● LDMIA Rd!, {寄存器列表}:从 Rd 处读取多个字。每读一个字后 Rd 自增一次,16位宽度。
● STMIARd!,{寄存器列表}:存储多个字到 Rd 处。每存一个字后 Rd 自增一次,16 位宽度。
● LDMIA.W Rd!, {寄存器列表}:从 Rd 处读取多个字。每读一个字后 Rd 自增一次,32位宽度。
● LDMDB.W Rd!, {寄存器列表}:从 Rd 处读取多个字。每读一个字前 Rd 自减一次,32位宽度。
● STMIA.WRd!, {寄存器列表}:存储多个字到 Rd 处。每存一个字后 Rd 自增一次,32位宽度。
● STMDB.WRd!, {寄存器列表}:存储多个字到 Rd 处。每存一个字前 Rd 自减一次,32位宽度。