chapter4ARM7TDMI匯編語言程序設計_第1頁
chapter4ARM7TDMI匯編語言程序設計_第2頁
chapter4ARM7TDMI匯編語言程序設計_第3頁
chapter4ARM7TDMI匯編語言程序設計_第4頁
chapter4ARM7TDMI匯編語言程序設計_第5頁
已閱讀5頁,還剩59頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

會計學1chapter4ARM7TDMI匯編語言程序設計22023/1/17第4章目錄1.匯編語言的基本概念2.ARM匯編程序的組成與結構3.匯編語言程序設計的基本方法4.匯編語言和C語言交叉編程第1頁/共64頁32023/1/17第4章目錄1.匯編語言的基本概念2.ARM匯編程序的組成與結構3.匯編語言程序設計的基本方法4.匯編語言和C語言交叉編程第2頁/共64頁42023/1/174.1匯編語言的基本概念語言

信息的傳播載體。計算機語言

計算機可以識別、理解的語言。計算機語言的用途:

描述操作和數(shù)據(jù)。數(shù)據(jù)用于描述問題模型;操作用于描述問題處理方法和步驟;第3頁/共64頁52023/1/174.1匯編語言的基本概念

程序設計語言是專門為計算機編程所配置的語言。它們按照形式與功能的不同可分為三類,即機器語言、匯編語言和高級語言。1.機器語言機器語言(MachineLanguage)是由0和1二進制代碼表示和存儲的指令與數(shù)據(jù)。它的特點是能被機器直接識別與執(zhí)行;程序所占內存空間較少。其缺點是難認、難記、難編、易錯。第4頁/共64頁62023/1/172.匯編語言匯編語言(AssemblyLanguage)是一種面向物理層操作的計算機語言,是一種采用助記符表示指令的程序設計語言;匯編語言中使用助記符來表示指令的操作碼和操作數(shù),用標號或符號代表地址、常量或變量。

從機器角度看:匯編語言是一種面向物理層操作的計算機語言。不同的處理器類型,具有不同的匯編語言。使用匯編語言編寫程序能夠直接利用硬件系統(tǒng)的特性(如寄存器、標志、中斷系統(tǒng)等),可直接對位、字節(jié)、字寄存器或存儲單元、I/O端口進行處理,同時也能直接使用CPU指令系統(tǒng)提供的各種尋址方式,編制出高質量的程序,這樣的程序不但占用內存空間少,而且執(zhí)行速度快。第5頁/共64頁72023/1/172.匯編語言源程序示例AREAInit,CODE,READONLYENTRYStartLDRR0,=0x40000500MOVR1,#0x55STRR1,[R0]LDRR0,=0x40000504MOVR1,#0xAASTRR1,[R0]…END第6頁/共64頁82023/1/172.匯編語言上機過程設計、編輯匯編語言源程序;匯編、連接、下載到目標系統(tǒng);調試運行;第7頁/共64頁92023/1/173.高級語言高級語言(HighLevelLanguage)是脫離具體機器(即獨立于機器)的通用語言,不依賴于特定計算機的結構與指令系統(tǒng)。第8頁/共64頁102023/1/17第4章目錄1.匯編語言的基本概念2.ARM匯編程序的組成與結構3.匯編語言程序設計的基本方法4.匯編語言和C語言交叉編程第9頁/共64頁112023/1/174.2ARM匯編程序的組成與結構;文件名:TEST1.S

;功能:實現(xiàn)字符串拷貝功能

;說明:使用ARMulate軟件仿真調試

AREA Example1,CODE,READONLY;聲明代碼段Example1

numEQU20 ;設置拷貝字的個數(shù)

ENTRY ;標識程序入口

CODE32 ;聲明32位ARM指令START LDR R0,=src;R0指向源數(shù)據(jù)塊

LDR R1,=dst;R1指向目的數(shù)據(jù)塊

MOV R2,#num;R2需要拷貝的數(shù)據(jù)個數(shù)

wordcopy

LDR

R3,[R0],#4

;從源數(shù)據(jù)塊中取一個字,放入R3中,

;R0=R0+4

STR

R3,[R1],#4

;將R3中的數(shù)據(jù)存入R1指向的存儲

;單元中,R1=R1+4

SUBS

R2,R2,#1

;R2計數(shù)器減1

BNE

wordcopy

;如果R2不為0,則轉向wordcopy處使用“;”進行注釋標號頂格寫程序代碼段第10頁/共64頁122023/1/17stop MOV R0,#0x18 ;程序運行結束返回編譯器調試環(huán)境

LDR R1,=0x20026 SWI 0x123456

AREABlockData,DATA,READWRITE

;數(shù)據(jù)段的名字BlockDataSrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4Dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 AREA|.extra|,NOINIT,READWRITE

;未初始數(shù)據(jù)段的名字.extradata SPACE 1024 END ;文件結束

