汇编,目前对大多数程序员来说应该都很陌生。特别是像我们这种新生代程序员(脸皮并不厚 )。
但其实在实际应用中,需要把产品或方案做到极致,还是很有可能用到的。比如电机控制的算法。
这里有个前提是:汇编编程水平要比编译器高 。
C语言中如何嵌入汇编,下面例程,供参考。
开发环境:
AC7801(M0+内核) 通用demo板
实现功能:
通过汇编初始化PC9,控制PC9输出高低电平来控制板上LED灯。
具体实现:
main.c
- int main(void)
- {
- InitDebug();//初始化Debug uart口
- InitDelay();//初始化systick时钟
- printf("\nRunning AsmInC sample code.\r\n");
- mdelay(3000);//延时3S
- LED_Init();/汇编实现,LED IO口配置
- while (1)
- {
- LED_Ctrl(0);//汇编实现,LED IO输出高电平
- mdelay(500);//延时500ms
- LED_Ctrl(1);//汇编实现,LED IO输出低电平
- mdelay(500);//延时500ms
-
- }
- }
Led.s
- ;/*************************************************************************
- ;File: Led.s
- ;Function: LED初始化,LED控制 --> 控制PC9输出高低电平
- ;***************************************************************************/
- ;/*------------------------------------------------------------------------*/
- AREA LIGHT_LED,CODE,READONLY
- ;Register
- CKGEN_PERI_CLK_EN_0 EQU 0X40000004
- GPIOC_CR EQU 0x40001060
- GPIOC_ODR EQU 0x40001068
- ;
- BIT23_EN EQU 0x00800000
- BIT09_EN EQU 0x00000200
- BIT06_EN EQU 0x00000040
-
- EXPORT LED_Init;
- EXPORT LED_Ctrl;
- LED_Init PROC;定义子函数
- ;打开GPIO输入时钟使能
- LDR R0,=CKGEN_PERI_CLK_EN_0;CKGEN_PERI_CLK_EN_0
- LDR R1,[R0];CKGEN_PERI_CLK_EN_0-->R1
- LDR R2,=BIT23_EN;BIT23=1,CKGEN_PERI_CLK_EN_0[GPIO_EN] = 1
- ORRS R1,R1,R2;R1|R2-->R1
- STR R1,[R0];R1-->CKGEN_PERI_CLK_EN_0
- ;设置GPIO PC9寄存器
- ;端口配置寄存器GPIO_CR 0x40001060 GPIO_CR[9] = 1;输出
- LDR R0,=GPIOC_CR;GPIO_CR
- LDR R1,[R0];GPIO_CR-->R1
- LDR R2,=BIT09_EN;BIT9=1,GPIO_CR[BIT9] = 1
- ORRS R1,R1,R2;R1|R2-->R1
- STR R1,[R0];R1-->GPIO_CR
- ;端口输出数据寄存器GPIO_ODR 0x40001068 GPIO_ODR[9] =1;输出高
- LDR R0,=GPIOC_ODR;GPIO_ODR
- LDR R1,[R0];GPIO_ODR-->R1
- LDR R2,=BIT09_EN;=0x00000200;BIT9=1,GPIO_ODR[BIT9] = 1
- ORRS R1,R1,R2;R1|R2-->R1
- STR R1,[R0];R1-->GPIO_ODR
- BX LR;return
- ALIGN
- ENDP;结束子函数
- LED_Ctrl PROC;定义子函数
- ;端口输出数据寄存器GPIO_ODR 0x40001068 GPIO_ODR[9] =1;输出高
- LDR R1,=GPIOC_ODR;GPIO_ODR
- LDR R2,[R1];GPIO_ODR-->R2
- ;(((reg) & (~((uint32_t)mask))) | (((uint32_t)value) << pos))
- LDR R4,=0xFFFFFDFF;BIT9位为0,其余取反
- LSLS R0,#9;bit9 mask
- ANDS R2,R2,R4;R2&R4-->R2
- ORRS R2,R2,R0;R2|R0-->R2
- STR R2,[R1];R2-->GPIO_ODR
- BX LR;return
- ALIGN
- ENDP;结束子函数
- END
划重点:
1.C语言中嵌入汇编如何调用?
2.函数的形参如何传递的,LED_Ctrl的形参给谁了?
3.汇编的宏定义如何定义?
4.如何定义汇编子函数?
AsmInC.rar
(15.96 KB, 下载次数: 15)
|