2016-03-29 13 views
0

Ich habe Gem5 verwendet, um Befehlszugriffe für den ARM-Prozessor zu erhalten. Ich habe die Option -marm verwendet, um Code zu generieren.Befehlszugriffe in Gem5 für ARM-Prozessor

Ich glaube, dass nur 32-Bit-ARM-Anweisungen mit dieser Option generiert werden. Aber das Ergebnis ist wie folgt:

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 

... 

Wir können bei 2000 sehen, dass _start + 9 verwendet wird, die 2 Bytes von _start + 7. Also ich denke eine 16-Bit-Anweisung wird verwendet. Wieso ist es so? Warum ist es nicht 32-Bit?

Außerdem weiß jemand, was _start + 7.0 und _start + 7.1 bedeuten? Warum habe ich zwei verschiedene Anweisungen mit der gleichen Speicheradresse?

Vielen Dank im Voraus.

Antwort

0

Mit -marm wird in der Tat der Compiler ARM-Anweisungen für den Code erstellen kompiliert, d. H. Den Inhalt von fibcall.c. Das _start Symbol ist jedoch nicht Teil dieses Codes - das ist Teil der Standardbibliotheken, die von dieser Toolchain zur Verfügung gestellt werden, mit der Sie statisch verbunden sind, und diese enthalten eindeutig Thumb-2-Anweisungen. Wenn Sie eine statische Binärdatei wollen, die zu 100% aus reinem ARM-Code ohne Interworking besteht und keinen geeigneten Sysroot zum Kompilieren hat, dann müssen Sie überprüfen, ob diese Toolchain über eine entsprechende Multilib-Option verfügt, um ARM-Bibliotheken zur Verfügung zu stellen die Thumb, oder finde/baue einen geeigneten Ersatzsatz von Bibliotheken.

+0

Vielen Dank für Ihre Antwort. Ich habe eine andere Toolchain verwendet arm-linux-gnueabi-gcc. In diesem Fall werden keine Thumb-2-Anweisungen verwendet, denke ich. – user1794396