【发布时间】:2013-03-10 15:47:24
【问题描述】:
我正在尝试编写一个程序来使用 ARM-C 互通计算数字的指数。我正在使用 LPC1769(cortex m3) 进行调试。以下是代码:
/*here is the main.c file*/
#include<stdio.h>
#include<stdlib.h>
extern int Start (void);
extern int Exponentiatecore(int *m,int *n);
void print(int i);
int Exponentiate(int *m,int *n);
int main()
{
Start();
return 0;
}
int Exponentiate(int *m,int *n)
{
if (*n==0)
return 1;
else
{
int result;
result=Exponentiatecore(m,n);
return (result);
}
}
void print(int i)
{
printf("value=%d\n",i);
}
这是补充上述 C 代码的汇编代码
.syntax unified
.cpu cortex-m3
.thumb
.align
.global Start
.global Exponentiatecore
.thumb
.thumb_func
Start:
mov r10,lr
ldr r0,=label1
ldr r1,=label2
bl Exponentiate
bl print
mov lr,r10
mov pc,lr
Exponentiatecore: // r0-&m, r1-&n
mov r9,lr
ldr r4,[r0]
ldr r2,[r1]
loop:
mul r4,r4
sub r2,#1
bne loop
mov r0,r4
mov lr,r9
mov pc,lr
label1:
.word 0x02
label2:
.word 0x03
但是在调试会话期间,我遇到了执行“Exponentiatecore(m,n)”的 Hardfault 错误。
如调试窗口所示。
Name : HardFault_Handler
Details:{void (void)} 0x21c <HardFault_Handler>
Default:{void (void)} 0x21c <HardFault_Handler>
Decimal:<error reading variable>
Hex:<error reading variable>
Binary:<error reading variable>
Octal:<error reading variable>
我是在对齐过程中造成了一些堆栈损坏,还是我的解释有误? 请帮忙。 提前谢谢你
【问题讨论】:
-
我不知道你的错误是什么,但对你已经尝试过的事情 +1。
-
@rekire 是讽刺还是欣赏?
-
赞赏:恕我直言,新用户以如此好的方式完成其家庭作业并不常见。
-
根据this forum post,您可以在硬故障异常处理程序中使用此获取发生异常的PC:
MRS R0,PSP/LDR R1,[R0,#24]。一旦您知道是哪条指令导致了硬故障,就应该更容易找出原因。 -
@Michael 感谢您的建议。硬故障是由于从 1. 第一次从汇编切换到 C 时压入链接寄存器的值引起的 bl Exponentiate (lr=0x27B) 2. 第二次从 C 切换到汇编 --- result=Exponentiatecore(米,n); (lr=0xfffffff9) 我知道我正在破坏返回值,但是如何在第一个开关中保存 lr 值??
标签: pointers assembly stack pass-by-reference lpc