聲明文件結束第11頁/共64頁132023/1/174.2ARM匯編程序的組成與結構段:ARM匯編程序由段組成(程序段、數(shù)據(jù)段);段是由匯編器偽指令AREA定義的相對獨立程序塊;段的屬性:READONLY(只讀)或READWRITE(讀寫)分別用于定義一個代碼段或數(shù)據(jù)段;第12頁/共64頁142023/1/174.2ARM匯編程序的組成與結構標識符(標號):(用途)用來表示指令的地址、數(shù)據(jù)的地址、變量、過程名和常量;(組成)標號是一個自行設計的字母數(shù)字串,通常以字母開頭,由字母、數(shù)字、下劃線等組成;(注意1)標號不能與寄存器名、指令助記符、偽指令(操作)助記符等“關鍵字”同名;(注意2)標號必須在一行的開頭書寫,不能留空格;第13頁/共64頁152023/1/174.2.1匯編器偽指令ARM匯編語言程序中,有一些特殊的指令助記符,稱為匯編器偽指令。它們無論表示形式或其在程序中所處的位置,都與指令相似,但二者之間有著重要的區(qū)別。指令是供CPU執(zhí)行的操作命令,每條指令對應CPU的一種特定操作,在用戶代碼運行期間執(zhí)行;而匯編器偽指令是供匯編器處理的命令,在匯編過程中由匯編器進行處理,例如定義數(shù)據(jù)、分配存儲區(qū)、定義段、定義宏等;匯編以后,匯編器偽指令不產生與之對應的目標代碼。第14頁/共64頁162023/1/174.2.1匯編器偽指令AREACODE16、CODE32ENTRYENDEQUDCB、DCW、DCDSPACELTORGALIGN第15頁/共64頁172023/1/174.2.1匯編器偽指令

AREA用途:段聲明;格式:AREA<段名>,<段屬性>,<讀寫屬性>其中:段名

用戶定義的標識符;段屬性CODE/DATA讀寫屬性READONLY/READWRITE第16頁/共64頁182023/1/17;文件名:TEST1.S

;功能:實現(xiàn)字符串拷貝功能

;說明:使用ARMulate軟件仿真調試

AREA Example1,CODE,READONLY

;聲明代碼段Example1

numEQU20 ;設置拷貝字的個數(shù)

ENTRY ;標識程序入口

CODE32 ;聲明32位ARM指令START LDR R0,=src;R0指向源數(shù)據(jù)塊

LDR R1,=dst;R1指向目的數(shù)據(jù)塊

MOV R2,#num;R2需要拷貝的數(shù)據(jù)個數(shù)

wordcopy

LDR

R3,[R0],#4

;從源數(shù)據(jù)塊中取一個字,放入R3中,

;R0=R0+4

STR

R3,[R1],#4

;將R3中的數(shù)據(jù)存入R1指向的存儲

;單元中,R1=R1+4

SUBS

R2,R2,#1

;R2計數(shù)器減1

BNE

wordcopy

;如果R2不為0,則轉向wordcopy處第17頁/共64頁192023/1/17stop MOV R0,#0x18 ;程序運行結束返回編譯器調試環(huán)境

LDR R1,=0x20026 SWI 0x123456

AREABlockData,DATA,READWRITE

;數(shù)據(jù)段的名字BlockDataSrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4Dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 AREA|.extra|,NOINIT,READWRITE

;未初始數(shù)據(jù)段的名字.extradata SPACE 1024 END ;文件結束

第18頁/共64頁202023/1/174.2.1匯編器偽指令

CODE16/32用途:聲明后續(xù)行是16位的Thumb或是32位的ARM指令;格式:CODE16(CODE32)代碼示例:

code16addr0,r1;Thumb指令

code32addr0,r1;ARM指令第19頁/共64頁212023/1/17;文件名:TEST1.S

;功能:實現(xiàn)字符串拷貝功能

;說明:使用ARMulate軟件仿真調試

AREA Example1,CODE,READONLY;聲明代碼段Example1

numEQU20 ;設置拷貝字的個數(shù)

ENTRY ;標識程序入口

CODE32

;聲明32位ARM指令START LDR R0,=src;R0指向源數(shù)據(jù)塊

LDR R1,=dst;R1指向目的數(shù)據(jù)塊

MOV R2,#num;R2需要拷貝的數(shù)據(jù)個數(shù)

wordcopy

LDR

R3,[R0],#4

;從源數(shù)據(jù)塊中取一個字,放入R3中,

;R0=R0+4

STR

R3,[R1],#4

;將R3中的數(shù)據(jù)存入R1指向的存儲

;單元中,R1=R1+4

SUBS

R2,R2,#1

;R2計數(shù)器減1

BNE

wordcopy

;如果R2不為0,則轉向wordcopy處第20頁/共64頁222023/1/174.2.1匯編器偽指令

ENTRY用途:聲明程序的入口,編譯程序會把這個入口的地址定義為系統(tǒng)復位后的程序的起始點;格式:ENTRY代碼示例:

