str和ldr指令不使用相同的地址

时间:2012-05-11 13:46:06

标签: gcc assembly arm mmu

我有这个奇怪的问题,MMU为str而不是ldr指令翻译内存。我正在使用gcc(没有优化)为arm7TDMI编译。

程序输入一个函数并在堆栈中存储4个参数(r0到r3) 我有这些寄存器:

r0 = 0x1e10c8
r1 = 0x12adf0
r2 = 0x0
r3 = 0x2
r11 = 0x12ade4

MMU处于活动状态,0x0和0x00FFFFFF之间的所有物理位于0xC0000000和0xC0FFFFFF之间

pc执行这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" 

任何帮助将不胜感激!!

0 个答案:

没有答案