【学习记录】记录一个优雅的方法在 C语言中插入汇编代码

背景

最近搞keaz128的flash读写时需要向一个寄存器写入0x80,发现其中一段代码很有意思,代码如下

volatile uint8 s_flash_command_run[] = {0x00, 0xB5, 0x80, 0x21, 0x01, 0x70, 0x01, 0x78, 0x09, 0x06, 0xFC, 0xD5, 0x00, 0xBD};
typedef void (*flash_run_entry_t)(volatile uint8 *reg);
flash_run_entry_t s_flash_run_entry;

//内部使用
uint8 FlashCmdStart(void)
{
	while(FTF->FSTAT & FTMRE_FSTAT_MGBUSY_MASK){}; //等待前一个命令执行完成
    DisableInterrupts;
    
		FTF->FSTAT |= FTMRE_FSTAT_CCIF_MASK | FTMRE_FSTAT_FPVIOL_MASK | FTMRE_FSTAT_ACCERR_MASK;
    
    s_flash_run_entry = (flash_run_entry_t)((uint32)s_flash_command_run + 1);
    s_flash_run_entry(&FTF->FSTAT);
    
	 // FTF->FSTAT |=FTMRE_FSTAT_CCIF_MASK;
	
    EnableInterrupts;
    while(!(FTF->FSTAT & FTMRE_FSTAT_CCIF_MASK));  //等待命令完成
    //while(FTF->FSTAT & FTMRE_FSTAT_ACCERR_MASK);   //检测到总线错误
	
    if(FTF->FSTAT & (FTMRE_FSTAT_ACCERR_MASK | FTMRE_FSTAT_FPVIOL_MASK | FTMRE_FSTAT_MGSTAT_MASK))
	{
		return 1;	//出现错误
	}
    return 0;												//成功
}

分析

其中让我感到迷惑的是这两句

    s_flash_run_entry = (flash_run_entry_t)((uint32)s_flash_command_run + 1);
    s_flash_run_entry(&FTF->FSTAT);

经过分析,并查看反汇编代码,结果如下
首先s_flash_command_run定义为一个数组首地址为0x1FFFF000,所以经过强制转换s_flash_run_entry函数的入口地址即为0x1FFFF001。
在这里插入图片描述
查看反汇编发现数组中的内容正好是二进制代码,和数组内容一一对应。
在这里插入图片描述
非常牛逼

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值