Compilation ARM处理器Gem5中的指令访问
我使用Gem5获取ARM处理器的指令访问。我使用-marm选项生成代码Compilation ARM处理器Gem5中的指令访问,compilation,arm,instructions,memory-access,gem5,Compilation,Arm,Instructions,Memory Access,Gem5,我使用Gem5获取ARM处理器的指令访问。我使用-marm选项生成代码 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
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位
除此之外,有人知道“开始+7.0”和“开始+7.1”是什么意思吗?为什么我有两个具有相同内存地址的不同指令
提前感谢。使用
-marm
确实会使编译器为其编译的代码生成ARM指令,即fibcall.c的内容。但是,\u start
符号不是该代码的一部分,它是静态链接的工具链提供的标准库的一部分,这些库显然包含Thumb-2指令。如果您想要一个100%纯ARM代码的静态二进制文件,它没有相互作用,并且没有合适的sysroot进行编译,那么您需要检查工具链是否有合适的multilib选项来提供ARM库,而不是Thumb库,或者找到/构建合适的库替换集。使用-marm
确实会使编译器为其编译的代码生成ARM指令,即fibcall.c的内容。但是,\u start
符号不是该代码的一部分,它是静态链接的工具链提供的标准库的一部分,这些库显然包含Thumb-2指令。如果您想要一个100%纯ARM代码的静态二进制文件,它没有相互作用,并且没有合适的sysroot进行编译,那么您需要检查工具链是否有合适的multilib选项来提供ARM库,而不是Thumb库,或者找到/构建一套合适的替换库。谢谢您的回复。我使用了另一个工具链armlinuxgnueabigcc。在这种情况下,我想没有使用Thumb-2指令。谢谢您的回复。我使用了另一个工具链armlinuxgnueabigcc。在这种情况下,我认为没有使用Thumb-2指令。_start+7.0和_start+7.1是微操作。_start+7.0和_start+7.1是微操作。