0基础踏入嵌入式开发的第一坑!用无敌简简单单的C程序调用汇编程序实现整数相加,这辈子都有阴影了,这大概是一条一条指令谷歌百度搜出来的结果,学习从来没这么卑微过,唔QAQ

工程大概长这样:

add10.s

;routine for the addition of many integers.

;R0 is the counter of the loop.

;R2 is the pointer of array element. R3 is the value of array element pointed by R2.

;R4 is the low word of the sum,and R5 is the high word.

;N EQU 10

AREA addEX01,CODE,READONLY

ENTRY

EXPORT add10

add10

;MOV R0,#N

MOV R4,#0

MOV R5,#0

ADDS R4,#0

LDR R2,=adddata10

addloop01

LDR R3,[R2]

ADDS.W R4,R4,R3

ADCS.W R5,R5,#0

ADD R2,#4

SUBS.W R0, R0, #1

BNE addloop01

BX LR

AREA adddat0,DATA,READWRITE

adddata10 DCD 0x70,0x30,0x20,0x40,0x35,0x65,0x55,0x75,0x25,0x60

END

main.c

void add10(int K);

int main(void)

{

add10(1);

return 0;

}

理解程序最快的方法之一莫过于读现有的程序,先来看add.s的代码

;用于添加多个整数的例程。

;R0是循环的计数器。

;R2是数组元素的指针。R3是R2指向的数组元素的值。

;R4是和的低位,R5是高位。

N EQU 10;N的值定义为10

AREA addEX01,CODE,READONLY

ENTRY

EXPORT add10

add10;函数名

MOV R0,#N;R0=N

MOV R4,#0;R4=0

MOV R5,#0;R5=0

ADDS R4,#0;R4+=0 将R4中的值与0相加,存到寄存器R4中

LDR R2,=adddata10;将adddata10变量的地址放入R2中

小结:#后是一个及时数,MOV是将一个寄存器的地址给另一个寄存器,ADDS是将两个寄存器中的值相加赋给另一个寄存器。这个函数是将寄存器R0 R4 R5初始化为0

addloop01

LDR R3,[R2];将R2中的值存到R3中

ADDS.W R4,R4,R3;将R4中的值与R3中的值相加,存到寄存器R4中

ADCS.W R5,R5,#0;将R5中的值与0相加,存到寄存器R4中

ADD R2,#4;将R2中的值与4相加,结果存到R2中

SUBS.W R0, R0, #1;R0中的值自减1

BNE addloop01

小结:ADDS.W的W:用户通过.W(Wide)后缀指定编译器使用32位ARM指令

ADDS是32位数的加法运算,影响进位标志位C而不影响运算结果的值,ADCS是大于32位数的加法,低32位数相加的结果影响标志位C的值(作为进位值)就得加到高32位数的相加运算里去,以此类推,可做高32数的加法.

end:这一块是水平有限得死死的QAQ希望大家能从这一条条代码的解释得到一丝丝收货

c语言 中的求和函数,0基础理解C语言调用汇编实现求和函数相关推荐

  1. C语言视频教程免费分享,0基础学C语言

    C语言是一种通用的.过程式的编程语言,广泛用于系统与应用软件的开发.作为计算机编程的基础语言,长期以来它一直是编程爱好者追捧而又比较难学的语言.C语言是一种计算机程序设计语言,它既具有高级语言的特点, ...

  2. c语言中数组结尾的0的作用,C语言里面一个数组最后的\0表示什么意思?

    qq_莫非 #include #include #include #include #include #include #include #include #include #define PORT  ...

  3. 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理

    大家好,我是 17. Flutter WebView 一共写了四篇文章 在 Flutter 中使用 webview_flutter 4.0 | js 交互 Flutter WebView 性能优化,让 ...

  4. c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?

    考虑以下程序(请参见此处的现场演示). #include int main(void) { int ;  // Missing variable name puts("Surprise&qu ...

  5. c语言的调试是对源文件进行,理解C语言——从小菜到大神的晋级之路(3)——C源程序的基本结构与调试方法...

    本期视频点击这里 在上一篇中,我们进行了Visual Studio 2013的安装以及第一个demo程序"HelloWorld"的建立.现在我们看一下其中的源代码及相关的C语言基础 ...

  6. C 语言新手入门教程,0 基础的小伙伴请进~(书籍推荐+项目推荐)

    所有学过 C 语言的人,还记得被指针支配的恐惧吗?还记得一个叫谭浩强的男人吗? 如果你是一名高校大学生,或者在准备计算机等级考试,小编为你准备了一篇非常好的 C 语言入门文章! 从零基础入门讲起,循序 ...

  7. 思路不对努力白费!0基础学好C语言编程,必须掌握的学习思路!

    计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求.如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC6.0来教大家上机实验,那你不妨看看本文,这里有一些建议可以帮助你不会脱离社会太远 ...

  8. memcpy函数_如何理解c语言中的回调函数

    在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不 ...

  9. 选择大于努力!0基础学好C语言编程,首先要掌握的是什么?

    互联网时代更新换代太快,大学的书本,教育根本跟不上,所以如何用更少的时间掌握最前端的技术,方法很重要. 考虑到这是一个过来人感觉很基础,但是对于初学者又觉得困难重重的问题,我想如果这篇文章要想写得不让 ...

  10. 0 17在c语言中什么意思,exit(0)在c语言中是什么意思

    exit(0)在c语言中是什么意思 exit(0)在c语言中是什么意思? exit(0):正常运行程序并退出程序. exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中, ...

最新文章

  1. 卫星互联网行业深度报告:战火早已熊熊燃烧
  2. .NET多线程编程入门
  3. 给女朋友讲ActiveMQ是啥?
  4. 如果政府强制开发linux应用,Linux开发环境及应用-中国大学mooc-题库零氪
  5. 数据库-日期计算-获取年月日
  6. 启动器中图标的默认路径
  7. 如何安装mysql5.5.6_centos6安装mysql5.5.53
  8. 我是这样分析Linux性能问题的
  9. java Servlet Session
  10. 初学JAVA随记——构造方法
  11. HTML页面多个平行四边形,平行四边形奥数题
  12. 关于VBScript的运行环境
  13. [USACO06NOV]玉米田Corn Fields (状压$dp$)
  14. 大数据分析平台有哪些功能
  15. PAT-A1013. 数素数 (20)
  16. 分享两个线+标注的SLD样式
  17. 使用Match函数对合并单元格的行数进行统计
  18. 修真院教学模式四大体系之职业素养
  19. Mac应用程序无法打开提示不明开发者或文件损坏的处理方法
  20. 烟台理工学校计算机专业,烟台理工学校都有哪些专业

热门文章

  1. Java Excel导出(包含图片) —— Easypoi
  2. python自动翻译pdf_python pdf一键翻译脚本
  3. python学习-02(数据类型、字符串、列表、元祖、字典)
  4. 【网页截图亲测可用】Linux + python3 + selenium + chrome + chrome-driver 服务器端网页截图
  5. Ubuntu压缩、解压
  6. 杨涛:正解“街区制、密路网”
  7. Java解析X509证书代码
  8. 外文参考文献找不到页码怎么办?
  9. 为什么你996猝死,老板007没事?
  10. html实现旋转时钟