当前位置: 首页 > news >正文

常州网站建设工作室中国建设质量安全协会网站

常州网站建设工作室,中国建设质量安全协会网站,小型公司网络建设方案,网络营销计划包括哪七个步骤编程环境是:stm32cubeIde 原因:很多操作需要使用底层来做,比如中断时的上下文数据保存。也就是说用到汇编来实现。 疑问:c语言怎么才能跟汇编很好的兼容在一起呢?必将是我下一步的必经探索之路了。 一、C语言和汇编…

编程环境是:stm32cubeIde 

原因:很多操作需要使用底层来做,比如中断时的上下文数据保存。也就是说用到汇编来实现。

疑问:c语言怎么才能跟汇编很好的兼容在一起呢?必将是我下一步的必经探索之路了。

一、C语言和汇编兼容格式

          asm(    汇编字符串   :  输出约束字符串   :  输入约束字符串   : 可能被使用了的寄存器   );

汇编字符串:

        "mov   %[c] , r0 "   "mov  r0,r1"     "add  %[c] , %[a], %[b] "

输出约束操作(可以类比函数的返回值):

        [c] "r"(c)   

输入约束操作 (可以类比函数的参数):

                                                                [a] "r"(a), [b] "r"(b) 

可能被使用了的寄存器 (有的地方叫被破坏了的寄存器):

"r0"  "r1"

二、解释一下约束符

  • 汇编代码字符串:包含ARM汇编指令的字符串。我们可以在该字符串中使用%[name]的形式来引用C语言变量。
  • 输入约束:用于将C语言变量映射到ARM寄存器。输入约束的形式为"约束代码"(变量名)。例如,"r"(a)表示将变量a映射到一个通用寄存器。
  • 输出约束:用于将ARM寄存器的值映射回C语言变量。输出约束的形式为"=约束代码"(变量名)。例如,"=r"(c)表示将一个通用寄存器的值赋给变量 c.
  • Clobber列表:用于列出内联汇编代码可能修改的寄存器。这有助于编译器在生成代码时正确处理这些寄存器。Clobber列表的形式为"寄存器名",多个寄存器名用逗号分隔。例如,"r0", "r1", "cc"表示内联汇编代码可能会修改r0r1寄存器和条件码寄存器。 

三、操作数约束符

  • "r":表示通用寄存器。例如,"r"(a)表示将变量a映射到一个通用寄存器。
  • "l":表示一个立即数。例如,"l"(a)表示将变量a视为一个立即数。
  • "m":表示一个内存操作数。例如,"m"(a)表示将变量a视为一个内存操作数。

四、寄存器约束符

寄存器约束用于指定内联汇编代码中使用的具体寄存器。寄存器约束的形式为"约束代码(寄存器名)"。例如,"r"(r0)表示将变量映射到r0寄存器。

五、案例

1、加法

#include <stdio.h>

int main(void) {
        int a = 10, b = 20, c;

        asm (
                "ADD %[c], %[a], %[b]"
                : [c] "=r" (c)
                : [a] "r" (a),
                  [b] "r" (b)
        );

        printf("The c   is: %d\n", c);
        return 0;
}

 我们使用ADD指令将变量ab相加,并将结果存储在变量  中。我们使用输入约束"r"(a)"r"(b)将变量ab映射到寄存器,输出约束"=r"( c )将寄存器映射到变量 

2、数组求和

#include <stdio.h>

int main(void) {
        int  array[] = {1, 2, 3, 4, 5};
        int  length = sizeof(array) / sizeof(array[0]);
        int  sum = 0;

        asm (
                "MOV r1, #0\n"     // 初始化r1(sum)为0
                "MOV r2, #0\n"     // 初始化r2(索引)为0
                "loop:\n"             // 设置循环标签
                "LDR r0, [%[array], r2, LSL #2]\n"  // 读取数组元素到r0
                "ADD r1, r1, r0\n"  // 将r0(当前数组元素)累加到r1(sum)
                "ADD r2, r2, #1\n"  // 增加索引(r2)
                "CMP r2, %[length]\n" // 比较索引(r2)和数组长度(length)
                "BLT loop\n"       // 如果索引小于长度,跳回循环开始
                :         //若是省略也必须有冒号
                : [array] "r"(array),
                  [length] "r"(length)
                : "r0", "r1", "r2", "cc"
            );

        asm( "mov  %[sum],r1":[sum] "=r"(r1) );

        printf("The sum of the array is: %d\n", sum);
        return 0;
}

        使用输入约束"r"(array)"r"(length)将数组指针和数组长度映射到寄存器,输出约束"=r"(sum)将寄存器映射到变量sum

http://www.yayakq.cn/news/651231/

相关文章:

  • 电子商务网站的建设和流程网页工具
  • win7用自己ip做网站如何用c语言做钓鱼网站
  • 拱墅区网站建设广州高端网站建设定制
  • php网站上传教程做电影网站代理合法么
  • 网站开发进度安排文档建设银行网站怎么登陆不了
  • 四川省住建厅官方网站厦门网站制作企业
  • 江苏通力建设官方网站引用网站代码
  • 黄冈做学生互评的网站大型网站开发视频百度云
  • 安康网站建设技巧php网站开发实例pdf
  • 建设银行滇龙行网站网络公司代理
  • 温州建设诚信评价网站公示注册工作室需要什么条件
  • ps怎么做网站一寸的照片三站合一的网站怎么做教程
  • 范文写作网站阿里建站服务
  • 东营网站建设制作玛多县网站建设公司
  • dw个人网站设计模板免费成都最新房价一览表
  • 图书类网站开发的背景网页设计大赛作品欣赏
  • jsp网站开发实例精讲河北省网站快速备案
  • 鲜花网站源码湖南昌正建设有限公司网站
  • 网站建设产品手册怎么做免费个人网站
  • seo优化网站推广全域营销获客公司wordpress在图片上加链接
  • 江西中企动力做的网站西点培训班一般要多少学费
  • 怎样自己做公司网站开发一块地需要多少钱
  • 广州祥云平台网站建设南宁建站公司有哪些
  • 做网站一条龙网站如何做自适应
  • 网站的建设方式wordpress代码恢复旧编辑器
  • 曲阜市古建设计院网站wordpress装饰
  • 专门提供做ppt小素材的网站网站建设 费用 入哪个科目
  • 企业自己做网站方法网站信管局备案
  • 最好的微网站建设公司如何在网站做宣传
  • 不用服务器做网站阿里巴巴网站建设与维护