工程大概長這樣:
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)
理解程式最快的方法之一莫過於讀現有的程式,先來看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中
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數的加法.
visual studio中C語言呼叫彙編
在visual studio的c語言開發中,呼叫彙編有幾點需要注意的地方 首先要區別masm和masm32,masm是已經整合在visual studio中的彙編器,即彙編使用的ml.exe,可直接使用對已有的彙編 進行彙編。masm32是一套彙編的sdk,其安裝和配置方法在sabalol的博文 中...
c語言呼叫彙編的方法
c部分很簡單,檔名隨便,如main.c 複製 如下 include include void dectobin long dec,char b 宣告外部彙編函式 int main 本人使用的是mac 64位系統,所以64bit暫存器為r開頭,如 kmabupbrax rbx等。c呼叫的 如下,儲存的...
ARM C語言呼叫彙編函式 實現氣泡排序
三 ads除錯 本程式的關鍵是如何使用組合語言實現氣泡排序演算法。可以仿照c語言的 流程,分步驟寫出彙編的 首先要寫出最內層的 部分,也就是資料交換的彙編 資料交換可以使用str資料裝載指令實現。之後要考慮內層迴圈的 可以通過cmp指令控制迴圈次數。最後是編寫最外層的迴圈 也是使用cmp指令,來控制...