Pointers 在汇编中按引用传递

Pointers 在汇编中按引用传递,pointers,assembly,stack,pass-by-reference,lpc,Pointers,Assembly,Stack,Pass By Reference,Lpc,我正在尝试编写一个程序,使用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(

我正在尝试编写一个程序,使用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);
}
但是,在调试会话期间,我在执行“Exponentiatecore(m,n)”时遇到了一个硬错误

如调试窗口中所示

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>
Name:HardFault\u处理程序
详细信息:{void(void)}0x21c
默认值:{void(void)}0x21c
十进制的:
十六进制:
二元的:
八进制:
在对齐过程中是否出现堆栈损坏,或者在解释过程中是否存在错误? 请帮忙。
提前谢谢

您的代码有几个问题。第一种情况是,您有一个无限循环,因为您的SUB指令没有设置标志。把它改成潜艇。下一个问题是您正在不必要地操作LR寄存器。您不能从Exponentiatecore调用其他函数,所以不要触摸LR。函数的最后一条指令应该是“BX LR”,以返回给调用者。问题3是乘法指令错误。除了取3个参数外,如果将数字本身相乘,它将增长得太快。例如:

指数核(10,4)
通过每个循环的值:
R4=10,n=4
R4=100,n=3
R4=10000,n=2
R4=100000000 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
我只是补充一下 开始: 推送{r4-r11,lr} ... pop{r4-r11,pc}

指数型核心:@r0-&m,r1-&n 推送{r4-r11,lr} ... pop{r4-r11,pc}


我不知道你的错误是什么,但是对于你已经尝试过的东西+1。@rekire这是一种讽刺还是一种欣赏?一种欣赏:新用户以如此好的方式完成作业是很少见的。据我所知,使用这种方式你可以得到发生异常的PC在硬故障异常处理程序中:
MRS R0,PSP
/
LDR R1,[R0,#24]
。一旦你知道是哪个指令导致了硬故障,就应该更容易找出原因。@Michael谢谢你的建议。硬故障是由于从1切换期间链路寄存器中的值被压入而导致的。第一次从组件切换到C---bl指数(lr=0x27B)2。从C到汇编的第二次切换---结果=指数核心(m,n);(lr=0xFFFFF9)我知道我正在破坏返回值,但如何在第一个开关中保存lr值??“您的子指令未设置标志”。自从我上次阅读ARM文档已经有一段时间了,但由于这是Thumb代码,我非常确定算术运算的行为总是好像它们有一个
s
后缀。我通常不使用Thumb,所以这是有意义的。皮质M3支持Thumb-2,看起来更像手臂指令。最初的崩溃可能是因为在不保留R4和R9的情况下更改了R4和R9。只是我正在做的一个小表示…#1c-->汇编(启动例程)--->#2c函数(指数化)--->#3汇编(指数化核心())。。。。我仍然无法纠正堆栈损坏错误。谢谢你,谢谢你,比特银行。我已经按照您的建议实施了更改。它部分起作用#1,但我正在从main.c文件调用Start,以便切换到assembly,因此我保存了lr值#2通过从汇编到指数型(int*,int*)函数的链接进行分支,因此又增加了一个开关。#3现在再次从C到汇编分支到指数型核心(m,n)。执行第3步后,硬故障仍然发生。根据Michael的建议,我发现错误指令是这行结果=指数核(m,n)。。执行此行后,堆栈指针已损坏。@BitBank start()例程就在程序集文件的顶部。从一开始,调用C Exponentiate()函数。还有一件事,当忽略第三个分支(exponentiatecore)时,程序工作正常。在这种情况下,没有硬故障。“result=Exponentiatecore(m,n)”是问题所在:( :(
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