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

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

工程大概长这样:

c语言 中的求和函数,0基础理解C语言调用汇编实现求和函数_第1张图片

c语言 中的求和函数,0基础理解C语言调用汇编实现求和函数_第2张图片

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语言,中的求和函数)