












R0-R12

The LR is used to store the return address of a subroutine or a function call
• The program counter (PC) will load the value from LR after a function is finished

xPSR: combined Program Status Register
• Provides information about program execution and ALU flags

• Application PSR (APSR)
• Interrupt PSR (IPSR)
• Execution PSR (EPSR)

16的8次方=2的32次方=2的三十次方*4
注意这里1GB=2**30 和常规不同





- 在 Cortex - M4 中,1MB 的 SRAM 位带区存在位带特性。对于位带区,每一个 32 字节的内存块(称为位带别名区)对应位带区中的 1 字节。总共1MB∗32 位


Aalias=0x22000000+((Abit−band−0x20000000)×32)+(bit number×4)



取最小的两个

取最小的四个

signed符号拓展,取最小的两个,用F替换前面的所有0


操作名要背

第一次先将0x87654321存入r0,shift r0到0x20000004
第二次直接先将r0 shift到0x20000008,r1写入新的r0,写完后将r0 shift到r0+4 0x200000C
最后一次正常往后写
所以选A

Lowest register对应Lowest memory,
push with the lowest, pop with the lowest
括号里的顺序不重要

但注意下题单独记忆
多次push,后续的memory address 会越来越小,反过来后续的pop在register中越来越大



1. ADDS r3, r0, r1, LSL #4
-
指令含义:将
r1逻辑左移 4 位(r1变为0x00000010),然后与r0相加,结果存到r3,同时更新标志位。 -
计算过程:
0xFFFFFFFE + 0x00000010 = 0x0000000E。-
N(Negative):结果为正,所以
N = 0。 -
Z(Zero):结果不为 0,所以
Z = 0。 -
C(Carry):加法过程有进位(从全 F 加出了非全 F 的结果),所以
C = 1。 -
V(Overflow):没有发生溢出(运算前后符号未改变 ),所以
V = 0。
-
2. SUBS r3, r0, r0
-
指令含义:
r0 - r0,结果存到r3并更新标志位。 -
计算过程:
0xFFFFFFFE - 0xFFFFFFFE = 0x00000000。-
N(Negative):结果为正,所以
N = 0。这个只看首位是否是1 -
Z(Zero):结果为 0,所以
Z = 1。 -
C(Carry):减法可看作加法逆运算,相当于加上补码,这里操作数相同,有借位(相当于进位 ),所以
C = 1。 -
对于
SUBS r3, r0, r0(r0 = 0xFFFFFFFE)的分析 - 计算
r0 - r0,即0xFFFFFFFE - 0xFFFFFFFE,转换为加法就是0xFFFFFFFE + (- 0xFFFFFFFE)。 - 0xFFFFFFFE的补码计算:0xFFFFFFFE按位取反得到0x00000001,再加 1 得到0x00000002。- 那么
0xFFFFFFFE + 0x00000002,在 32 位二进制加法运算中,从右往左逐位相加,会产生进位(最右边的位相加就会进位 ),一直到最高位,最终结果是0x00000000。 - 这里产生的进位,在减法中就相当于借位 。在 ARM 指令集中,对于减法操作,当有借位时(等同于这种加法形式下的进位 ),进位标志
C就会被置为 1 。所以在SUBS r3, r0, r0这个操作中,C = 1。 -
V(Overflow):没有溢出(运算前后符号未改变 ),所以
V = 0。 -
(例如两个很大的负数相加突然变成正数才算overflow)
-
3. ADDS r3, r0, r2
-
指令含义:
r0 + r2,结果存到r3并更新标志位。 -
计算过程:
0xFFFFFFFE + 0xFFFFFFFD = 0xFFFFFFFB。-
N(Negative):结果为负,所以
N = 1。 -
Z(Zero):结果不为 0,所以
Z = 0。 -
C(Carry):加法有进位(从全 F 加出了非全 F 的结果 ),所以
C = 1。 -
V(Overflow):没有溢出(运算前后符号未改变 ),所以
V = 0。
-
4. LSRS r3, r0, #1
-
指令含义:将
r0逻辑右移 1 位,结果存到r3并更新标志位。 -
计算过程:
0xFFFFFFFE逻辑右移 1 位是0x7FFFFFFF。-
N(Negative):结果为正,所以
N = 0。 -
Z(Zero):结果不为 0,所以
Z = 0。 -
C(Carry):逻辑右移,移出的最低位为 0,所以
C = 0。 -
V(Overflow):逻辑右移不产生溢出,所以
V = 0。。
-
5. ASRS r3, r1, #1
-
指令含义:将
r1算术右移 1 位,结果存到r3并更新标志位。 -
计算过程:
r1 = 0x00000001,算术右移 1 位后为0x00000000。-
N(Negative):结果为正,所以
N = 0。 -
Z(Zero):结果为 0,所以
Z = 1。 -
C(Carry):算术右移,移出的最低位为 1,所以
C = 1。 -
V(Overflow):算术右移不产生溢出,所以
V = 0。
-
6. ANDS r3, r0, r2
-
指令含义:
r0与r2按位与,结果存到r3并更新标志位。 -
计算过程:
0xFFFFFFFE & 0xFFFFFFFD = 0xFFFFFFFC。-
N(Negative):结果为负,所以
N = 1。 -
Z(Zero):结果不为 0,所以
Z = 0。 -
C(Carry):按位与操作不影响进位标志,这里保持初始值(初始为 0 ),但题目中用
x表示未定义,对于按位与操作确实不明确进位的定义情况,所以这里标志位情况合理。 -
V(Overflow):按位与操作不产生溢出,这里标志位用
x表示未定义也合理。
-

看书,略

被折叠的 条评论
为什么被折叠?



