• lv11 嵌入式开发 ARM指令集中(伪操作与混合编程) 7


    目录

    1 伪指令

    2 伪操作

    3 C和汇编的混合编程

    4 ATPCS协议


    1 伪指令

    本身不是指令,编译器可以将其替换成若干条等效指令
     

    1. @ 空指令
    2. NOP
    3. @ 指令
    4. LDR R1, [R2]
    5. @ 将R2指向的内存空间中的数据读取到R1寄存器
    6. @ 伪指令
    7. LDR R1, =0x12345678
    8. @ R1 = 0x12345678
    9. @ LDR伪指令可以将任意一个32位的数据放到一个寄存器
    10. LDR R1, =STOP
    11. @ 将STOP表示的地址写入R1寄存器
    12. @ LDR R1, STOP
    13. @ 将STOP地址中的内容写入R1寄存器

    2 伪操作

    不会生成代码,只是在编译之前告诉编译器怎么编译

    1. @ GNU的伪操作一般都以‘.’开头
    2. @ .global symbol
    3. @ 将symbol声明成全局符号
    4. @ .local symbol
    5. @ 将symbol声明成局部符号
    6. @ .equ DATA, 0xFF
    7. @ MOV R1, #DATA
    8. @ 相当于define
    9. @ .macro FUNC
    10. @ MOV R1, #1
    11. @ MOV R2, #2
    12. @ .endm
    13. @ FUNC
    14. @ .macro 相当于函数封装
    15. @ .if 0
    16. @ MOV R1, #1
    17. @ MOV R2, #2
    18. @ .endif
    19. @.rept 3
    20. @ MOV R1, #1
    21. @ MOV R2, #2
    22. @.endr
    23. @ .weak symbol
    24. @ 弱化一个符号,即告诉编译器即便没有这个符号也不要报错
    25. @ .weak func
    26. @ B func
    27. @ .word VALUE
    28. @ 在当前地址申请一个字的空间并将其初始化为VALUE
    29. @ MOV R1, #1
    30. @ .word 0xFFFFFFFF
    31. @ MOV R2, #2
    32. @ .byte VALUE
    33. @ 在当前地址申请一个字节的空间并将其初始化为VALUE
    34. @ MOV R1, #1
    35. @ .byte 0xFF
    36. @ .align N
    37. @ 告诉编译器后续的代码2的N次方对其
    38. @ .align 4
    39. @ MOV R2, #2
    40. @ .arm
    41. @ 告诉编译器后续的代码是ARM指令
    42. @ .thumb
    43. @ 告诉编译器后续的代码是Thumb指令
    44. @ .text
    45. @ 定义一个代码段
    46. @ .data
    47. @ 定义一个数据段
    48. @ .end 之前的代码都是汇编代码
    49. @ .space N, VALUE
    50. @ 在当前地址申请N个字节的空间并将其初始化为VALUE
    51. @ MOV R1, #1
    52. @ .space 12, 0x12
    53. @ MOV R2, #2
    54. @ 不同的编译器伪操作的语法不同

    rept示例

     .word示例

     .byte示例

    .align 2代表对齐,2代表2的2次方对齐,即4的整数倍。如果3代表8的整数倍。

    3 C和汇编的混合编程

    通用寄存器指令

    • 1、数据处理指令
    • 2、跳转指令
    • 3、内存读写指令load

    Arm专用指令,不会有C语言与之对应

    • 4、CPSR
    • 5、SWI
    • 6、协处理器指令

    上电的第一段代码都是用汇编写的。

    1. @ C和汇编的混合编程原则:在哪种语言环境下符合哪种语言的语法规则
    2. @ 1. 在汇编中将C中的函数当做标号处理
    3. @ 2. 在C中将汇编中的标号当做函数处理
    4. @ 3. 在C中内联的汇编当做C的语句来处理
    5. @ 1. 方式一:汇编语言调用(跳转)C语言
    6. @ MOV R1, #1
    7. @ MOV R2, #2
    8. @ BL func_c @func_c用c写,最后会通过LR跳转回来,不写括号
    9. @ MOV R3, #3
    10. @ 2. 方式二:C语言调用(跳转)汇编语言
    11. @ .global FUNC_ASM @必须加.global否则c文件中不认识
    12. @ FUNC_ASM:
    13. @ MOV R4, #4
    14. @ MOV R5, #5
    15. void func_c(void)
    16. {
    17. int a;
    18. a ++;
    19. //C语言调用(跳转)汇编语言
    20. FUNC_ASM(); //需要括号
    21. a --;
    22. }
    23. @ 3. C内联(内嵌)汇编
    24. /*
    25. void func_c(void)
    26. {
    27. int a;
    28. a ++;
    29. //C内联(内嵌)汇编
    30. asm
    31. (
    32. "MOV R6, #6\n"
    33. "MOV R7, #7\n"
    34. );
    35. //C语言调用(跳转)汇编语言
    36. FUNC_ASM();
    37. a --;
    38. }
    39. */

    4 ATPCS协议

    1. @ ATPCS协议主要内容
    2. @ 1.栈的种类
    3. @ 1.1 使用满减栈
    4. @ 2.寄存器的使用
    5. @ 2.1 R15用作程序计数器,不能作其他用途
    6. @ 2.2 R14用作链接寄存器,不能作其他用途
    7. @ 2.3 R13用作栈指针,不能作其他用途
    8. @ 2.4 当函数的参数不多于4个时使用R0-R3传递,当函数的参数多于4个时,多出的部分用栈传递
    9. @ 2.5 函数的返回值使用R0传递
    10. @ 2.6 其它寄存器主要用于存储局部变量

    总结,参数尽量小于3,放在寄存器中效率高一点。 

  • 相关阅读:
    计算机网络基础导览
    如何制作 PDF 文件
    java中判断集合是否为空
    反距离加权插值IDW计算详细步骤
    x86处理器指令
    【zlkmedia】20221019 带x264 和 openssl构建windows工程MediaServer
    【软考软件评测师】第十七章 计算机组成与体系结构(总线技术)
    收银管理软件如何做好员工管理?
    用acme.sh给网站域名,申请免费SSL永久证书(自动续期)
    【算法题】小红书2023秋招提前批算法真题解析
  • 原文地址:https://blog.csdn.net/m0_60718520/article/details/134494414