我有一个奇怪的问题,MMU 将内存转换为 str 而不是 ldr 指令。我正在为 arm7TDMI 使用 gcc(无优化)进行编译。
程序输入一个函数并在堆栈中存储 4 个参数(r0 到 r3)我有这些寄存器:
r0 = 0x1e10c8
r1 = 0x12adf0
r2 = 0x0
r3 = 0x2
r11 = 0x12ade4
MMU 处于活动状态,并且 0x0 和 0x00FFFFFF 之间的所有内容在物理上位于 0xC0000000 和 0xC0FFFFFF 之间
电脑执行这 4 行汇编:
str r0, [r11, #-24]
str r1, [r11, #-28]
str r2, [r11, #-32]
strb r3, [r11, #-33]
这是内存的范围,执行后数据存储在其中:
0xC012ADC0 02000000 ....
0xC012ADC4 00000000 ....
0xC012ADC8 0012ADF0 ð..
0xC012ADCC 001E10C8 È...
而这个内存范围是在FF
0x0012ADC0 FFFFFFFF ÿÿÿÿ
0x0012ADC4 FFFFFFFF ÿÿÿÿ
0x0012ADC8 FFFFFFFF ÿÿÿÿ
0x0012ADCC FFFFFFFF ÿÿÿÿ
我们看到,由于 MMU,数据物理存储在 0xC0000000 区域中。
因为我处于调试模式,所以我可以使用以下值手动更改此区域:
0x0012ADC0 F4F4F4F4 ôôôô
0x0012ADC4 3F3F3F3F ????
0x0012ADC8 F2F2F2F2 òòòò
0x0012ADCC 1F1F1F1F ....
现在 2-3 组装执行后,我有这条组装线:
ldr r3, [r11, #-24]
我执行这一行,我在 r3 中有这个值:
r3=0x1f1f1f1f
(如果我不更改 0x0012ADC0 和 0x0012ADCC 之间的内存,我通常会得到 0xFFFFFFFF ...)
我真的不明白为什么 r3 不等于 0x1E10C8。这就像MMU在执行str命令时完成了它的工作,但是当执行ldr时,MMU没有翻译地址(0x0012ADCC而不是0xC012ADCC)。这里有一些我无法理解的东西。
以防万一,这里是所涉及的汇编指令的快照:
kapiReceiveQueue:
000195fc: push {r11, lr}
00019600: add r11, sp, #4
00019604: sub sp, sp, #32
00019608: str r0, [r11, #-24] <----- r0 stored physically at C012ADCC
0001960c: str r1, [r11, #-28]
00019610: str r2, [r11, #-32]
00019614: strb r3, [r11, #-33] ; 0x21
693 switch (Option)
00019618: ldrb r3, [r11, #-33] ; 0x21
0001961c: cmp r3, #2
00019620: beq 0x1974c <kapiReceiveQueue+336>
...
0001974c: ldr r3, [r11, #-24] <------ r3 get the value of physical address 0x12ADCC
00019750: ldr r2, [r3]
00019754: sub r3, r11, #17
00019758: mov r0, r2
如果这与我的编译标志有任何关系,它们是:
arm-none-eabi-gcc -march=armv4t -mcpu=arm7tdmi -dp -DNG_COMP_GCC -c
-Wa,-adhlns="../../Base/Lib/Pa/Kapi.o.lst" -fmessage-length=0 -fno-zero-initialized-
in-bss -MMD -MP -MF"../../Base/Lib/Pa/Kapi.d" -MT"../../Base/Lib/Pa/Kapi.d" -fpic
-mlittle-endian -Wall -DNGHW_TOPMEM_ADDR=0x00800000 -DNG_CPU_ARM -DNG_CPU_ARMv4T
-DNG_CODE_ARM -DNG_LITTLE_ENDIAN -DNG_DEBUG -DNG_RTOS -DNG_COMP_GCC -DNG_RTOS_UCOSII
-DDHCP_CLIENT -g3 -gdwarf-2 ../../Base/Kernel/Alos/Ucos-II/Kapi.c -o"../../Base/Lib/Pa/Kapi.o"
任何帮助将不胜感激!!