• 对于IMX6ULL、STM32MP157,默认使用ARM指令集。
    • 在汇编文件中,可以使用某些语法告诉编译器使用哪种指令集:

      • 新语法

        1. .arm // 表示后续的指令使用ARM指令集
        2. .thumb // 表示后续的指令使用thumb指令集
      • 旧语法

        1. .code 32 // 表示后续的指令使用ARM指令集
        2. .code 16 // 表示后续的指令使用thumb指令集
    • 在C语言中,可以在编译选项中指定指令集: ```c -marm // 使用ARM指令集编译 -mthumb // 使用Thumb指令集编译

    比如: arm-linux-gcc -marm -c -o main.o main.c // 不同的编译器可能命令不一样

    1. - 要切换CPUState,比如从ARM切换到Thumb,或者从Thumb切换到ARM,可以使用BXBLX指令
    2. ```c
    3. // 如果R0的bit0为0,表示切换到ARM State; 如果R0的bit0位1,表示切换到Thumb State
    4. BX R0
    5. BLX R0
    • 如果BX/BLX跳转的地址中bit0为0时表示要切换到ARM指令集,bit0为1时切换到Thumb指令集
    • image.png
    • image.png
    • 默认编译的结果:image.png
    • 加上-marm编译:image.png
    • 汇编里调用C函数时,可以直接如此调用(编译器会帮我们搞定): ```c LDR PC, =main // 如果main函数时用Thumb指令集编译的,最终的指令如下:

    // 注意到下面的c020051b,它的bit0为1 c0200010: e59ff004 ldr pc, [pc, #4] ; c020001c c0200014: c0100000 andsgt r0, r0, r0 c0200018: c02004a3 eorgt r0, r0, r3, lsr #9 c020001c: c020051b eorgt r0, r0, fp, lsl r5 ```