c语言 中的求和函数,0基础理解C语言调用汇编实现求和函数
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语言调用汇编实现求和函数相关推荐
- C语言视频教程免费分享,0基础学C语言
C语言是一种通用的.过程式的编程语言,广泛用于系统与应用软件的开发.作为计算机编程的基础语言,长期以来它一直是编程爱好者追捧而又比较难学的语言.C语言是一种计算机程序设计语言,它既具有高级语言的特点, ...
- c语言中数组结尾的0的作用,C语言里面一个数组最后的\0表示什么意思?
qq_莫非 #include #include #include #include #include #include #include #include #include #define PORT ...
- 在 Flutter 中使用 webview_flutter 4.0 | 基础用法与事件处理
大家好,我是 17. Flutter WebView 一共写了四篇文章 在 Flutter 中使用 webview_flutter 4.0 | js 交互 Flutter WebView 性能优化,让 ...
- c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?
考虑以下程序(请参见此处的现场演示). #include int main(void) { int ; // Missing variable name puts("Surprise&qu ...
- c语言的调试是对源文件进行,理解C语言——从小菜到大神的晋级之路(3)——C源程序的基本结构与调试方法...
本期视频点击这里 在上一篇中,我们进行了Visual Studio 2013的安装以及第一个demo程序"HelloWorld"的建立.现在我们看一下其中的源代码及相关的C语言基础 ...
- C 语言新手入门教程,0 基础的小伙伴请进~(书籍推荐+项目推荐)
所有学过 C 语言的人,还记得被指针支配的恐惧吗?还记得一个叫谭浩强的男人吗? 如果你是一名高校大学生,或者在准备计算机等级考试,小编为你准备了一篇非常好的 C 语言入门文章! 从零基础入门讲起,循序 ...
- 思路不对努力白费!0基础学好C语言编程,必须掌握的学习思路!
计算机行业发展非常快,大学里的教育基本都跟不上实际的社会需求.如果你所在的学校还在指定大家使用谭浩强的教材,或使用VC6.0来教大家上机实验,那你不妨看看本文,这里有一些建议可以帮助你不会脱离社会太远 ...
- memcpy函数_如何理解c语言中的回调函数
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不 ...
- 选择大于努力!0基础学好C语言编程,首先要掌握的是什么?
互联网时代更新换代太快,大学的书本,教育根本跟不上,所以如何用更少的时间掌握最前端的技术,方法很重要. 考虑到这是一个过来人感觉很基础,但是对于初学者又觉得困难重重的问题,我想如果这篇文章要想写得不让 ...
- 0 17在c语言中什么意思,exit(0)在c语言中是什么意思
exit(0)在c语言中是什么意思 exit(0)在c语言中是什么意思? exit(0):正常运行程序并退出程序. exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中, ...
最新文章
- 卫星互联网行业深度报告:战火早已熊熊燃烧
- .NET多线程编程入门
- 给女朋友讲ActiveMQ是啥?
- 如果政府强制开发linux应用,Linux开发环境及应用-中国大学mooc-题库零氪
- 数据库-日期计算-获取年月日
- 启动器中图标的默认路径
- 如何安装mysql5.5.6_centos6安装mysql5.5.53
- 我是这样分析Linux性能问题的
- java Servlet Session
- 初学JAVA随记——构造方法
- HTML页面多个平行四边形,平行四边形奥数题
- 关于VBScript的运行环境
- [USACO06NOV]玉米田Corn Fields (状压$dp$)
- 大数据分析平台有哪些功能
- PAT-A1013. 数素数 (20)
- 分享两个线+标注的SLD样式
- 使用Match函数对合并单元格的行数进行统计
- 修真院教学模式四大体系之职业素养
- Mac应用程序无法打开提示不明开发者或文件损坏的处理方法
- 烟台理工学校计算机专业,烟台理工学校都有哪些专业
热门文章
- Java Excel导出(包含图片) —— Easypoi
- python自动翻译pdf_python pdf一键翻译脚本
- python学习-02(数据类型、字符串、列表、元祖、字典)
- 【网页截图亲测可用】Linux + python3 + selenium + chrome + chrome-driver 服务器端网页截图
- Ubuntu压缩、解压
- 杨涛:正解“街区制、密路网”
- Java解析X509证书代码
- 外文参考文献找不到页码怎么办?
- 为什么你996猝死,老板007没事?
- html实现旋转时钟