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