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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM