我正在尝试编写一个程序来使用ARM-C互通来计算数字的指数。我正在使用LPC1769(cortex m3)进行debuuging。以下是代码:
/*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>
我在对齐过程中是否存在堆栈损坏,或者我的解释是否存在错误? 请帮忙。 提前谢谢你
答案 0 :(得分:3)
您的代码存在一些问题。第一个是你有一个无限循环,因为你的SUB指令没有设置标志。将其更改为SUBS。下一个问题是你不必要地操纵LR寄存器。您不会通过Exponentiatecore调用其他功能,因此请勿触摸LR。该函数的最后一条指令应为“BX LR”以返回给调用者。问题#3是你的乘法指令是错误的。除了取3个参数外,如果你自己乘以数字,它会增长得太快。例如:
ExponentiateCore(10,4);
每个循环的值:
R4 = 10,n = 4
R4 = 100,n = 3
R4 = 10000,n = 2
R4 = 100,000,000 n = 1
问题#4是你正在改变一个非易失性寄存器(R4)。除非您保存/恢复它们,否则只允许丢弃R0-R3。试试这个:
Start:
stmfd sp!,{lr}
ldr r0,=label1
ldr r1,=label2
bl Exponentiatecore // no need to call C again
bl print
ldmfd sp!,{pc}
Exponentiatecore: // r0-&m, r1-&n
ldr r0,[r0]
mov r2,r0
ldr r1,[r1]
cmp r1,#0 // special case for exponent value of 0
moveq r0,#1
moveq pc,lr // early exit
loop:
mul r0,r0,r2 // multiply the original value by itself n times
subs r1,r1,#1
bne loop
bx lr
答案 1 :(得分:1)
我只是补充一下 开始: 推{r4-r11,lr} ... pop {r4-r11,pc}
Exponentiatecore:@ r0-&amp; m,r1-&amp; n 推{r4-r11,lr} ... pop {r4-r11,pc}
并在开始时清除bl打印并且一切正常