c - arm7tdmi汇编讲解+崩溃调试

标签 c gcc assembly arm embedded

我目前正在调查在arm7tdmi 架构上使用gcc 4.2.1 编译时发生的崩溃(我可以按需使用4.9.3)。我正在使用 LPC2387 并且我正在重置 wdog。我使用的是 wdog 中断,而不是 wdog 重置,因此当它以其他方式重置时,它会进入我的处理程序,该处理程序保存状态并打印整个内存转储(仅 64k)。所以基本上我知道 wdog 重置之前的寄存器,并且有一个显示所有调用历史记录的堆栈。

在堆栈上,我可以看到对函数末尾的大量引用,并且我看到许多指令作为内存区域中的数据。我认为这将成为停止的原因,然后是随后的 wdog 中断。有什么想法可能会发生什么吗?

我猜原因可能是在取消引用函数指针时,但我的函数似乎非常简单。它涉及许多硬件寄存器(中断、外设启用/禁用)。

像这样:

2015/05/27 04:45:30: addr: 4000BF2C value:7FE00390 --> 根据 gcc 4.2.1,这是“svcvc 0x00e00390”,根据 4.9.3,这是“.word 0x7fe00390”。

还在函数末尾我在 gcc 4.9.3 中看到了这一点

   191d4:       e89d6ff8        ldm     sp, {r3, r4, r5, r6, r7, r8, r9, sl, fp, sp, lr}
   191d8:       e12fff1e        bx      lr
   191dc:       7fe00390        .word   0x7fe00390
   191e0:       40000044        .word   0x40000044
   191e4:       00064de5        .word   0x00064de5
   191e8:       00064dfb        .word   0x00064dfb
   191ec:       4000107c        .word   0x4000107c
   191f0:       e0028000        .word   0xe0028000
   191f4:       e01fc000        .word   0xe01fc000
   191f8:       40001084        .word   0x40001084
   191fc:       4000113c        .word   0x4000113c
   19200:       3800b010        .word   0x3800b010
   19204:       40002a78        .word   0x40002a78
   19208:       40002ab4        .word   0x40002ab4
   1920c:       40002aa0        .word   0x40002aa0
   19210:       40001080        .word   0x40001080
   19214:       400001a9        .word   0x400001a9
   19218:       e002c000        .word   0xe002c000
   1921c:       40001134        .word   0x40001134
   19220:       00064e0e        .word   0x00064e0e

它在 gcc 4.2.1 上看起来像这样:

   1953c:       7fe00390        svcvc   0x00e00390
   19540:       40000044        andmi   r0, r0, r4, asr #32
   19544:       0006d74c        andeq   sp, r6, ip, asr #14
   19548:       0006d764        andeq   sp, r6, r4, ror #14
   1954c:       400012d0        ldrmid  r1, [r0], -r0
   19550:       e0028000        and     r8, r2, r0
   19554:       e01fc000        ands    ip, pc, r0
   19558:       40001390        mulmi   r0, r0, r3
   1955c:       40001394        mulmi   r0, r4, r3
   19560:       e002c040        and     ip, r2, r0, asr #32
   19564:       40002e54        andmi   r2, r0, r4, asr lr
   19568:       e002c068        and     ip, r2, r8, rrx
   1956c:       e002c000        and     ip, r2, r0
   19570:       40002e90        mulmi   r0, r0, lr
   19574:       e002c02c        and     ip, r2, ip, lsr #32
   19578:       3fffc000        svccc   0x00ffc000
   1957c:       40002e7c        andmi   r2, r0, ip, ror lr
   19580:       3fffc0a0        svccc   0x00ffc0a0
   19584:       400012d4        ldrmid  r1, [r0], -r4
   19588:       400001a1        andmi   r0, r0, r1, lsr #3
   1958c:       400012d8        ldrmid  r1, [r0], -r8
   19590:       0006d778        andeq   sp, r6, r8, ror r7

有人可以解释一下这个函数的末尾是什么吗? .word 区域是什么?为什么我会在堆栈上看到指向该区域的指针?

谢谢, 彼得

最佳答案

函数 block 末尾之后的字节通常是数据。

例如如果我有 void *somePtr = 0xABCDEF12; 那么您通常会得到一个 LDR 指令,该指令将值放入寄存器中,并且假设小端操作,您将看到序列 12 EF CD AB(十六进制)。

关于c - arm7tdmi汇编讲解+崩溃调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30472331/

相关文章:

c - 用换行符在 C 中编码 Url?

c++ - 带有 -o3 标志的 g++ 中的链接器命令失败,退出代码为 1

c - 在内核空间中实现可变参数的可移植方法?

linux - 文件读取缓冲区在 nasm 中为空

c - 从csv文件中读取错误的数字 '\n'

c - sys_break 有什么作用?

c - 可以使用静态链接使用的库构建共享库吗?

c - gcc -c 选项如何工作?

arrays - 64 位 NASM - 检索 2D 数组的元素

c++ - 为什么 LD_LIBRARY_PATH 无效?