AREAInit,CODE,READONLY

ENTRYCODE32StartLDRR0,=0x40000500LDRR1,#0xFFSTRR1,[R0]

…END第21頁/共64頁232023/1/174.2.1匯編器偽指令

END用途:聲明匯編源程序的結束(末行);格式:END代碼示例:

AREAInit,CODE,READONLYENTRY CODE32StartLDRR0,=0x3FF5000LDRR1,#0xFFSTRR1,[R0]

END第22頁/共64頁242023/1/174.2.1匯編器偽指令

EQU用途:聲明程序的入口;格式:EQU代碼示例:

AREAInit,CODE,READONLYZQL_V

EQU0x40000500ENTRY CODE32StartLDRR0,=ZQL_VLDRR1,#0xFFSTRR1,[R0]

…END第23頁/共64頁252023/1/174.2.1匯編器偽指令

DCB用途:在程序存儲區(qū)預存字節(jié)數(shù)據(jù);格式:<標號>DCB<字節(jié)數(shù)據(jù)列表>代碼示例:

AREAInit,CODE,READONLYZQL_DB

DCB0x01,0x04,0x09,0x10,0x19ENTRY CODE32StartLDRR0,=ZQL_DB

LDRR2,[R0,R1]

…END備注:DCB也可用“=”代替;第24頁/共64頁262023/1/174.2.1匯編器偽指令

DCW用途:在程序存儲區(qū)預存半字數(shù)據(jù)(2B);格式:<標號>DCW<半字數(shù)據(jù)列表>代碼示例:

AREAInit,CODE,READONLYZQL_DW

DCW0x01,0x04,0x09,0x10,0x19ENTRY CODE32StartLDRR0,=ZQL_DW

