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希望大家能從這一條條代碼的解釋得到一絲絲收貨