OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2099|回复: 6

KEIL5如何在C文件中内嵌汇编?

[复制链接]

80

主题

932

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
发表于 2022-8-11 09:02:43 | 显示全部楼层 |阅读模式
10金钱
请教下各位,KEIL5如何在C中内嵌汇编?
网上找了半天也不能正常使用


在"xx.c"中加入汇编代码

#pragma ASM
;Assembler Code Here
#pragma ENDASM






__asm ("ADD R0, %[input_i], %[input_j]"    :  /* This is an empty output operand list */    : [input_i] "r" (i), [input_j] "r" (j)    : "r5","r6","cc","memory" /*Use "r5" instead of "R5" */  );




asm(
    "TST LR, #0x40\n\t"
    "BEQ from_nonsecure\n\t"
  "from_secure:\n\t"
    "TST LR, #0x04\n\t"
    "ITE EQ\n\t"
    "MRSEQ R0, MSP\n\t"
    "MRSNE R0, PSP\n\t"
    "B hard_fault_handler_c\n\t"
  "from_nonsecure:\n\t"
    "MRS R0, CONTROL_NS\n\t"
    "TST R0, #2\n\t"
    "ITE EQ\n\t"
    "MRSEQ R0, MSP_NS\n\t"
    "MRSNE R0, PSP_NS\n\t"
    "B hard_fault_handler_c\n\t"
  );





这几个都提示R0 或者LR或者ADD MOV没有定义什么的.

最佳答案

查看完整内容[请看2#楼]

好了, 难住我的居然是MOV跟MOVS的区别.....
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

932

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2022-8-11 09:02:44 | 显示全部楼层
好了,
  1. __asm int MOV_test(void){
  2.         MOVS                        R0, #100
  3.         MOVS                        R1, #101
  4.         MOVS                        R2, #102
  5.         MOVS                        R3, #103
  6.         MOVS                        R4, #104
  7.         MOVS                        R5, #105
  8.         MOVS                        R6, #106
  9.         MOVS                        R7, #107
  10.         MOV     R0, sp//所嵌入的汇编代码   
  11.         bx lr
  12. }
复制代码
难住我的居然是MOV跟MOVS的区别.....
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1716
金钱
1716
注册时间
2021-4-11
在线时间
317 小时
发表于 2022-8-11 09:37:35 | 显示全部楼层
帮顶            
回复

使用道具 举报

80

主题

932

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2022-8-11 09:40:45 | 显示全部楼层
也试了这个样子
__asm void test(void)
{
       
}
也是人家能用,我这不行报错
回复

使用道具 举报

80

主题

932

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2022-8-11 10:22:59 | 显示全部楼层
本帖最后由 聚东风 于 2022-8-11 10:27 编辑

比较气人的是KEIL官方的帮助手册的例子居然也是不能用的....
1660184380363.png
1660184399254.png


回复

使用道具 举报

80

主题

932

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2022-8-11 10:32:50 | 显示全部楼层
  1. int add(int x)
  2. {
  3.   int a = 0;
  4.   char r1 = 0;
  5.   float r2 = 0.0;
  6. //  bar(&r2);
  7.   __asm
  8.   {
  9.     ADD r1, a, #100
  10.   }
  11.   return r1;
  12. }

  13. int main(void)
  14. {
  15.     const char *a = "Hello world!";
  16.     char b[20];b[0]=10;
  17.                 b[0]=add(b[0]);
  18.     printf("Original string: '%s'\n", a);
  19.     printf("Copied   string: '%s'\n", b);
  20.     return 0;
  21. }
复制代码
呃,差不多这样能通过,我试下
回复

使用道具 举报

80

主题

932

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
 楼主| 发表于 2022-8-11 13:53:44 | 显示全部楼层
1660197151543.png

编译通过了,但是这个跟我想要的不一样....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 09:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表