ARM學習之ARM匯程式設計序

2021-09-20 14:49:58 字數 2699 閱讀 8342

在arm(thumb)組合語言程式中以程式段為單位組織**。段可以分為**段(code section)和資料段(data section)。乙個匯程式設計序至少應該有乙個**段,當程式較長時,可以分割為多個**段和資料段,多個段在程式編譯鏈結時最終形成乙個可執行的映像檔案。

可執行映像檔案的構成

鏈結器根據系統預設或使用者設定的規則,將各個段安排在儲存器中的相應位置。因此源程式中段之間的相對位置與可執行的映像檔案中段的相對位置一般不會相同

在arm組合語言程式中,子程式的呼叫一般是通過bl指令來實現的。

bl delay           ;delay即子程式名

...ldr r0 ,= 0xffff

delay:

sub r0,r0,#1 ;r0 = r0 - 1

cmp r0,#0 ;比較r0的值是否等於0

bne delay ;不相等則調回去delay執行

ldr r1 ,= 0x08

...

(1)子程式執行時需要儲存子程式的返回位址存到連線暫存器lr中,以及程式計數器pc指向子程式的入口點。

(2)子程式執行完需要返回,只需要將存放在lr中的返回位址重新拷貝給程式計數器pc。

(3)呼叫子程式的同時,也可以完成引數的傳遞和從子程式返回運算的結果,通常可以使用暫存器r0~r3完成

彙編實現字串的拷貝

編譯環境:keil4

area init,code,readonly  

entry

ldr r0,= datablock1 ;獲取字串的位址存到r0中

ldr r2,= datablock2 ;獲取分配的大小為100的記憶體單元的位址存到r2中

cat ldrb r1,[r0],#1 ;取出1位元組的資料存到r1,r0位址加1

strb r1,[r2],#1 ; 將取出的1位元組資料存到r2,r2位址加1

cmp r1, #0 ;比較取出的字串字元是否為'\0'

bne cat ;不是則繼續拷貝

b .datablock1

dcb "hello young man!",0

datablock2

space 100 ;分配100大小的記憶體單元

end ;標識程式結束

獲取學生最高成績:

;init.s

area init,code,readonly ;定義有個名為init的**段(code) 屬性為唯讀

entry

import getmax

import scores

import maxscore

import numofstudent

; mov r0,#1

; mov r1,#2

; cmp r1,r0

; movhi r0,r1

ldr r2,=scores

ldr r4,=numofstudent

ldrb r5,[r4] ;十個學生

ldrb r0,[r2] ;取出第乙個學生的成績

add r2,r2,#1

sub r5,r5,#1 ;取出了第乙個學生,減1

bl getmax

ldr r4,= maxscore

strb r0,[r4]

b .end

;maxoftwo.s

;兩個要比較的數在r0,r1中

;比較所得的最大數放在r0當中

area max,code,readonly

import scores ;宣告scores來自外部

export getmax ;宣告getmax可被外部呼叫

getmax

ldrb r1,[r2],#1 ;取出第二個學生成績

sub r5,r5,#1 ;又取出乙個學生的成績,又減1

cmp r1,r0

movhi r0,r1 ; 比較,把成績高的放到r0中

cmp r5,#0 ;判斷十個學生成績是否取完

bne getmax ;不是繼續執行

bx lr

end

;score.s

export scores ;宣告可scores被外部呼叫

export numofstudent

export maxscore

area score ,data,readwrite ;定義資料段,可讀可寫

scores

dcb 65,78,92,47,77,83,59,93,82,97 ;學生成績

numofstudent

dcb 10 ; 學生人數

maxscore

dcb 0;//存放最高分數

end

ARM匯程式設計序學習

part1 匯程式設計序框架 一 完整框架 section.data 初始化的資料 section.bss 未初始化的資料 section.text global start start 入口 彙編 二 簡化框架 text global start start 彙編 注 以上簡化版為常用框架 par...

ARM匯程式設計序鑑賞 1

area asmembedeedfile code,readonly 定義一段可讀的 區域 export mulcountfunction 輸出函式 mulcountfunction import val 插入變數val mulcountfunction ldr r1,val 取val的暫存器位址,...

ARM匯程式設計序 邏輯控制

area example4,code,readonly 宣告 段example4 entry 標識程式入口 code32 宣告32位arm指令 start if x y z 100 else z 50 設x為r0,y為r1,z為r2 x y z均為無符號整數 mov r0,76 初始化x的值 mov...