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

猜你喜欢

转载自www.cnblogs.com/lightice/p/12629450.html
今日推荐