使用LPC1769计算程序集-C中的指数值

时间:2013-04-26 14:02:32

标签: c assembly cortex-m3

这个程序是对我之前在程序集中通过引用传递问题的简单修改。 这计算指数,即2 ^ 2 这是程序 -

#include<stdio.h>
#include<stdlib.h>
extern int Start_func (void);
extern int Exponentiatecore(int m,int n);
void print(int i);
int Exponentiate(int m,int n);

int main()
{
printf("in main func\n");
Start_func();
return 0;
}


int Exponentiate(int m,int n)
{
printf("in exponentiate func\n");

    if(n==0)
     return 1;
    else
    {
        int result=0;
        result=Exponentiatecore(m,n);    
        printf("calculation done\n");
        printf("result=%d\n",result);
        return (result);
    }

}


void print(int i)
{
printf("value=%d\n",i);
}

这是补充它的汇编代码 -

Start_func:
    mov r5,lr
            mov r0,#2
    mov r1,#2
    bl Exponentiate
    bl print
    mov lr,r5
    bx lr

Exponentiatecore:    // r0->m, r1->n

           mov r2,r0
       loop:
           mul r2,r0
           subs r1,#1
           bne loop
           mov r0,r2
           bx lr

这是反汇编---

      Start_func:
00000270:   mov r5, lr
00000272:   mov.w r0, #2
00000276:   mov.w r1, #2
0000027a:   bl 0x2bc <Exponentiate>   //branch to exponentiate function
0000027e:   bl 0x31c <print>
00000282:   mov lr, r5
00000284:   bx lr 
      Exponentiatecore:
00000286:   mov r2, r0
      loop:
00000288:   mul.w r2, r0, r2
0000028c:   subs r1, #1
0000028e:   bne.n 0x288 <loop>
00000290:   mov r0, r2
00000292:   bx lr 


      main:
0000029c:   push {r7, lr}
0000029e:   add r7, sp, #0
000002a0:   movw r3, #11300 ; 0x2c24
000002a4:   movt r3, #0
000002a8:   mov r0, r3
000002aa:   bl 0xdbc <printf>
000002ae:   bl 0x270 <Start_func>
000002b2:   mov.w r3, #0
000002b6:   mov r0, r3
000002b8:   pop {r7, pc}
000002ba:   nop 
      Exponentiate:
000002bc:   push {r7, lr}
000002be:   sub sp, #16 
000002c0:   add r7, sp, #0
000002c2:   str r0, [r7, #4]
000002c4:   str r1, [r7, #0]
000002c6:   movw r3, #11316 ; 0x2c34
000002ca:   movt r3, #0 
000002ce:   mov r0, r3
000002d0:   bl 0xdbc <printf>
000002d4:   ldr r3, [r7, #0]
000002d6:   cmp r3, #0
000002d8:   bne.n 0x2e0 <Exponentiate+36>
000002da:   mov.w r3, #1
000002de:   b.n 0x312 <Exponentiate+86>
000002e0:   mov.w r3, #0
000002e4:   str r3, [r7, #12]
000002e6:   ldr r0, [r7, #4]
000002e8:   ldr r1, [r7, #0]
000002ea:   blx 0x284 <Start_func+20>      //this jump should be at 0x286
000002ee:   mov r3, r0
000002f0:   str r3, [r7, #12]
000002f2:   movw r3, #11340 ; 0x2c4c
000002f6:   movt r3, #0
000002fa:   mov r0, r3

在调试指令期间出现硬故障错误 - &gt;

result=Exponentiatecore(m,n);

我通过code_red在NXP LPC Xpresso IDE上使用LPC 1769(嵌入式艺术家)。

如果你看一下这一行 - &gt;   000002ea:blx 0x284

它应该跳转到0x286,其中Exponentiatecore()函数启动,但遗憾的是跳转是一条指令。

任何人都可以在上面的代码中告诉我哪里出错了。 先感谢您。

1 个答案:

答案 0 :(得分:1)

这是一个线索:

000002ea:   blx 0x284 <Start_func+20> 

blx指令尝试切换到ARM模式,这在Cortex M3上不起作用。

您需要以拇指声明装配功能:

# ---------------------------------------------
# mode of asembly
# ---------------------------------------------
      .syntax unified
      .thumb
      .arch armv7m

# ---------------------------------------------
# allocation
# ---------------------------------------------
.text
.global Start_func
.thumb_func
Start_func:
    mov r5,lr
    [...]
.thumb_func
Exponentiatecore: 

否则链接器认为它们是arm函数并尝试切换到该模式 - 这会导致错误。