cortex-m在MDK使用汇编的摘要

本文介绍ARM汇编语言的基础概念,包括符号声明、代码段定义及堆栈对齐设置等,并针对MDK编译时可能出现的警告信息提供解决方案。

一般开头先声明外部的符号和内部的符号

IMPORT xxx

EXPORT xxx

IMPORT是声明外部的变量和函数,EXPORT是汇编中要被外部c文件调用的函数

xxxx EQU 0x0000

EQU相当于c语言中的#define了

AREA    |.text|, CODE, READONLY

语法 AREA 段名,属性1,属性2.。。。

用来定义一个代码段,段名如果以数字开头要用“|”符号做括号 |12txt| 

属性有:CODE 定义代码段 ,DATA定义数据段,READONLY 只读,READWRITE可读写

PRESERVE8

指定当前文件保持堆栈8字节对齐

THUMB 

当前代码段为Thumb指令


编译的时候mdk可能会有这种错误

warning: A1581W: Added 2 bytes of padding at address 0x4e

这个错误的原因是字节没有对齐 最简单处理办法就是加一个nop指令

### ARM Cortex-M 内嵌汇编功能使用教程 ARM Cortex-M系列处理器广泛应用于嵌入式系统中,其内嵌汇编功能允许开发者在C代码中直接嵌入汇编指令,从而实现对硬件的高效控制。以下是一个详细的教程以及示例代码。 #### 1. 内嵌汇编的基本语法 在GCC和Keil MDK等编译器中,内嵌汇编的语法略有不同。以下是两种常见编译器的语法: - **GCC编译器**: ```c asm("assembly instruction"); ``` 或者带有输入输出约束的复杂形式: ```c asm volatile ("assembly instruction" : outputs : inputs : clobbers); ``` - **Keil MDK编译器**: Keil支持`__asm`关键字,用于嵌入汇编代码: ```c __asm("assembly instruction"); ``` #### 2. 示例代码:设置GPIO引脚为高电平 以下是一个简单的例子,展示如何通过内嵌汇编设置STM32F103的GPIO引脚为高电平。 - **使用GCC编译器**: ```c #include <stdint.h> void set_gpio_high(void) { // 假设GPIOA的地址为0x40010800,BSRR寄存器偏移为16位 uint32_t GPIOA_BSRR = 0x40010800 + 0x18; // 使用内嵌汇编设置GPIOA的第5位为高电平 asm volatile( "ldr r0, %[gpio_addr]\n\t" // 加载GPIOA_BSRR地址到r0 "mov r1, #0x20\n\t" // 设置r1为0x20 (第5位) "str r1, [r0]\n\t" // 将r1的值写入GPIOA_BSRR : : [gpio_addr] "m" (GPIOA_BSRR) : "r0", "r1" ); } ``` - **使用Keil MDK编译器**: ```c void set_gpio_high(void) { // 假设GPIOA的地址为0x40010800,BSRR寄存器偏移为16位 uint32_t GPIOA_BSRR = 0x40010800 + 0x18; // 使用内嵌汇编设置GPIOA的第5位为高电平 __asm { LDR R0, =GPIOA_BSRR ; 加载GPIOA_BSRR地址到R0 MOV R1, #0x20 ; 设置R1为0x20 (第5位) STR R1, [R0] ; 将R1的值写入GPIOA_BSRR } } ``` #### 3. 注意事项 - Cortex-M系列处理器仅支持Thumb状态下的指令集[^2],因此所有内嵌汇编代码必须使用Thumb指令集。 - 在编写内嵌汇编时,需确保寄存器的正确使用和保护,避免影响C代码的正常运行[^3]。 - 如果需要频繁使用浮点运算,建议使用软件库或硬件浮点单元来优化性能[^3]。 #### 4. 推荐学习资源 - 《ARM Cortex-M3 Cortex-M4权威指南》提供了关于Cortex-M架构的详细信息[^1]。 - 《ARM Architecture Reference Manual Thumb-2 Supplement》是学习Thumb-2指令集的重要参考资料[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值