2016-03-29 14 views
0

Gem5を使用してARMプロセッサの命令アクセスを取得しました。私はコードを生成するために-marmオプションを使用しました。Gem5でのARMプロセッサの命令アクセス

arm-linux-gnueabihf-gcc -static -marm fibcall.c 

私は唯一の32ビットARM命令は、このオプションを使用して生成されていると信じています。しかし、その結果を以下に示す:

command line: ./build/ARM/gem5.opt --debug-flags=Exec configs/example/se.py -c tests/test-progs/malardalen/a.out 

Global frequency set at 1000000000000 ticks per second 
**** REAL SIMULATION **** 
info: Entering event queue @ 0. Starting simulation... 
     0: system.cpu T0 : @fini+15 : mov.w fp, #0   : IntAlu : D=0x0000000000000000 
    500: system.cpu T0 : @_start+3 : mov.w lr, #0   : IntAlu : D=0x0000000000000000 
    1000: system.cpu T0 : @_start+7 : ldmstm 
    1000: system.cpu T0 : @_start+7.0 : ldr_uop r1, [sp, #0] : MemRead : D=0x0000000000000001 A=0xbeffff00 
    1500: system.cpu T0 : @_start+7.1 : addi_uop sp, sp, #4 : IntAlu : D=0x00000000beffff04 
    2000: system.cpu T0 : @_start+9 : mov r2, sp    : IntAlu : D=0x00000000beffff04 
    2500: system.cpu T0 : @_start+11 : ldmstm 
    2500: system.cpu T0 : @_start+11.0 : str_uop r2, [sp, #4] : MemWrite : D=0x00000000beffff04 A=0xbeffff00 
    3000: system.cpu T0 : @_start+11.1 : subi_uop sp, sp, #4 : IntAlu : D=0x00000000beffff00 
    3500: system.cpu T0 : @_start+13 : ldmstm 
    3500: system.cpu T0 : @_start+13.0 : str_uop r0, [sp, #4] : MemWrite : D=0x0000000000000000 A=0xbefffefc 
    4000: system.cpu T0 : @_start+13.1 : subi_uop sp, sp, #4 : IntAlu : D=0x00000000befffefc 
    4500: system.cpu T0 : @_start+15 : ldr.w r12, [pc, #16] : MemRead : D=0x0000000000009039 A=0x88d8 
    5000: system.cpu T0 : @_start+19 : str.w r12, [sp, #-4]! 
    5000: system.cpu T0 : @_start+19.0 : str.w r12, [sp, #-4]! : MemWrite : D=0x0000000000009039 A=0xbefffef8 
    5500: system.cpu T0 : @_start+19.1 : subi_uop.w sp, sp, #4 : IntAlu : D=0x00000000befffef8 
    6000: system.cpu T0 : @_start+23 : ldr r0, [pc, #12]  : MemRead : D=0x0000000000008a4c A=0x88dc 

... 

我々2000で、_start + 9が_start + 7から2バイトであり、使用されていることを見ることができます。だから私は16ビットの命令が使用されると思います。それはなぜそうですか?なぜ32ビットではないのですか?

さらに、_start + 7.0と_start + 7.1の意味を知っている人はいますか?なぜ私は同じメモリアドレスを持つ2つの異なる命令を持っていますか?

ありがとうございます。

答えて

0

-marmを使用すると、実際には、のコンパイルコードの、つまりfibcall.cの内容のARM命令が生成されます。 _startシンボルは、そのコードの一部ではありません。静的にリンクされているそのツールチェーンによって提供される標準ライブラリの一部です。これらのには、Thumb-2命令がはっきりと含まれています。インターワーキングのない100%純粋なARMコードで、コンパイルに適切な適切なsysrootを持たない静的バイナリが必要な場合、そのツールチェーンに適切なmultilibオプションがあるかどうかを確認して、ARMライブラリを提供する必要がありますThumbのもの、または適切なライブラリの代替セットを検索/構築することができます。

+0

ご返信ありがとうございます。私は別のツールチェイン arm-linux-gnueabi-gccを使用しました。 この場合、Thumb-2命令は使用されていません。 – user1794396

関連する問題