zoukankan      html  css  js  c++  java
  • 0基础理解C语言调用汇编实现求和函数

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

    工程大概长这样:

    1585922229474

    1585922304963

    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希望大家能从这一条条代码的解释得到一丝丝收货

  • 相关阅读:
    .netcore 通过文件流形式导出Excel,部分列可写,其它列只读实例
    C# NPOI 锁定单元格设置只读
    C# NPOI导出Excel 表格宽度自适应,支持中文
    MySQL 5.7 开启binary log(logbin)及注意事项
    springboot 添加JWT接口认证
    MySql 按姓名 排序
    .netcore3.1 访问静态文件,如图片、Excel等
    Ajax如何设置成同步请求
    项目发布到IIS远程服务器
    在Winform程序中使用Spire.Pdf实现页面添加印章处理(转)
  • 原文地址:https://www.cnblogs.com/lightice/p/12629450.html
Copyright © 2011-2022 走看看