2

我有一个奇怪的问题,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" 

任何帮助将不胜感激!!

4

0 回答 0