




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
2022/10/12計算機學院1第4章
ARM7TDMI匯編語言
程序設計計算機學學院22020-02-11第4章匯匯編語言言程序設設計1.匯編語言言的基本本概念2.ARM匯匯編程序序的組成成與結(jié)構(gòu)構(gòu)3.匯編語言言程序設設計的基基本方法法4.匯編語言言和C語語言交叉叉編程計算機學學院32020-02-114.1匯編語言言的基本本概念程序設計計語言是是專門為為計算機機編程所所配置的的語言。。它們按按照形式式與功能能的不同同可分為為三種,,即機器器語言、、匯編語語言和高高級語言言。1機器語言言機器語言言(MachineLanguage)是由0和1二進制代代碼書寫寫和存儲儲的指令令與數(shù)據(jù)據(jù)。它的的特點是是能被機機器直接接識別與與執(zhí)行;;程序所所占內(nèi)存存空間較較少。其其缺點是是難認、、難記、、難編、、易錯。。計算機學學院42020-02-112匯編語言言匯編語言言(AssemblyLanguage)是一種種面向物物理層操操作的計計算機語語言,是是一種采采用助記記符表示示的程序序設計語語言,使使用助記記符來表表示指令令的操作作碼和操操作數(shù),,用標號號或符號號代表地地址、常常量或變變量。從機器角角度看::匯編語言言是一種種面向物物理層操操作的計計算機語語言。不同的處處理器類類型,具具有不同同的匯編編語言。。使用匯匯編語言言編寫程程序能夠夠直接利利用硬件件系統(tǒng)的的特性((如寄存存器、標標志、中中斷系統(tǒng)統(tǒng)等),,可直接接對位、、字節(jié)、、字寄存存器或存存儲單元元、I/O端口進行行處理,,同時也也能直接接使用CPU指令系統(tǒng)統(tǒng)提供的的各種尋尋址方式式,編制制出高質(zhì)質(zhì)量的程程序,這這樣的程程序不但但占用內(nèi)內(nèi)存空間間少,而而且執(zhí)行行速度快快。計算機學學院52020-02-113高級語言言高級語言言(HighLevelLanguage)是脫離離具體機機器(即即獨立于于機器))的通用用語言,,不依賴賴于特定定計算機機的結(jié)構(gòu)構(gòu)與指令令系統(tǒng)。。計算機學學院62020-02-11第4章匯匯編語言言程序設設計1.匯編語言言的基本本概念2.ARM匯匯編程序序的組成成與結(jié)構(gòu)構(gòu)3.匯編語言言程序設設計的基基本方法法4.匯編語言言和C語語言交叉叉編程計算機學學院72020-02-114.2ARM匯編程序序的組成成與結(jié)構(gòu)構(gòu);文件名::TEST1.S;功能:實實現(xiàn)字符符串拷貝貝功能;說明:使使用ARMulate軟件仿真真調(diào)試AREA Example1,CODE,,READONLY;;聲明代碼碼段Example1numEQU20;;設置拷貝貝字的個個數(shù)ENTRY;;標識程序序入口CODE32;;聲明32位ARM指令STARTLDRR0,,=src;;R0指向源數(shù)數(shù)據(jù)塊LDRR1,,=dst;;R1指向目的的數(shù)據(jù)塊塊MOVR2,,#num;;R2需要拷貝貝的數(shù)據(jù)據(jù)個數(shù)wordcopyLDRR3,[[R0],##4;從源源數(shù)據(jù)塊塊中取一一個字,,放入R3中,,;R0=R0+4STRR3,[[R1],##4;將R3中的的數(shù)據(jù)存存入R1指向的的存儲;單元中,,R1==R1++4SUBSR2,R2,,#1;R2計數(shù)器器減1BNEwordcopy;如果果R2不不為0,,則轉(zhuǎn)向向wordcopy處處使用“;;”進行行注釋標號頂格格寫程序代碼碼段計算機學學院82020-02-11stopMOVR0,,#0x18 ;程序運行行結(jié)束返返回編譯譯器調(diào)試試環(huán)境LDRR1,,=0x20026SWI0x123456
AREABlockData,,DATA,,READWRITE;數(shù)據(jù)段的的名字BlockDataSrcDCD 1,,2,3,4,,5,6,7,,8,1,2,,3,4,5,,6,7,8,,1,2,3,,4DstDCD 0,,0,0,0,,0,0,0,,0,0,0,,0,0,0,,0,0,0,,0,0,0,,0AREA|..extra||,NOINIT,,READWRITE;未初始數(shù)數(shù)據(jù)段的的名字.extradata SPACE 1024END;;文件結(jié)束束聲明文件件結(jié)束計算機學學院92020-02-114.2..1匯編語言言程序格格式匯編語言言形式匯編語言言源程序序的組成成匯編語言言程序中中常用的的符號匯編語言言程序中中的表達達式和運運算符計算機學學院102020-02-11匯編語言言形式計算機學學院112020-02-11匯編語言言程序中中常用的的符號在匯編語語言程序序設計中中,經(jīng)常常使用各種種符號表表示變量量、常量量和地址址組成:符號由大大小寫字字母、數(shù)數(shù)字以及及下劃線線組成。。大小寫:符號區(qū)分分大小寫寫,同名名的大、、小寫符符號會被被編譯器器認為是是兩個不不同的符符號。唯一性::符號在其其作用范范圍內(nèi)必必須唯一一,即在在其作用用范圍內(nèi)內(nèi)不可有有同名的的符號。。自定義的的符號名名不能與與系統(tǒng)的的保留字字相同。不能同名名:符號名不不應與指指令或偽偽指令同同名。計算機學學院122020-02-111.程序中中的變量量變量的類類型:數(shù)值變量量邏輯變量量字符串變變量作用范圍圍:全局變量量局部變量量計算機學學院132020-02-112.程序中中的常量量ARM(Thumb)匯編程程序所支支持的常常量有數(shù)數(shù)值常量量、邏輯輯常量和和字符串串常量。。數(shù)值常量量一般為32位的整數(shù)數(shù),當作作為無符符號數(shù)時時,其取取值范圍圍為0~232-1;當作為有有符號數(shù)數(shù)時,其其取值范范圍為-231~231-1。在ARM匯編語言言中,使用EQU來定義數(shù)數(shù)值常量量。數(shù)值常常量一經(jīng)經(jīng)定義,,其數(shù)值值就不能能再修改改。計算機學學院142020-02-11數(shù)值常量量有下列列表示方方式:十進制數(shù)數(shù):可以直接接表達如如:1、2、345。十六進制制數(shù):有兩種表表達方法法,使用用前綴0x,如0x003、0x001C,或使用用前綴&,如&10F、&134。這兩種種方法都都是等效效的。n進制數(shù)::形如n_XXX,其中n的范圍是是2到9,XXX是具體數(shù)數(shù)值。如如:8_247表示一個個八進制制數(shù)。ASCII的表示::有些值可可以使用用ASCII表達,例如:‘‘A’表達A的ASCII碼。指令:MOVR1,,#’B’等同于MOVR1,,#0x42。計算機學學院152020-02-11邏輯常量量只有兩種種取值情情況:{TRUE}和{FALSE},注意帶大大括號。。字符串常常量為一一個固定定的字符符串,一一般用于于程序運運行時的的信息提提示。字符常量量由單引引號表示示,包括括C語言中的的轉(zhuǎn)義字字符,如如’\n’。字符串常常量用雙雙引號表表示,也也包括C語言中的的轉(zhuǎn)義字字符如““abcd\0xc\r”。計算機學學院162020-02-11匯編語言言程序中中的表達達式和運運算符數(shù)值表達達式邏輯表達達式字符串表表達式表達式中中各元素素運算次次序的優(yōu)先級如下:括號運算算符的優(yōu)優(yōu)先級最最高。相鄰的單單目運算算符的運運算順序序為從右右到左,,單目運運算符的的優(yōu)先級級高于其其它運算算符。優(yōu)先級相相同的雙雙目運算算符的運運算順序序為從左左到右。。計算機學學院172020-02-11匯編語言言的語句句格式:[Label]]Operation[[Operand]][[;Comment]標號域操操作助記記符域操操作數(shù)數(shù)域注注釋釋域例:startMOVR0,#0x3F;;將立即數(shù)數(shù)傳送到到寄存器器R0計算機學學院182020-02-11標號域(Label)):作用:標號域用用來表示示指令的的地址、、變量、、過程名名、數(shù)據(jù)據(jù)的地址址和常量量。開頭:標號是一一個自行行設計的的標識符符或名稱稱,語句句標號可可以是大大小寫字字母混合合,通常以字字母開頭頭,由字母母、數(shù)字字、下劃劃線等組組成。要求:語句標號號不能與與寄存器器名、指指令助記記符、偽偽指令(操作)助記符、、變量名名同名。。位置:語句標號號必須在在一行的的開頭書書寫,不不能留空空格。計算機學學院192020-02-11操作助記記符域(Operation):操作助記記符域可可以為指指令、偽偽操作、、宏指令令或偽指指令的助助記符。。大小寫要要求:ARM匯編器對對大小寫寫敏感,,在匯編編語言程程序設計計中,每每一條指指令的助助記符可可以全部部用大寫寫、或全全部用小小寫,但但不允許在在一條指指令中大大、小寫寫混用。。位置:所有的指指令都不不能在行行的開頭頭書寫,,必須在指指令的前前面有空空格,然然后再書書寫指令令。格式:指令助記記符和后后面的操操作數(shù)或或操作寄寄存器之之間必須須有空格格,不可可以在這這之間使使用逗號號。計算機學學院202020-02-11操作數(shù)域域(Operand):操作數(shù)域域表示操操作的對對象,操操作數(shù)可可以是常常量、變變量、標標號、寄寄存器名名或表達達式,不不同對象象之間必必須用逗逗號“,”分開。。計算機學學院212020-02-11課堂練習習:判斷指令令格式正正誤AREAEX3,CODE,READONLYGBLADATADATASETA0x20ADDR0,R1,R2ADDR0,R1,r2addR0,R1,r2AddR0,R1,r2;前面必須須有空格格;前面必須須有空格格;DATA變量名前面不能能留空格格;全部大寫寫,正確確;寄存器小小寫,正正確;指令助記記符小寫寫,寄存存器大寫寫或小寫寫,正確確;指令助記記符大小小寫混合合,不正正確計算機學學院222020-02-114.2..2ARM匯編器的的偽操作作在匯編語語言程序序里,有有一些特特殊指令令助記符符,這些些助記符符與指令令系統(tǒng)的的助記符符不同,,其沒有有相對應應的操作作碼,通通常稱這這些特助助指令助助記符為為偽操作作。偽操操作僅在在匯編過過程中起起各種準準備工作作的作用。ARM匯編中偽偽操作有:符號定義義偽操作作數(shù)據(jù)定義義偽操作作匯編控制制偽操作作信息報告告?zhèn)尾僮髯髌渌S糜玫膫尾俨僮饔嬎銠C學學院232020-02-11符號定義義偽操作作符號定義義偽操作作用于定定義ARM匯編程序序中的變變量、對對變量賦賦值以及及定義寄寄存器的的別名等等操作。。常見的符符號定義義偽操作作有如下下幾種::(1)GBLA、GBLL、GBLS(2)LCLA、LCLL,LCLS(3)SETA、SETL、SETS(4)RLIST計算機學學院242020-02-11各符號定定義偽操操作功能能說明::GBLA:定義一個個全局的的數(shù)值變變量,并并初始化化為0GBLL:定義一個個全局的的邏輯變變量,并并初始化化為FGBLS:定義一個個全局字字符串變變量,并并初始化化為空LCLA:定義一個個局部的的數(shù)值變變量,并并初始化化為0LCLL:定義一個個局部的的邏輯變變量,并并初始化化為FLCLS:定義一個個局部字字符串變變量,并并初始化化為空SETA:給一個數(shù)數(shù)值變量量賦值;;SETL:給一個邏邏輯變量量賦值;;SETS:給一個字字符串變變量賦值值;計算機學學院252020-02-11使用示例例:GBLAA1;定義一一個全局局的數(shù)值值變量,,變量名名為A1A1SETA0x0F;將該變變量賦值值為0x0FGBLLA2;定義一一個全局局的邏輯輯變量,,變量名名為A2A2SETL{{TRUE}};將該變變量賦值值為真GBLSA3;定義一一個全局局字符串串變量,,變量名名為A3A3SETS““Testing”;將該變變量賦值值為“Testing”LCLAT4;聲明一一個局部部的數(shù)值值變量,,變量名名為T4T4SETA0xaa;將該變變量賦值值為0xaa計算機學學院262020-02-11數(shù)據(jù)定義義偽操作作DCB:分配一一片連續(xù)續(xù)的字節(jié)存儲單元元并初始始化DCW(DCWU):分配配一片連連續(xù)的半字存儲單元元并初始始化DCD(DCDU):分配配一片連連續(xù)的字存儲單元元并初始始化DCDO:分配一一片按字對齊的字字內(nèi)存單單元并初初始化DCI:分配一一片字或半字字對齊內(nèi)存存單元并并初始化化DCQ(DCQU):分配配一片以以8字節(jié)為單位的的連續(xù)存存儲單元元并初始始化DCFS(DCFSU):為單精度浮浮點數(shù)分配一片片連續(xù)字字存儲單單元并初初始化DCFD(DCFDU):為雙精度浮浮點數(shù)分配一片片連續(xù)字字存儲單單元并初初始化SPACE:分配一片片連續(xù)的的存儲單單元FIELD:定義一一個結(jié)構(gòu)構(gòu)化的內(nèi)內(nèi)存表的的數(shù)據(jù)區(qū)區(qū)MAP:定義一一個結(jié)構(gòu)構(gòu)化的內(nèi)內(nèi)存表首首地址LTORG:定義一個個數(shù)據(jù)緩緩沖區(qū)池池(literallypool))的開始計算機學學院272020-02-11使用示例例:StrDCB““Thisisatest!”;分配一一片連續(xù)續(xù)的字節(jié)節(jié)存儲單單元并初初始化。。DataTestDCW1,2,3;分配一一片連續(xù)續(xù)的半字字存儲單單元并初初始化。。DataTestDCD4,5,6;分配一一片連續(xù)續(xù)的字存存儲單元元并初始始化。計算機學學院282020-02-11課堂練習習:假設Str的地址為為:8008,有如下下偽操作作,試畫畫出內(nèi)存存中數(shù)據(jù)據(jù)的分布布示意圖圖。計算機學學院292020-02-11計算機學學院302020-02-11內(nèi)存中的的數(shù)據(jù)分分布圖計算機學學院312020-02-114.2..3ARM匯編程序序中的數(shù)數(shù)據(jù)定義義數(shù)據(jù)定義義的目的的是為目目標系統(tǒng)統(tǒng)數(shù)學模模型的各各種抽象象數(shù)據(jù)類類型分配配存儲單單元,同同時進行行初始化化。DCB、DCW和DCD匯編器偽偽指令stringDCB““HelloWorld!”;分分配一片片連續(xù)的的字節(jié)存存儲單元元并初始化化halfwordDCW1,2,3;分配一一片連續(xù)續(xù)的半字字存儲單單元并初初始化WordDCD1,2,3;分配一一片連續(xù)續(xù)的字存存儲單元元并初始始化SPACE匯編器偽偽指令DataSPACE1024;分配一一片連續(xù)續(xù)的存儲儲區(qū)域并并初始化化為0計算機學學院322020-02-11LTORG匯編器偽偽指令LTORG用于聲明明一個文文字池((literalpool),用于于存放常常量。ARM匯編語言言提供了了LDR加載指令令附加文文字池的的方法,,文字池池中可以以存放任任意的32比特數(shù),,LDR加載指令令相對尋尋址文字字池,以以實現(xiàn)對對任意立立即數(shù)的的訪問。。匯編過程程中,匯匯編器會會默認地地在每一一個段的的末尾尾填加一一個文字字池。需需要注意意的是,,文字池池不能遠遠離文字字池使用用者(LDR指令),,因為LDR指令的尋尋址范圍圍是指令令位置的的前后4KB。如果用用戶程序序比較大大,則可可能使程程序段的的末尾超超出4KB范圍,此此時需要要在程序序中的適適當位置置,使用用LTORG偽指令顯顯式聲明明文字池池。一般總可可以在LDR偽指令前前后4KB的范圍內(nèi)內(nèi)找到分分支指令令,文字字池可聲聲明在分分支(B)指令之之后的緊緊鄰位置置,不會會影響代代碼的正正常執(zhí)行行,因為為B指令總是是會將程程序的執(zhí)執(zhí)行轉(zhuǎn)移移到其它它地方的的。計算機學學院332020-02-111.缺省文字字池AREAdefault,,CODE,,READONLYENTRYCODE32startLDRR1,, =0xABCDEFLDRR2,, =0x101ADDR3,, R1,R2Bstart;匯編器器默認的的文字池池位置,,常數(shù)0xABCDEF、0x101即存放于于此ENDstart[[0xe59f1008]] ldrr1,0x00008010 ;==##0x00abcdef00008004[[0xe59f2008]ldr r2,0x00008014;;==#0x0000010100008008[[0xe0813002]add r3,r1,r20000800c[[0xeafffffe]b0x800c;;((start++0xc))00008010[[0x00abcdef]dcd 0x00abcdef......00008014[[0x00000101]dcd 0x00000101......計算機學學院342020-02-112.自定義文文字池匯編器在在每一個個程序段段的末尾尾附加缺缺省文字字池,如如果程序序段較長長,這個個缺省的的文字池池和LDR指令的距距離有可可能超出出了4KB,那么LDR指令也不不能正確確加載數(shù)數(shù)據(jù)。計算機學學院352020-02-11AREAdefault,,CODE,,READONLYENTRYCODE32startLDRR1,, =0xABCDEFLDRR2,, =0x101ADDR3,,R1,R2Bbranch…;其它匯編編代碼branch…;其它匯編編代碼otherSPACE4096END計算機學學院362020-02-11AREAdefault,,CODE,,READONLYENTRYCODE32startLDRR1,==0xABCDEFLDRR2,==0x101ADDR3,,R1,R2BbranchLTORG…;其它匯編編代碼branch…;其它匯編編代碼otherSPACE4096ENDstart[[0xe59f1008]] ldrr1,0x00008010;;=##0x00abcdef00008004[[0xe59f2008]ldr r2,0x00008014 ;==##0x0000010100008008[[0xe0813002]add r3,r1,r20000800c[[0xea000001]bbranch00008010[[0x00abcdef]dcd 0x00abcdef......00008014[[0x00000101]dcd 0x00000101......branch[[0xe1a01001]movr1,,r10000801c[[0xeafffff7]bstartother[[0x00000000]] dcd0x00000000......00008024[[0x00000000]dcd 0x00000000......00008028[[0x00000000]dcd 0x00000000......其它常用用的偽操操作AREAALIGNCODE16、CODE32ENTRYENDEQUEXPORT(或GLOBAL)IMPORTEXTERNGET(或INCLUDE)INCBINRNROUT計算機學學院372020-02-11計算機學學院382020-02-114.2..4匯編語言言程序的的上機過過程匯編語言言上機環(huán)環(huán)境計算機學學院392020-02-111編輯匯編編語言源源程序建立工程程文件計算機學學院402020-02-11編輯源文文件計算機學學院412020-02-11添加源文文件計算機學學院422020-02-112編譯連接接源程序序在編譯連連接之前前還需要要通過DebugSettings對話框?qū)椖康牡倪\行環(huán)環(huán)境進行行一些設設置。這這里采用用默認設設置。編譯時可可以通過過Projectcompile對源文件件進行編編譯,然然后再連連接。但但是比較較簡便的的做法是是直接單單擊工程程窗口的的Make圖標按鈕鈕。計算機學學院432020-02-11計算機學學院442020-02-113調(diào)試匯編編程序計算機學學院452020-02-11計算機學學院462020-02-11第4章匯匯編語言言程序設設計1.匯編語言言的基本本概念2.ARM匯匯編程序序的組成成與結(jié)構(gòu)構(gòu)3.匯編語言言程序設設計的基基本方法法4.匯編語言言和C語語言交叉叉編程計算機學學院472020-02-114.3..1ARM匯編語言言程序設設計程序設計計步驟簡單程序序設計分支程序序設計循環(huán)程序序設計子程序設設計計算機學學院482020-02-11程序設計計步驟::分析題目目確定算算法。合理分配配存儲空空間和寄寄存器根據(jù)算法法畫出程程序框圖圖根據(jù)框圖圖編寫程程序上機調(diào)試試程序計算機學學院492020-02-111.分析題目目與確定定算法算算法:●解解決實際際問題的的數(shù)學模模型●相同同的問題題有不同同的算法法實現(xiàn)●不同同的算法法在運行行速度,占據(jù)的空空間不同同2.合理分配配存儲空空間和寄寄存器::●合理理地為原原始數(shù)據(jù)據(jù),中間間結(jié)果及及最終結(jié)結(jié)果安排排存儲空空間●分配配原則::夠用就就好,不不浪費空空間,不不定義多多余變量量,變量名合合乎常規(guī)規(guī),增強強可讀性性。計算機學學院502020-02-113.畫出程序序的流程程圖矩形形框:菱形框::分支判判斷橢圓框::程序的的開始或或結(jié)束圓框:流流程圖之之間的連連接箭頭:處處理流程程圓圈:連連接流程程圖某個個處理計算機學學院512020-02-114.根據(jù)流程程圖編制制語句::●簡潔潔明了,,必要的的注釋●不要要出現(xiàn)絕絕對地址址●注意意中英文文字符,,半/全角,各各數(shù)制對對齊等5.匯編調(diào)試試程序::●ADS進行匯編編、連接接;●AXD進行調(diào)試試。6.判斷程序序質(zhì)量的的標準::●程序序執(zhí)行的的時間●程序序所占用用的內(nèi)存存字節(jié)數(shù)數(shù)●程序序的語句句行數(shù)計算機學學院522020-02-114.3..2結(jié)構(gòu)化程程序設計計的基本本概念迪杰斯克克拉(E.W.dijkstra)在1969年提出結(jié)結(jié)構(gòu)化程程序設計計的基本本思想采用“自自頂向下下,逐步步求精””的程序序設計方方法。“單入口口單出口口”的控控制結(jié)構(gòu)構(gòu)。“自頂向下下、逐步步求精””程序設設計方法法的主導導思想是是從問題題本身開開始,對對問題進進行分解解,將解解決問題題的方法法步驟逐逐步細化化,分解解為由基基本程序序結(jié)構(gòu)模模塊組成成的結(jié)構(gòu)構(gòu)化程序序框圖;;“單入口單單出口””的思想想認為一一個復雜雜的程序序,如果果它僅是是由順序序、分支支、循環(huán)環(huán)和子程程序四種種基本程程序結(jié)構(gòu)構(gòu)的組合合、嵌套套構(gòu)成,,那么這這個新構(gòu)構(gòu)造的程程序一定定是一個個單入口口單出口口的程序序。計算機學學院532020-02-114.3..3匯編語言言程序設設計的流流程使用計算算機通過過編程序序解決某某一問題題時,通通常按以以下步驟驟進行::分析問題題,建立立數(shù)學模模型;確定算法法;設計程序序流程圖圖;合理分配配寄存器器、存儲儲空間和和外設資資源;;編制程序序;調(diào)試程序序;形成文檔檔;研討目標標系統(tǒng)的的本質(zhì)特特性,用用數(shù)學方方法對其本質(zhì)質(zhì)特性進進行抽象象描述,,建立目目標系統(tǒng)的數(shù)數(shù)學表示示模型在已建立立的目標標系統(tǒng)數(shù)數(shù)學表示示模型上上,進一步研研討目標標系統(tǒng)的的內(nèi)在規(guī)規(guī)則,設設計相應處理理法則方方案(算算法分析析與描述述)把解題的的方法、、步驟用用框圖形形式表示示。如果問題題比較復復雜,那那么可以以逐步細細化,直到到每一框框圖可以以容易編編程為止止。流程圖不不僅便于于程序的的編制,,且對程程序邏輯正確確性也比比較容易易查找和和修改。。①合理地分分配存儲儲器資源源,將前前述的目目標系統(tǒng)‘數(shù)數(shù)據(jù)結(jié)構(gòu)構(gòu)模型’’表示到到各存儲儲器單元元。②CPU寄存器數(shù)數(shù)量有限限,在程程序中,,大多數(shù)操作都都要使用用寄存器器;并且且有的操操作使用特定的的寄存器器(如堆堆棧操作作使用SP/R13等),程程序中要要合理分分配各寄寄存器的的用途。。用計算機機語言,,對數(shù)據(jù)據(jù)結(jié)構(gòu)模模型和流程圖表表示的算算法進行行準確地地描述。。①語法調(diào)試試:排除除程序中中的語法法錯誤。。②功能能調(diào)試::保證程程序的邏邏輯功能能正確性性。用文檔形形式記錄錄說明程程序的功功能、使使用方法法、程序結(jié)構(gòu)構(gòu)、算法法流程等等每一個個階段的的工作。。計算機學學院542020-02-114.3..4順序程序序設計順序程序序是一種種最簡單單的程序序結(jié)構(gòu),,也稱為為直線程程序,它它的執(zhí)行行自始自自終按照照語句的的先后順順序進行行。這種結(jié)構(gòu)構(gòu)的流程程圖,除除了有一一個起始始框,一一個終止止框外,,就是若若干執(zhí)行行框。計算機學學院552020-02-11例:試編編制一程程序,完完成10+3的操作。。AREAARMex,CODE,READONLY;;代碼段名名ARMexENTRY;;程序的入入口CODE32startMOVR0,, #10;;將立即數(shù)數(shù)10存入寄存存器R0MOVR1,, #3;;將立即數(shù)數(shù)3存入寄存存器R1ADDR0,, R0,R1;;R0=R0++R1stopMOVR0,, #0x18;;這三條指指令是ADS調(diào)試環(huán)境境特約LDRR1,, =0x20026 ;程序運行行結(jié)束返返回編譯譯器調(diào)試試環(huán)境SWI0x123456END;;結(jié)束計算機學學院562020-02-114.4..4分支程序序設計許多實際際問題需需要根據(jù)據(jù)不同的的情況作作出不同同的處理理。在程程序中,,把不同同的處理理方法編編制成各各自的處處理程序序段,運運行時由由機器根根據(jù)不同同的條件件自動作作出判斷斷,選擇擇執(zhí)行相相應的處處理程序序段。這樣的程程序結(jié)構(gòu)構(gòu)中,計計算機不不再完全全按指令令存儲的的順序執(zhí)執(zhí)行,稱稱之為分分支。分支程序序使用子子程序調(diào)調(diào)用指令令BL、轉(zhuǎn)移指指令B或帶狀態(tài)態(tài)轉(zhuǎn)移指指令BX來實現(xiàn)。。計算機學學院572020-02-11例4?3給定以下下符號函函數(shù):任意給定定值,假假定為-25,存放在x單元,函函數(shù)值存存放在y單元;要要求根據(jù)據(jù)x中的值來來確定y的值。R3==-1R3==0AREAsymbol,,CODE,,READONLY ;代碼段的的名字symbolENTRY;;程序的入入口CODE32startLDRR0,==x;;加載數(shù)據(jù)據(jù)段中的的變量x地址,存存入R0LDRR1,==y;;加載數(shù)據(jù)據(jù)段中的的變量y地址,存存入R1LDRR2,,[[R0]] ;加載變量量x的值,存存入R2compareCMPR2,,##0;;將R2的值與0作比較BEQZERO;;如果R2等于0,那么轉(zhuǎn)轉(zhuǎn)向標號號ZERO處BGTPLUS;;如果R2大于0,那么轉(zhuǎn)轉(zhuǎn)向標號號PLUS處MOVR3,,##-1;;否則,R2小于0,將-1存入R3中B stopZEROMOVR3,,##0;;R2等于0,將0存入R3中B stopPLUSMOVR3,,##1;;R2大于0,將1存入R3中;續(xù)上段代代碼stopSTRR3,,[[R1]MOVR0,,##0x18LDRR1,,==0x20026SWI0x123456AREAData,DATA,READWRITEx DCD--25y DCD0END計算機學學院582020-02-114.4..5循環(huán)程序序設計順序程序序和分支支程序中中的指令令每次運運行最多多只執(zhí)行行一次。。在實際際應用中中重復地地做某些些事的情情況是很很多的,,這也是是計算機機最擅長長的工作作方式。。重復地地執(zhí)行某某些指令令,最好好用循環(huán)環(huán)程序來來實現(xiàn)。。循環(huán)程序序的結(jié)構(gòu)構(gòu)初始化循環(huán)體修改判斷判斷結(jié)束循環(huán)程序序的主要要部分,視具具體情況況而定:可以以是一個個順序程序、、分支程程序或另一個個循環(huán)程程序。計數(shù)控制制循環(huán):通過計數(shù)循環(huán)環(huán)次數(shù),,判斷是否已達達到預定定次數(shù),控制制循環(huán)。。條件控制制循環(huán):通過判斷循環(huán)環(huán)終止條條件是否已成立立,控制制循環(huán)。。建立循環(huán)環(huán)初始值值。如設置地地址指針針、計數(shù)器、、其他循循環(huán)參數(shù)的起起始值等等。判斷循環(huán)環(huán)結(jié)束條條件是否成立立,決定定是否繼續(xù)循循環(huán)。為執(zhí)行下下一個循循環(huán)而修改某某些參數(shù)數(shù),尤其是循循環(huán)控制制變量的的修改等等。對循環(huán)結(jié)結(jié)束進行行適當處理;;有的循循環(huán)程序可以以沒有這這部分。。計算機學學院592020-02-11用計數(shù)控控制循環(huán)環(huán)適用于已已知循環(huán)環(huán)次數(shù)的的循環(huán)程程序設計計例4?4從x單元開始始的30個連續(xù)字字單元中中存放有30個無符號號數(shù),從從中找出出最大者者送入y單元中。。分析:根據(jù)題意意,把第第一個數(shù)數(shù)先送入入Rx寄存器,,將Rx中的數(shù)與與后面的29個數(shù)逐個個進行比比較,如如果Rx中的數(shù)較較小,則則將該較較大的數(shù)送送入Rx;繼續(xù)與與余下的的數(shù)據(jù)逐逐個比較較。在比比較過程程中,Rx中始終保保持較大大的數(shù),,共計比比較29次,則最最終Rx中保留了了最大數(shù)數(shù),最后后把Rx中的數(shù)((最大者者)送入入y單元。AREAmax,,CODE,,READONLY;;代碼段的的名字maxENTRY;;程序的入入口CODE32numEQU 29;;比較的次次數(shù)startLDRR0,,==x;;R0指向源數(shù)數(shù)據(jù)塊xLDRR1,,==y;;R1指向單元元yLDRR2,,==num;;R2作為計數(shù)數(shù)器LDRR3,,[[R0]];;將源數(shù)據(jù)據(jù)塊x中第一個個數(shù)加載載到R3中compareADDR0,,R0,##4;;每進行一一次比較較,將R0指針地址址加4LDRR4,,[R0];;依次將源源數(shù)據(jù)塊塊x中下一個個數(shù)加載載到R4中CMPR3,,R4;;比較R3和R4中數(shù)的大大小MOVCCR3,,R4;;如果R3小于R4,則將較較大的數(shù)數(shù)送入R3中SUBS R2,R2,,##1;;計數(shù)器值值減1BNEcompare;;如果不為為0,那么繼繼續(xù)跳到到compare執(zhí)行STREQR3,[[R1];;如果為0,那么循循環(huán)比較較結(jié)束,,R3是最大的的數(shù);并且將R3中的數(shù)加加載到R1指向的單單元(即即y)中stopMOVr0,,#0x18LDRr1,,=0x20026SWI0x123456AREAData,DATA,READWRITEx DCD73,59,61,34,81,107,,225,231,54,43DCD100,35,1,,42,,222,254,34,71,100,,31DCD33,,119,13,44,18,147,55,244,,97,,3y DCD0END計算機學學院602020-02-11②適用于無無法確定定循環(huán)次次數(shù),但但知道循循環(huán)結(jié)束束的條件件的循環(huán)環(huán)程序設設計例4?5從自然數(shù)數(shù)1開始累加加,直到到累加和和大于1000為止,統(tǒng)計計被累加加的自然然數(shù)的個個數(shù),并并把統(tǒng)計計的個數(shù)數(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)環(huán)個數(shù)的的統(tǒng)計/每次取得得的自然然數(shù)LDRR5,==1000;;R5用于循環(huán)環(huán)結(jié)束的的界限值值continueADDR4,,R4,,##1;;取下一個個自然數(shù)數(shù)ADDR3,,R3,,R4;;累加自然然數(shù)CMPR3,,R5;;比較累加加和是否否超過了了1000BCCcontinue;;如果小于于1000,那么跳跳到compare執(zhí)行STRCSR3,[[R1];;如果大于于1000,那么將將累加和和存儲到到R1所指向的的單元中中STRCSR4,[[R0];;如果大于于1000,那么將將已累加加的自然然數(shù)個數(shù)數(shù)值存儲儲;到R0所指向的的單元中中stopMOVr0,,#0x18LDRr1,==0x20026SWI0x123456AREAData,DATA,READWRITEn DCD0;;定義累加加的自然然數(shù)的個個數(shù)sumDCD 0;;定義自然然數(shù)的累累加和END計算機學學院612020-02-11例:編制制程序使使S=1+2×3+3×4+4×5+…+N(N+1),直到N等于10為止。分析過程程算法功能能:相鄰數(shù)相相乘:MUL累加:ADD循環(huán)次數(shù)數(shù):10CMPB指令初始值S=1NN+1部分和N(N++1)寄存器分分配R0:S1R0+R3得S值R1:N的初始值值2循環(huán)變量量R2:N+1由R1=1求得R3:N(N+1))流程圖計算機學學院622020-02-11源程序:AREAEX4_45,CODE,READONLYENTRYCODE32STARTMOVR0,##1;;R0用作累加加,置初值1,SMOVR1,,#2;;R1用作第一一個乘數(shù)數(shù),初值為2,NREPEATADDR2,R1,,#1;R2用作第二二個乘數(shù)數(shù),N+1MULR3,,R2,R1;;實現(xiàn)N*((N+1)部分積存存于R3ADDR0,,R0,R3;;將部分乘積累加至至R0ADDR1,,R1,##1;;修改N的值得到到下一輪輪乘數(shù)CMPR1,,#10;;循環(huán)次數(shù)數(shù)比較BLEREPEAT;;未完成則則重復END計算機學學院632020-02-11多重循環(huán)環(huán)程序設設計多重循環(huán)環(huán)即循環(huán)環(huán)體內(nèi)套套有循環(huán)環(huán)。設計多重重循環(huán)程程序時,,可以從從外層循循環(huán)到內(nèi)內(nèi)層循環(huán)環(huán)一層一一層地進進行。通通常在設設計外層層循環(huán)時時,僅把把內(nèi)層循循環(huán)看成成一個處處理粗框框,然后后再將該該粗框細細化,分分成置初初值、工工作、修修改和控控制四個個組成部部分。內(nèi)內(nèi)層循環(huán)環(huán)設計完完之后,,用其替替換外層層循環(huán)體體中被視視為一個個處理粗粗框的對對應部分分,以構(gòu)成一個個多重循循環(huán)。計算機學學院642020-02-11多重循環(huán)環(huán)程序設設計多重循環(huán)環(huán)又稱循循環(huán)嵌套套,即循環(huán)套套循環(huán)。。有些問問題比較較復雜,單重循環(huán)環(huán)難以解解決,必須使用用多重循循環(huán)。在在使用多多重循環(huán)環(huán)時,必須注意意以下幾幾點:⑴關(guān)系::內(nèi)循環(huán)必必須完整整地包含含在外循循環(huán)內(nèi),內(nèi)外循環(huán)環(huán)不能相相互交叉。。⑵跳轉(zhuǎn)::內(nèi)循環(huán)既既可以嵌嵌套在外外循環(huán)中中,也可以幾幾個內(nèi)循循環(huán)并列存在。。可以從從內(nèi)循環(huán)環(huán)中直接接跳到外外循環(huán),,但不能能從外循環(huán)環(huán)直接跳跳進內(nèi)循循環(huán)中。。⑶注意::防止出現(xiàn)現(xiàn)“死循循環(huán)”。。無論是是外循環(huán)環(huán),還是內(nèi)循循環(huán),千萬不要要使循環(huán)環(huán)返回到到初始部部分。⑷參數(shù)設設置:每次通過過外循環(huán)環(huán)再次進進入內(nèi)循循環(huán)時,,初始條條件必須重新新設置。。計算機學學院652020-02-11[例]利用逐次求大大數(shù)的方方法對內(nèi)內(nèi)存單元元ARRAY開始的以字節(jié)為單位的無無符號數(shù)數(shù)進行從從大到小小排序。。根據(jù)題意意,排序序方法為為:4938651297135527788549496565979738384949656578788585786555493827131212ARRAYR6BXSISISISISISISISISIBXSISISISISISISISI計算機學學院662020-02-11綜合舉例例:在以BUF為首址的的字存儲儲區(qū)中存存放有10個無符號號數(shù)0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70,0x60,現(xiàn)需將將它們按按從小到到大的順順序排列列在BUF存儲區(qū)中中,試編編寫其程程序。1、分析2、流程3、編程4、調(diào)測計算機學學院672020-02-11R1R2流程圖分析:采用逐一一比較法法:將第一個個存儲單單元中的的數(shù)與其其后n-1個存儲單單元中的的數(shù)逐一一比較,,每次比比較之后后,總是是把小者者放在第第一個存存儲單元元之中,,經(jīng)過n-1次比較之后后,n個數(shù)中最小小者存入入第一存存儲單元元中;接著從第第二個存存儲單元元開始,,同理,,經(jīng)過n-2次比較之之后,得得到n-1個數(shù)中最最小者存存入第二二存儲單單元中;;如此類類推,當當最后兩兩個存儲儲單元的的數(shù)比較較完成之之后,從從小到大大的排列列順序就就實現(xiàn)了了。““冒泡排排序”算算法。計算機學學院682020-02-11各寄存器器分配功功能如下下:R0:用來指指示緩沖沖區(qū)初始始地址R1:外循環(huán)環(huán)計數(shù)器器R2:內(nèi)循環(huán)環(huán)計數(shù)器器R3:外循環(huán)環(huán)地址指指針R4:內(nèi)循環(huán)環(huán)地指針針R5:內(nèi)循環(huán)環(huán)下一個個數(shù)地址址指針R6:存放內(nèi)內(nèi)循環(huán)一一輪比較較的最小小值R7:存放內(nèi)內(nèi)循環(huán)取取出的下下一個比比較值計算機學學院692020-02-11源程序如如下:NEQU10AREAEX4__47,,CODE,,READONLYENTRYCODE32STARTLDRR0,==BUF;;指向數(shù)組組的首地地址MOVR1,##0;;外循環(huán)計計數(shù)器MOVR2,##0;;內(nèi)循環(huán)計計數(shù)器LOOPIADDR3,R0,,R1,LSL##2;;外循環(huán)首首地址存存R3MOVR4,R3;;內(nèi)循環(huán)首首地址存存R4ADDR2,R1,##1;;內(nèi)循環(huán)計計數(shù)器初初值MOVR5,R4;;內(nèi)循環(huán)下下一地址址初值LDRR6,[[R4];;取內(nèi)循環(huán)環(huán)下一地地址值R4計算機學學院702020-02-11LOOPJADDR5,,R5,##4;;內(nèi)循環(huán)下下一地址址值LDRR7,[[R5];;取出下一一地址值值至R7CMPR6,R7;;比較BLTNEXT;;小則取下下一個SWPR7,R6,[[R5];;大則交換換,最小小值R6MOVR6,R7NEXTADDR2,,R2,##1;;內(nèi)循環(huán)計計數(shù)CMPR2,##N;;循環(huán)中止止條件BLTLOOPJ;;小于N則繼續(xù)內(nèi)內(nèi)循環(huán)SWPR7,,R6,[[R3]];;否則,內(nèi)內(nèi)循環(huán)一一輪結(jié)束束,將最;小數(shù)存入入外循環(huán)環(huán)的首地地址處ADDR1,R1,,#1;;外循環(huán)計計數(shù)計算機學學院712020-02-11CMPR1,##N-1;;外循環(huán)中中止條件件BLTLOOPI;;小于N-1則繼續(xù)執(zhí)執(zhí)行外循循環(huán)BSTARTAREABlockData,DATA,READWRITEBUFDCD0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70END采用冒泡泡排序方方法,程序運行行的結(jié)果果如下::00H,,10H,20H,30H,,40H,50H,70H,,80H,90H,FFH計算機學學院722020-02-11程序模塊塊化結(jié)構(gòu)構(gòu)STARTLOOPILOOPJBLTNEXTNEXTBLTLOOPJBLTLOOPIBSTART計算機學學院732020-02-11計算機學學院742020-02-114.4..6子程序設設計子程序概概念如果在一一個程序序中的多多處用到到同一段段程序代代碼,那那么可以以把這段段共同的的程序代代碼抽取取出來,,寫成一一個相對對獨立的的程序段段,每當當需要執(zhí)執(zhí)行這段段代碼時時,就調(diào)調(diào)用這個個程序段段,執(zhí)行行完這個個程序段段后,再再返回原原來調(diào)用用它的程程序。這這樣編寫寫程序時時,就不不必重復復寫這段段代碼了了,而這這樣的程程序段稱稱為子程程序或子子過程。。子程序的的調(diào)用與與返回主程序中中使用BL指令實現(xiàn)現(xiàn)子程序序的調(diào)用用BL子程序名名在子程序序結(jié)束處處,使用用如下指指令返回回到主程程序中。。MOVPC,,LR主程序與與子程序序之間的的參數(shù)傳傳遞主程序調(diào)調(diào)用子程程序時,,可以向向子程序序傳遞一一些參數(shù)數(shù);同樣樣,子程程序運行行后也可可把一些些結(jié)果參參數(shù)傳回回給主程程序。主主程序與與子程序序之間的的這種信信息傳遞遞稱為參參數(shù)傳遞遞。三種參數(shù)數(shù)傳遞方方式①寄存器傳傳遞參數(shù)數(shù)方式②存儲儲區(qū)域傳傳遞參數(shù)數(shù)方式③堆棧傳遞遞參數(shù)方方式計算機學學院752020-02-11寄存器傳傳遞參數(shù)數(shù)方式技術(shù)思想想:主程程序?qū)⒋齻鬟f的的數(shù)據(jù)直直接寫入入約定的的通用寄寄存器,,再進行行BL子程序調(diào)調(diào)用;或或子程序序返回后后,主程程序直接接從約定定的通用用寄存器器中獲得得子程序序的結(jié)果果數(shù)據(jù)。。應用特點點:這種種方式適適合于傳傳遞較少少參數(shù)的的應用場場合。例:用子子程序?qū)崒崿F(xiàn)內(nèi)存存區(qū)里的的字符串串拷貝功功能,即即將存儲儲單元中源字字符串對對應拷貝貝到目的的字符串串中。解題思路路:通過設定定兩個地地址指針針,分別別指向存存儲區(qū)中中的源字字符串和和目的字字符串;;然后通通過加載載和存儲儲指令((LDR和STR)的寄存器間間接尋址址方式,,依次從從源字符符串讀取取一個字字符數(shù)據(jù)據(jù),寫入到目目的字符符串的對對應字符符位置中中,直到到遇到源源字符串串的結(jié)束標標志’0’為止。AREAStrCopy,,CODE,,READONLYENTRYCODE32startLDRR1,,==srcstr;;R1指向數(shù)據(jù)據(jù)區(qū)的源源字符串串LDRR0,,==dststr;;R0指向數(shù)據(jù)據(jù)區(qū)的目目的字符符串BLstrcopy;;調(diào)用子程程序strcopy,完成字字符串拷拷貝stopMOVR0,##0x18;;程序結(jié)束束返回編編譯器調(diào)調(diào)試環(huán)境境LDRR1,==0x20026SWI0x123456strcopyLDRBR2,[[r1],,##1;;將R1指向的單單元內(nèi)容容加載到到R2中STRBR2,,[[r0]],##1;;將R2中的數(shù)存存儲到R0指向的單單元中CMPR2,,##0;;檢查R0的值是否否等于0BNEstrcopy;;如果不等等于0,那么轉(zhuǎn)轉(zhuǎn)到strcopy處執(zhí)行MOVPC,,LR;;子程序返返回AREAStrings,,DATA,,READWRITEsrcstrDCB""Firststring-source",0;;源字符串串dststrDCB""Secondstring--destination",0 ;目的字符符串END計算機學學院762020-02-11存儲區(qū)域域傳遞參參數(shù)方式式技術(shù)思想想:主程序和和子程序序約定了了某一共共享內(nèi)存存塊用于于參數(shù)傳傳遞,主主程序在在BL調(diào)用子程程序前,,先將要要傳遞的的參數(shù)寫寫入到約約定的存存儲單元元,子程程序可從從約定的的內(nèi)存讀讀取這些些參數(shù);;子程序序返回時時,也可可以使用用該方式式將數(shù)據(jù)據(jù)傳給主主程序。。應用特點點:這種方式式可以傳傳遞大批批量數(shù)據(jù)據(jù)。實現(xiàn)方法法:當主程序序與子程程序有較較多的數(shù)數(shù)據(jù)需要要傳遞時時,可以以通過共共享內(nèi)存存區(qū)或傳傳內(nèi)存數(shù)數(shù)據(jù)塊地地址方式式來傳遞遞批量數(shù)數(shù)據(jù)。①通過偽指指令ADR直接裝載載近距離離數(shù)據(jù)塊塊地址;;②通過過偽指令令ADRL直接裝載載較近距距離數(shù)據(jù)據(jù)塊地址址;③通過過語句LDRRd,,=Label轉(zhuǎn)載遠距距離的數(shù)數(shù)據(jù)塊地地址;例:通過設置置的入口口參數(shù)查查找函數(shù)數(shù)地址表表,實現(xiàn)現(xiàn)選擇不不同函數(shù)的功能能。說明:本題中通通過事先先將函數(shù)數(shù)地址存存放在存存儲單元元中,通通過查找找地址表表的方法法,實現(xiàn)現(xiàn)根據(jù)““選擇項項(choice)”進入入不同函函數(shù)體的的功能。。AREAJump,,CODE,,READONLYnumEQU4;;函數(shù)地址址表內(nèi)容容的個數(shù)數(shù)ENTRYCODE32startLDRR0,==choice;;R0指向存儲儲區(qū)的choice單元LDRR0,[[R0]];;設置第一一個參數(shù)數(shù):選擇擇執(zhí)行哪哪一個函函數(shù)MOVR1,##16;;設置第1個操作數(shù)數(shù)MOVR2,##2;;設置第2個操作數(shù)數(shù)BLarithfunc;;調(diào)用子程程序arithfuncstopMOVR0,##0x18;;程序結(jié)束束返回編編譯器調(diào)調(diào)試環(huán)境境LDRR1,,==0x20026SWI0x123456arithfuncCMPR0,##num;;比較R0的值是否否超過函函數(shù)地址址表的個個數(shù)MOVHSpc,lr;;如果大于于,那么么就返回回到標號號stop處ADRR3,JumpTable ;將函數(shù)地地址表的的地址作作為基地地址LDRpc,,[[R3,R0,LSL#2];;根據(jù)R0參數(shù)進入入對應的的子程序序JumpTable;;函數(shù)地址址表的入入口基地地址DCDDoAdd;;加法子程程序DCDDoSub;;減法子程程序DCDDoMul;;乘法子程程序DCDDoDiv;;除法子程程序DoAddADDR0,R1,R2;;R0=R1++R2MOVPC,LR;;返回DoSubSUBR0,, R1,R2;;R0=R1--R2MOVPC,LR;;返回DoMulMOVR0,R1,LSLR2;;R0==R1<<<R2MOVPC,LR;;返回DoDivMOVR0,R1,LSRR2;;R0=R1>>>R2MOVPC,LR;;返回AREANUM,,DATA,,READWRITEchoiceDCD 3;;0:表示選選擇加法法子程序序1:表示選選擇減法法子程序序;2:表示選選擇乘法法子程序序3:表示選選擇除法法子程序序END計算機學學院772020-02-11③堆棧傳遞遞參數(shù)方方式主程序和和子程序序使用同同一個堆堆棧,主主程序在在BL調(diào)用子程程序前,,先將要要傳遞的的參數(shù)壓壓入到堆堆棧中,,子程序序可從堆堆棧中讀讀取傳過過來的數(shù)數(shù)據(jù);子子程序返返回需要要向主程程序傳遞遞參數(shù)時時,也可可使用此此方法。。計算機學學院782020-02-11第4章匯匯編語言言程序設設計1.匯編語言言的基本本概念2.ARM匯匯編程序序的組成成與結(jié)構(gòu)構(gòu)3.匯編語言言程序設設計的基基本方法法4.匯編語言言和C語語言交叉叉編程計算機學學院792020-02-111.匯編程序序與C程序間變變量互訪訪匯編程序序訪問C程序中的的變量具體操作作步驟::在C程序中,,將供匯匯編程序序訪問的的變量用用關(guān)鍵字字extern聲明為全全局變量量;匯編程序序中,用用偽指令令IMPORT引入C程序中的的全局變變量;使用偽指指令LDR讀取這個個全局變變量的地地址;使用指令令LDR讀取這個個全局變變量的值值;在匯編程程序中使使用這個個全局變變量;計算機學學院802020-02-11C程序訪問問匯編程程序中的的變量具體操作作步驟::在匯編語語言程序序中,用用偽指令令“global””定義全局局變量,,變量名名必須是是下劃線線“_”為首字符符的字母母數(shù)字串串;C程序中將將該變量量聲明為為外部變變量,即即可訪問問匯編程程序定義義的全局局變量。。1.匯編程序序與C程序間變變量互訪訪計算機學學院812020-02-11例:匯編編程序和和C程序間變變量互訪訪/*print.c定義全局局變量,,并作為為主程序序*/#include<<stdio..h>externintg__var=124;/*全局變量量*/externasmVisit((void);;/*匯編程序序中聲明明的全局局函數(shù)**/externint_multiple; /**聲明匯編編程序中中的全局局變量_multiple為外部變變量**/intmain()){printf(("Originalvalueofg__varis:%%d\\n"",g_var));asmVisit());/*調(diào)用匯編編程序中中的函數(shù)數(shù),訪問問全局變變量g_var**/printf(("multis%%d"",_multiple);;/*訪問匯編編程序中中全局變變量_multiple**/printf(("Modifiedvalueofg_varis:%%d"",g_var);;return0;}計算機學學院822020-02-11;visit.s文件AREAasmfile,,CODE,,READONLYEXPORTasmVisit;;聲明全局局函數(shù),,供C程序調(diào)用用IMPORTg_var;;引入在C程序中聲聲明定義義的全局局變量GLOBAL__multiple ;聲明全局局變量,,供C程序訪問問asmVisitLDRR0,, =g_varLDRR1,, [R0]LDRR2,,==_multipleLDRR2,,[[R2]]MOVR3,,R1,LSLR2;;將R1中的值擴擴大指定定的倍數(shù)數(shù)STRR3,, [R0]MOVPC,, LRAREAasmData,,DATA,,READWRITE_multipleDCD2END計算機學學院832020-02-112.匯編程序序調(diào)用C程序匯編程序序中調(diào)用用C函數(shù),只只需在匯匯編程序序中用偽偽指令IMPORT將需要調(diào)調(diào)用的C函數(shù)名引引用即可可,然后后將C函數(shù)放
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省蘇北地區(qū)達標名校2025屆初三5月聯(lián)考英語試題試卷試卷含答案
- 煙臺大學《系統(tǒng)空間設計》2023-2024學年第二學期期末試卷
- 銀川第二中學2024-2025學年高三五月中旬物理試題含解析
- 木工勞務分包合同
- 江蘇省鹽城市東臺第一教育集團2024-2025學年初三第十一模(最后一卷)英語試題含答案
- 山東工業(yè)職業(yè)學院《西醫(yī)臨床技能訓練》2023-2024學年第二學期期末試卷
- 信陽職業(yè)技術(shù)學院《現(xiàn)代農(nóng)業(yè)技術(shù)導論(種植類)》2023-2024學年第二學期期末試卷
- 新疆維吾爾巴音郭楞蒙古自治州且末縣2025屆五年級數(shù)學第二學期期末檢測模擬試題含答案
- 云南省蒙自一中2025屆高三4月模擬考試(一模)語文試題含解析
- 上海市十一校2025年高三第一次調(diào)研考試英語試題理試題含解析
- GB/T 3785.3-2018電聲學聲級計第3部分:周期試驗
- 焦化廠生產(chǎn)工序及工藝流程圖
- 特變電工-財務報表分析課件
- optimact540技術(shù)參考手冊
- 第一章電力系統(tǒng)仿真軟件介紹課件
- 產(chǎn)品QC工程圖 (質(zhì)量保證工程圖)Excel表格
- 人民醫(yī)院人才隊伍建設規(guī)劃人才隊伍建設五年規(guī)劃
- 電氣平行檢驗用表
- GB∕T 14527-2021 復合阻尼隔振器和復合阻尼器
- 患者隨訪率低原因分析以及對策
- DB32∕T 2349-2013 楊樹一元立木材積表
評論
0/150
提交評論