LDRR2,[R0,R1,LSL#1]

…END備注:DCW預存的數(shù)據(jù)在存儲器中半字對齊存放;第25頁/共64頁272023/1/174.2.1匯編器偽指令

DCD用途:在程序存儲區(qū)預存字數(shù)據(jù)(4B);格式:<標號>DCD<字數(shù)據(jù)列表>代碼示例:

AREAInit,CODE,READONLYZQL_DD

DCD0x01,0x04,0x09,0x10,0x19ENTRY CODE32StartLDRR0,=ZQL_DD

LDRR2,[R0,R1,LSL#2]

…END備注:DCD預存的數(shù)據(jù)在存儲器中字對齊存放;

DCD也可用“&”代替;第26頁/共64頁282023/1/174.2.1匯編器偽指令

SPACE用途:在存儲區(qū)預留初值為0x00的空間;格式:<標號>SPACE<字節(jié)個數(shù)>代碼示例:

AREAInit,CODE,READONLYZQL_DDDCD0x01,0x04,0x09,0x10,0x19ENTRY CODE32StartLDRR0,=ZQL_DDLDRR2,[R0,R1,LSL#2]

…BuffSPACE4096END第27頁/共64頁292023/1/174.2.1匯編器偽指令

LTORG用途:聲明一個文字池的位置;格式:LTORG文字池的起源與應用:用于預存放任何32bit的數(shù)據(jù)常量,供LDR加載指令使用,實現(xiàn)對任意立即數(shù)的訪問;解釋:立即數(shù)包含在32bit的指令碼中,必須是‘8位圖立即數(shù)’,這就限制了立即數(shù)的取值;ARM匯編語言提供了LDR加載指令附加文字池的方法,文字池中可以存放任意的32bit數(shù),LDR加載指令相對尋址文字池,以實現(xiàn)對任意立即數(shù)的訪問。第28頁/共64頁302023/1/17匯編過程中,匯編器會默認地在每一個程序段的末尾填加一個文字池。需要注意的是,文字池不能遠離文字池使用者(LDR指令),因為LDR指令的尋址范圍是指令位置的前后4KB。如果用戶程序比較大,則可能使程序段的末尾超出4KB范圍,此時需要在程序中的適當位置,使用LTORG偽指令顯式聲明文字池。一般總可以在LDR偽指令前后4KB的范圍內找到分支指令,文字池可聲明在分支(B)指令之后的緊鄰位置,不會影響代碼的正常執(zhí)行,因為B指令總是會將程序的執(zhí)行轉移到其它地方的。第29頁/共64頁312023/1/17缺省文字池 AREAdefault,CODE,READONLY ENTRY CODE32start LDR R1, =0xABCDEF LDR R2, =0x101 ADD R3, R1, R2 B ·

;匯編器默認的文字池位置 ;常數(shù)0xABCDEF、0x101即存放于此 END地址機器指令碼匯編指令注釋start [0xe59f1008] ldr r1,0x00008010 ;=#0x00abcdef00008004 [0xe59f2008] ldr r2,0x00008014 ;=#0x0000010100008008 [0xe0813002] add r3,r1,r20000800c [0xeafffffe] b 0x800c ; (start+0xc)00008010 [0x00abcdef] dcd 0x00abcdef

00008014 [0x00000101] dcd 0x00000101

第30頁/共64頁322023/1/17自定義文字池 AREAdefault,CODE,READONLY ENTRY CODE32start

LDR R1, =0xABCDEF;文字池使用處 LDR R2, =0x101 ADD R3,R1, R2 Bbranch … ;其它匯編代碼branch … ;其它匯編代碼other SPACE4096 END;默認文字池位置超遠?。繀R編器缺省文字池位于程序段的末尾,如果程序段較長,這個缺省的文字池和LDR指令的距離有可能超出了4KB,那么LDR指令不能正確加載數(shù)據(jù)。 AREAdefault,CODE,READONLY ENTRY CODE32start

LDR R1, =0xABCDEF;文字池使用者 LDRR2, =0x101 ADDR3,R1,R2 Bbranch

LTORG ;顯示聲明文字池位置 … ;其它匯編代碼branch … ;其它匯編代碼other SPACE4096 ENDstart [0xe59f1008] ldr r1,0x00008010 ;=#0x00abcdef00008004 [0xe59f2008] ldr r2,0x00008014 ;=#0x0000010100008008 [0xe0813002] add r3,r1,r20000800c [0xea000001] b branch00008010 [0x00abcdef] dcd 0x00abcdef

00008014 [0x00000101] dcd 0x00000101

branch [0xe1a01001] mov r1,r10000801c [0xeafffff7] b startother [0x00000000] dcd 0x0000000000008024 [0x00000000] dcd 0x0000000000008028 [0x00000000] dcd 0x00000000第31頁/共64頁332023/1/174.2.1匯編器偽指令

LTORG用途:聲明一個文字池(literalpool)的位置;格式:LTORG代碼示例:

AREAEXP_LTOGR,CODE,READONLYENTRYCODE32StartLDRR0,=0x12345678LDRR2,=0x87654321

…Blabel

LTORG

…BuffSPACE4096END在文字池使用者±4KB范圍內的某個B指令后臨,使用LTORG聲明文字池;第32頁/共64頁342023/1/17第4章目錄1.匯編語言的基本概念2.ARM匯編程序的組成與結構3.匯編語言程序設計的基本方法4.匯編語言和C語言交叉編程第33頁/共64頁352023/1/174.3匯編語言程序設計的基本方法描述問題模型;(數(shù)據(jù)描述)(物理問題→數(shù)學抽象模型→計算機存儲模型)描述問題處理方法;(算法描述)計算機語言主要用于編程(程序設計)。匯編語言程序設計的主要工作基于計算機工作平臺,使用匯編語言:第34頁/共64頁362023/1/174.3匯編語言程序設計的基本方法計算機工作平臺的知識;匯編指令系統(tǒng)基本掌握;數(shù)學建模、存儲器表示基礎知識;分析、解決問題方法描述能力;匯編語言程序設計的基本素質要求:第35頁/共64頁372023/1/174.3.1結構化程序設計的基本概念迪杰斯克拉(E.W.dijkstra)在1969年提出結構化程序設計的基本思想;采用“自頂向下,逐步求精”的程序設計方法?!皢稳肟趩纬隹凇钡目刂平Y構?!白皂斚蛳隆⒅鸩角缶背绦蛟O計方法的主導思想是從問題本身開始,對問題逐步分解,將解決問題的方法步驟逐步細化,分解為由基本程序結構模塊組成的結構化程序框圖,直至便于編程實現(xiàn);“單入口單出口”的思想認為一個復雜的程序,如果它僅是由順序、分支、循環(huán)和子程序四種基本程序結構的組合、嵌套構成,那么這個新構造的程序一定是一個單入口單出口的程序。

第36頁/共64頁382023/1/174.3.2匯編語言程序設計的流程使用計算機通過編程序解決某一問題時,通常按以下步驟進行:分析問題,建立數(shù)學模型;確定算法;設計程序流程圖;合理分配寄存器、存儲空間和外設資源;編制程序;調試程序;形成文檔;研討目標系統(tǒng)的本質特性,用數(shù)學方法對其本質特性進行抽象描述,建立目標系統(tǒng)的數(shù)學表示模型

在已建立的目標系統(tǒng)數(shù)學表示模型上,進一步研討目標系統(tǒng)的內在規(guī)則,設計相應處理法則方案(算法分析與描述)把解題的方法、步驟用框圖形式表示。如果問題比較復雜,那么可以逐步細化,直到每一框圖可以容易編程為止。流程圖不僅便于程序的編制,且對程序邏輯正確性也比較容易查找和修改。①合理地分配存儲器資源,將前述的目標系統(tǒng)‘數(shù)據(jù)結構模型’表示到各存儲器單元。②

CPU寄存器數(shù)量有限,在程序中,大多數(shù)操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆棧操作使用SP/R13等),程序中要合理分配各寄存器的用途。用計算機語言,對數(shù)據(jù)結構模型和流程圖表示的算法進行準確地描述。①語法調試:排除程序中的語法錯誤。②功能調試:保證程序的邏輯功能正確性。用文檔形式記錄說明程序的功能、使用方法、程序結構、算法流程等每一個階段的工作。第37頁/共64頁392023/1/174.3.3順序程序設計順序程序是一種最簡單的程序結構,也稱為直線程序,它的執(zhí)行自始自終按照語句的先后順序進行。這種結構的流程圖,除了有一個起始框,一個終止框外,就是若干執(zhí)行框。第38頁/共64頁402023/1/17例4?2試編制一程序,完成10+3的操作。

AREAARMex,CODE,READONLY ;代碼段名ARMex ENTRY ;程序的入口

CODE32start

MOV R0, #10

;將立即數(shù)10存入寄存器R0

MOV R1, #3

;將立即數(shù)3存入寄存器R1

ADD R0, R0, R1

;R0=R0+R1stop MOV R0, #0x18 ;這三條指令是ADS調試環(huán)境特約

LDR R1, =0x20026 ;程序運行結束返回編譯器調試環(huán)境

SWI 0x123456 END ;結束

第39頁/共64頁412023/1/174.3.4分支程序設計許多實際問題需要根據(jù)不同的情況作出不同的處理。在程序中,針對不同的情況把不同的處理方法編制成各自的處理程序段,運行時由機器根據(jù)當時的條件自動作出判斷,選擇執(zhí)行相應的處理程序段。這樣的程序結構中,計算機不再完全按指令存儲的順序執(zhí)行,稱之為分支。分支程序使用轉移指令B、子程序調用指令BL或帶狀態(tài)轉移指令BX來實現(xiàn)。第40頁/共64頁422023/1/17例4?3給定以下符號函數(shù):

任意給定值,假定為-25,存放在x單元,函數(shù)值存放在y單元;要求根據(jù)x中的值來確定y的值。

R3=-1R3=0 AREAsymbol,CODE,READONLY ;代碼段的名字symbol ENTRY ;程序的入口

CODE32start LDRR0,=x ;加載數(shù)據(jù)段中的變量x地址,存入R0 LDRR1,=y ;加載數(shù)據(jù)段中的變量y地址,存入R1 LDR R2,[R0] ;加載變量x的值,存入R2compare CMP R2,#0 ;將R2的值與0作比較

BEQ ZERO ;如果R2等于0,那么轉向標號ZERO處

BGT PLUS ;如果R2大于0,那么轉向標號PLUS處

MOV R3,#-1 ;否則,R2小于0,將-1存入R3中

B stopZERO MOV R3,#0 ;R2等于0,將0存入R3中

B stopPLUS MOV R3,#1 ;R2大于0,將1存入R3中;續(xù)上段代碼stop STR R3,[R1]

MOV R0,#0x18 LDR R1,=0x20026 SWI 0x123456

AREAData,DATA,READWRITEx DCD -25y DCD 0 END第41頁/共64頁432023/1/174.3.5循環(huán)程序設計順序程序和分支程序中的指令每次運行最多只執(zhí)行一次。在實際應用中重復地做某些事的情況很多,這也是計算機最擅長的工作方式。重復地執(zhí)行某些指令,最好用循環(huán)程序來實現(xiàn)。循環(huán)程序的結構重復地執(zhí)行同一種運算,直到某種條件滿足。初始化循環(huán)體修改判斷判斷結束循環(huán)程序的主體業(yè)務代碼,可以是一個順序程序、分支程序或另一個循環(huán)程序。例如:計數(shù)控制循環(huán);通過計數(shù)循環(huán)次數(shù),判斷是否已達到預定次數(shù),控制循環(huán)。條件控制循環(huán):通過判斷循環(huán)終止條件是否已成立,控制循環(huán)。建立循環(huán)初始值。如設置地址指針、計數(shù)器、其他循環(huán)參數(shù)的起始值等。判斷循環(huán)結束條件是否成立,決定是否繼續(xù)循環(huán)。對循環(huán)結束進行適當處理;有的循環(huán)程序可以沒有這部分。為執(zhí)行下一個循環(huán)而修改某些參數(shù),尤其循環(huán)控制變量的修改等。第42頁/共64頁442023/1/17用計數(shù)控制循環(huán)

適用于已知循環(huán)次數(shù)的循環(huán)程序設計

例4?4從x單元開始的30個連續(xù)字單元中存放有30個無符號數(shù),從中找出最大者送入y單元中。分析:根據(jù)題意,把第一個數(shù)先送入Rx寄存器,將Rx中的數(shù)與后面的29個數(shù)逐個進行比較,如果Rx中的數(shù)較小,則將該較大的數(shù)送入Rx;繼續(xù)與余下的數(shù)據(jù)逐個比較。在比較過程中,Rx中始終保持較大的數(shù),共計比較29次,則最終Rx

中保留了最大數(shù),最后把Rx中的數(shù)(最大者)送入y單元。 AREAmax,CODE,READONLY ;代碼段的名字max ENTRY ;程序的入口

CODE32num EQU 29;比較的次數(shù)start LDR R0,=x;R0指向源數(shù)據(jù)塊x LDR R1,=y;R1指向單元y LDR R2,=num;R2作為計數(shù)器

LDR R3,[R0];將源數(shù)據(jù)塊x中第一個數(shù)加載到R3中compare ADD R0,R0, #;每進行一次比較,將R0指針地址加4 LDR R4,[R0];依次將源數(shù)據(jù)塊x中下一個數(shù)加載到R4中

CMP R3,R4;比較R3和R4中數(shù)的大小

MOVCCR3,R4;如果R3小于R4,則將較大的數(shù)送入R3中

SUBS R2,R2,#;計數(shù)器值減1 BNE compare;如果不為0,那么繼續(xù)跳到compare執(zhí)行

STREQ R3,[R1];如果為0,那么循環(huán)比較結束,R3是最大的數(shù)

;并且將R3中的數(shù)加載到R1指向的單元(即y)中stop MOV r0,#0x18 LDR r1,=0x20026 SWI 0x123456 AREAData,DATA,READWRITEx DCD 73,59,61,34,81,107,225,231,54,43 DCD 100,35,1,42,222,254,34,71,100,31 DCD 33,119,13,44,18,147,55,244,97,3y DCD 0 END第43頁/共64頁452023/1/17② 適用于已知循環(huán)條件的循環(huán)程序設計適用于無法確定循環(huán)次數(shù),但知道循環(huán)結束的條件例4?5從自然數(shù)1開始累加,直到累加和大于1000為止,統(tǒng)計被累加的自然數(shù)的個數(shù),并把統(tǒng)計的個數(shù)送入n單元,把累加和送入sum單元。分析:根據(jù)題意,被累加的自然數(shù)的個數(shù)事先未知,因此不能用計數(shù)方法控制循環(huán)。但題目中給定一個條件,即累加和大于1000則停止累加,因此,可以根據(jù)這一條件控制循環(huán)。我們用R3寄存器放累加和,用R4寄存器放每次取得的自然數(shù),其中它的值也是統(tǒng)計自然數(shù)的個數(shù)。AREASUM,CODE,READONLY ;代碼段的名字SUMENTRY ;程序的入口

CODE32startLDRR0,=n;將數(shù)據(jù)段中自然數(shù)的個數(shù)n的地址加載到R0寄存器

LDRR1,=sum;將數(shù)據(jù)段中自然數(shù)的累加和sum的地址加載到R1寄存器

LDRR3,=0;R3存放自然數(shù)的累加和

LDRR4,=0;R4用于循環(huán)個數(shù)的統(tǒng)計/每次取得的自然數(shù)

LDRR5,=1000;R5用于循環(huán)結束的界限值continueADD R4,R4, #1;取下一個自然數(shù)

ADD R3,R3, R4;累加自然數(shù)

CMP R3,R5;比較累加和是否超過了1000BCC continue;如果小于1000,那么跳到compare執(zhí)行

STRCSR3,[R1];如果大于1000,那么將累加和存儲到R1所指向的單元中

STRCSR4,[R0];如果大于1000,那么將已累加的自然數(shù)個數(shù)值存儲

;到R0所指向的單元中stopMOVr0,#0x18LDRr1,=0x20026 SWI0x123456

AREAData,DATA,READWRITEn DCD 0 ;定義累加的自然數(shù)的個數(shù)sum DCD 0 ;定義自然數(shù)的累加和

END第44頁/共64頁462023/1/17雙重循環(huán)應用舉例:冒泡算法對N個單元數(shù)據(jù)排序!a0a1a2a3a(N-2)a(N-1)數(shù)據(jù)模型計算法分析:1、每個數(shù)據(jù)4個字節(jié),內存中連續(xù)存放;2、冒泡算法;(同學們可否試描述該算法?)第45頁/共64頁472023/1/17Data_TAB待排序的數(shù)據(jù)表頭;N表中數(shù)據(jù)個數(shù);

冒泡排序算法框圖第46頁/共64頁482023/1/174.3.6子程序設計子程序概念

如果在一個程序中的多處用到同一段程序代碼,那么可以把這段共同的程序代碼抽取出來,寫成一個相對獨立的程序段,每當需要執(zhí)行這段代碼時,就調用這個程序段,執(zhí)行完這個程序段后,再返回原來調用它的程序。這樣編寫程序時,就不必重復寫這段代碼了,而這樣的程序段稱為子程序或子過程。子程序的調用與返回主程序中使用BL指令實現(xiàn)子程序的調用

BL 子程序名在子程序結束處,使用如下指令返回到主程序中。

MOV PC, LR主程序與子程序之間的參數(shù)傳遞

主程序調用子程序時,可以向子程序傳遞一些參數(shù);同樣,子程序運行后也可把一些結果參數(shù)傳回給主程序。主程序與子程序之間的這種信息傳遞稱為參數(shù)傳遞。三種參數(shù)傳遞方式

①寄存器傳遞參數(shù)方式 ②存儲區(qū)域傳遞參數(shù)方式

③堆棧傳遞參數(shù)方式第47頁/共64頁492023/1/17寄存器傳遞參數(shù)方式

技術思想:主程序將待傳遞的數(shù)據(jù)直接寫入約定的通用寄存器,在子程序中直接使用;或子程序返回后,主程序直接從約定的通用寄存器中獲得子程序的結果數(shù)據(jù)。應用特點:這種方式適合于傳遞較少參數(shù)的應用場合。

例4?5用子程序實現(xiàn)內存區(qū)里的字符串拷貝功能,即將存儲單元中源字符串對應拷貝到目的字符串中。解題思路:通過設定兩個地址指針,分別指向存儲區(qū)中的源字符串和目的字符串;然后通過加載和存儲指令(LDR和STR)的寄存器間接尋址方式,依次從源字符串讀取一個字符數(shù)據(jù),寫入到目的字符串的對應字符位置中,直到遇到源字符串的結束標志’\0’為止。AREAStrCopy,CODE,READONLYENTRYCODE32startLDRR1,=srcstr;R1指向數(shù)據(jù)區(qū)的源字符串

LDRR0,=dststr;R0指向數(shù)據(jù)區(qū)的目的字符串

BLstrcopy;調用子程序strcopy,完成字符串拷貝stopMOVR0,#0x18 ;程序結束返回編譯器調試環(huán)境

LDRR1,=0x20026SWI0x123456strcopyLDRBR2,[R1],#1;將R1指向的單元內容加載到R2中

STRBR2,[R0],#1;將R2中的數(shù)存儲到R0指向的單元中

CMPR2,#0;檢查R0的值是否等于0BNEstrcopy;如果不等于0,那么轉到strcopy處執(zhí)行

MOVPC,LR;子程序返回AREAStrings,DATA,READWRITEsrcstrDCB"Firststring-source",0 ;源字符串dststrDCB"Secondstring-destination",0 ;目的字符串

END第48頁/共64頁502023/1/17存儲區(qū)域傳遞參數(shù)方式

技術思想:主程序和子程序約定了某一共享內存塊用于參數(shù)傳遞,主程序在BL調用子程序前,先將要傳遞的參數(shù)寫入到約定的存儲單元,子程序可從約定的內存讀取這些參數(shù);子程序返回時,也可以使用該方式將數(shù)據(jù)傳給主程序。

應用特點:這種方式可以傳遞大批量數(shù)據(jù)。實現(xiàn)方法:當主程序與子程序有較多的數(shù)據(jù)需要傳遞時,可以通過共享內存區(qū)或傳內存數(shù)據(jù)塊地址方式來傳遞批量數(shù)據(jù)。通過偽指令ADR直接裝載近距離數(shù)據(jù)塊地址;通過偽指令ADRL直接裝載中距離數(shù)據(jù)塊地址;通過語句LDRRd,=Label轉載遠距離的數(shù)據(jù)塊地址;

例4?6通過設置的入口參數(shù)查找函數(shù)地址表,實現(xiàn)選擇不同的函數(shù)功能。說明:本題中通過事先將函數(shù)地址存放在存儲單元中,通過查找地址表的方法,實現(xiàn)根據(jù)“選擇項(choice)”進入不同的函數(shù)體功能。

第49頁/共64頁512023/1/17存儲區(qū)域傳遞參數(shù)方式

AREAJump,CODE,READONLYnumEQU4 ;函數(shù)地址表內容的個數(shù)

ENTRYCODE32start

LDRR0,=choice ;R0指向存儲區(qū)的choice單元

LDRR0,[R0] ;設置第一個參數(shù):選擇執(zhí)行哪一個函數(shù)

MOVR1,#16 ;設置第1個操作數(shù)

MOVR2,#2 ;設置第2個操作數(shù)

BLarithfunc ;調用子程序arithfuncstopMOVR0,#0x18 ;程序結束返回編譯器調試環(huán)境

LDRR1,=0x20026SWI 0x123456arithfuncCMPR0,#num;比較R0的值是否超過函數(shù)地址表的個數(shù)

MOVHSPC,LR ;如果大于,那么就返回到標號stop處

ADRR3,JumpTable ;將函數(shù)地址表的地址作為基地址

LDRPC,[R3,R0,LSL#2] ;根據(jù)R0參數(shù)進入對應的子程序JumpTable ;函數(shù)地址表的入口基地址

DCD DoAdd ;加法子程序

DCD DoSub ;減法子程序

DCD DoMul ;乘法子程序

DCD DoDiv ;除法子程序DoAddADDR0,R1,R2;R0=R1+R2MOVPC,LR ;返回DoSubSUBR0, R1,R2 ;R0=R1-R2MOVPC, LR ;返回DoMul MOVR0,R1,LSLR2 ;R0=R1<<R2MOVPC,LR ;返回DoDiv MOVR0,R1,LSRR2 ;R0=R1>>R2MOVPC,LR ;返回

AREANUM,DATA,READWRITEchoice DCD 3;0:表示選擇加法子程序1:表示選擇減法子程序

;2:表示選擇乘法子程序3:表示選擇除法子程序

END第50頁/共64頁522023/1/17③堆棧傳遞參數(shù)方式

主程序和子程序使用同一個堆棧,主程序在BL調用子程序前,先將要傳遞的參數(shù)壓入到堆棧中,子程序可從堆棧中讀取傳過來的數(shù)據(jù);子程序返回需要向主程序傳遞參數(shù)時,也可使用此方法。第51頁/共64頁532023/1/17第4章目錄1.匯編語言的基本概念2.ARM匯編程序的組成與結構3.匯編語言程序設計的基本方法4.匯編語言和C語言交叉編程第52頁/共64頁542023/1/174.4匯編語言和C語言交叉編程ADS不但支持ARM/Thumb匯編語言程序設計;在微控器模型頭文件的支持下,還支持ANSIC和C++語言程序設計,支持對功能寄存器的訪問。實際的嵌入式軟件中,大部分的代碼使用C語言編寫。第53頁/共64頁552023/1/174.4匯編語言和C語言交叉編程C語言支持豐富的抽象數(shù)據(jù)類型,更便于對目標系統(tǒng)進行數(shù)學模型描述和算法描述;編制的程序結構比較好,便于人的理解和維護;大量的支持庫可供直接選用。使用C進行程序設計的理由:第54頁/共64頁562023/1/174.4匯編語言和C語言交叉編程系統(tǒng)底層必須用匯編語言編寫(如:啟動代碼);匯編語言編寫的代碼執(zhí)行效率更高;特殊的需求(軟件延時)。還要學習匯編語言的理由:第55頁/共64頁572023/1/174.4匯編語言和C語言交叉編程匯編程序與C程序間的變量互訪;匯編程序調用C程序;C程序調用匯編程序;C程序中內嵌匯編程序;本小節(jié)主要內容:第56頁/共64頁582023/1/174.4.1匯編程序與C程序間的變量互訪

C程序訪問匯編程序中的變量

具體操作步驟:在匯編語言程序中,用偽指令“global”定義全局變量,變量名必須是下劃線“_”為首字符的字母數(shù)字串;C程序中將該變量聲明為外部變量,即可訪問匯編程序定義的全局變量。

匯編程序訪問C程序中的變量 具體操作步驟:在C程序中,將供匯編程序訪問的變量用關鍵字extern聲明為全局外部變量;匯編程序中,用偽指令IMPORT引入C程序中聲明的全局變量;使用偽指令LDR讀取這個全局變量的地址;使用指令LDR讀取這個全局變量的值;在匯編程序中使用這個全局變量;第57頁/共64頁592023/1/17例:匯編程序和C程序間變量互訪/*print.c定義全局變量,并作為主程序*/#include<stdio.h>externintg_var=124;

/*全局變量*/externasmVisit(void);

/*匯編程序中聲明的全局函數(shù)*/externint_multiple; /*聲明匯編程序中的全局變量_multiple為外部變量*/intmain(){printf("Originalvalueofg_varis:%d\n",g_var);asmVisit(); /*調用匯編程序中的函數(shù),訪問全局變量g_var*/printf("multis%d",_multiple); /*訪問匯編程序中全局變量_multiple*/printf("Modifiedvalueofg_varis:%d",g_var);return0;};visit.s文件

AREAasmfile,CODE,READONLY

EXPORTasmVisit ;聲明全局函數(shù),供C程序調用??

IMPORTg_var ;引入在C程序中聲明定義的全局變量

GLOBAL_multiple ;聲明全局變量,供C程序訪問asmVisit LDR R0, =g_var LDR R1, [R0] LDR R2, =_multiple LDR R2, [R2] MOV R3, R1,LSLR2 ;將R1中的值擴大指定的倍數(shù)

STR R3, [R0] MOV PC, LR AREAasmData,DATA,READWRITE_multipleDCD2 END第58頁/共64頁602023/1/172.匯編程序調用C程序

匯編程序中調用C函數(shù),只需在匯編程序中用偽指令IMPORT將需要調用的C函數(shù)名引用即可,然后將C函數(shù)放在一個獨立的C文件中進行編譯,剩下的工作就由鏈接器來處理。匯編程序與C函數(shù)間參數(shù)的傳遞規(guī)則遵守ATPCS(ARMThumbProcedure

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論