3

ARM-C インターワーキング用の簡単なプログラムを試しています。コードは次のとおりです。

 #include<stdio.h>
#include<stdlib.h>

int Double(int a);
extern int Start(void);
int main(){

int result=0;
printf("in C main\n");
result=Start();
printf("result=%d\n",result);
return 0;
}

int Double(int a)
{
  printf("inside double func_argument_value=%d\n",a);

  return (a*2);
}

アセンブリファイルは次のようになります-

.syntax unified
    .cpu cortex-m3
    .thumb

    .align
    .global Start
    .global Double
    .thumb_func



Start:
      mov r10,lr
      mov r0,#42
      bl Double
      mov lr,r10
      mov r2,r0
      mov pc,lr

LPC1769 (エンベデッド アーティスト ボード) でのデバッグ中に、「result=Start()」命令でハードフォールト エラーが発生しました。上記のステートメント (result=Start()) の実行中の lr 値は 0x0000029F で、ここでフォルト命令は、pc 値は 0x0000029E です。これは、r1でフォールト命令を取得した方法です

__asm("mrs r0,MSP\n"
"isb\n"
"ldr r1,[r0,#24]\n");

誰かが私がどこで間違っているのか説明してもらえますか? どんな解決策でも大歓迎です。前もって感謝します。

私はcortex-m3の初心者で、Code_Redを搭載したNXP LPCXpresso IDEを使用しています。これが私のコードの分解です。

      IntDefaultHandler:
00000269:   push {r7} 
0000026b:   add r7, sp, #0
0000026d:   b.n 0x26c <IntDefaultHandler+4>
0000026f:   nop 
00000271:   mov r3, lr
00000273:   mov.w r0, #42 ; 0x2a
00000277:   bl 0x2c0 <Double>
0000027b:   mov lr, r3
0000027d:   mov r2, r0
0000027f:   mov pc, lr



main:
00000281:   push {r7, lr}
00000283:   sub sp, #8
00000285:   add r7, sp, #0
00000287:   mov.w r3, #0
0000028b:   str r3, [r7, #4]
0000028d:   movw r3, #11212 ; 0x2bcc
00000291:   movt r3, #0
00000295:   mov r0, r3
00000297:   bl 0xd64 <printf>
0000029b:   bl 0x270 <Start>
0000029f:   mov r3, r0
000002a1:   str r3, [r7, #4]
000002a3:   movw r3, #11224 ; 0x2bd8
000002a7:   movt r3, #0
000002ab:   mov r0, r3
000002ad:   ldr r1, [r7, #4]
000002af:   bl 0xd64 <printf>
000002b3:   mov.w r3, #0
000002b7:   mov r0, r3
000002b9:   add.w r7, r7, #8
000002bd:   mov sp, r7
000002bf:   pop {r7, pc}

Double:
000002c0:   push {r7, lr}
000002c2:   sub sp, #8
000002c4:   add r7, sp, #0
000002c6:   str r0, [r7, #4]
000002c8:   movw r3, #11236 ; 0x2be4
000002cc:   movt r3, #0
000002d0:   mov r0, r3
000002d2:   ldr r1, [r7, #4]
000002d4:   bl 0xd64 <printf>
000002d8:   ldr r3, [r7, #4]
000002da:   mov.w r3, r3, lsl #1
000002de:   mov r0, r3
000002e0:   add.w r7, r7, #8
000002e4:   mov sp, r7
000002e6:   pop {r7, pc}

Dwelch さんのアドバイスに従って、r10 を r3 に変更しました。

4

2 に答える 2

2

_start 関数は、main() を呼び出す C プログラムのエントリ ポイントです。任意の C プログラムの _start 関数をデバッグするために、アセンブリ ファイルに含まれています。実際、Linux 上のプログラムの実際のエントリ ポイントは main() ではなく、_start() という関数です。標準ライブラリは通常、何らかの初期化コードを実行してから main() を呼び出すバージョンを提供します。

これを gcc -nostdlib でコンパイルしてみてください:

于 2013-04-21T14:24:13.497 に答える