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

  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/lightice/p/12629450.html
Copyright © 2011-2022 走看看