0基礎理解C語言呼叫彙編實現求和函式

2022-02-13 02:45:09 字數 1672 閱讀 5221

工程大概長這樣:

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指令,來控制...