版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2023/6/28計(jì)算機(jī)學(xué)院1第4章
ARM7TDMI匯編語言
程序設(shè)計(jì)計(jì)算機(jī)學(xué)院22023/6/28第4章匯編語言程序設(shè)計(jì)1.匯編語言的基本概念2.ARM匯編程序的組成與結(jié)構(gòu)3.匯編語言程序設(shè)計(jì)的基本方法4.匯編語言和C語言交叉編程計(jì)算機(jī)學(xué)院32023/6/284.1匯編語言的基本概念
程序設(shè)計(jì)語言是專門為計(jì)算機(jī)編程所配置的語言。它們按照形式與功能的不同可分為三種,即機(jī)器語言、匯編語言和高級語言。1機(jī)器語言機(jī)器語言(MachineLanguage)是由0和1二進(jìn)制代碼書寫和存儲的指令與數(shù)據(jù)。它的特點(diǎn)是能被機(jī)器直接識別與執(zhí)行;程序所占內(nèi)存空間較少。其缺點(diǎn)是難認(rèn)、難記、難編、易錯。計(jì)算機(jī)學(xué)院42023/6/282匯編語言匯編語言(AssemblyLanguage)是一種面向物理層操作的計(jì)算機(jī)語言,是一種采用助記符表示的程序設(shè)計(jì)語言,使用助記符來表示指令的操作碼和操作數(shù),用標(biāo)號或符號代表地址、常量或變量。從機(jī)器角度看:匯編語言是一種面向物理層操作的計(jì)算機(jī)語言。不同的處理器類型,具有不同的匯編語言。使用匯編語言編寫程序能夠直接利用硬件系統(tǒng)的特性(如寄存器、標(biāo)志、中斷系統(tǒng)等),可直接對位、字節(jié)、字寄存器或存儲單元、I/O端口進(jìn)行處理,同時也能直接使用CPU指令系統(tǒng)提供的各種尋址方式,編制出高質(zhì)量的程序,這樣的程序不但占用內(nèi)存空間少,而且執(zhí)行速度快。計(jì)算機(jī)學(xué)院52023/6/283高級語言高級語言(HighLevelLanguage)是脫離具體機(jī)器(即獨(dú)立于機(jī)器)的通用語言,不依賴于特定計(jì)算機(jī)的結(jié)構(gòu)與指令系統(tǒng)。計(jì)算機(jī)學(xué)院62023/6/28第4章匯編語言程序設(shè)計(jì)1.匯編語言的基本概念2.ARM匯編程序的組成與結(jié)構(gòu)3.匯編語言程序設(shè)計(jì)的基本方法4.匯編語言和C語言交叉編程計(jì)算機(jī)學(xué)院72023/6/284.2ARM匯編程序的組成與結(jié)構(gòu);文件名:TEST1.S
;功能:實(shí)現(xiàn)字符串拷貝功能;說明:使用ARMulate軟件仿真調(diào)試
AREA Example1,CODE,READONLY;聲明代碼段Example1numEQU20 ;設(shè)置拷貝字的個數(shù)
ENTRY ;標(biāo)識程序入口
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計(jì)數(shù)器減1
BNE
wordcopy
;如果R2不為0,則轉(zhuǎn)向wordcopy處使用“;”進(jìn)行注釋標(biāo)號頂格寫程序代碼段計(jì)算機(jī)學(xué)院82023/6/28stop MOV R0,#0x18 ;程序運(yùn)行結(jié)束返回編譯器調(diào)試環(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 ;文件結(jié)束聲明文件結(jié)束計(jì)算機(jī)學(xué)院92023/6/284.2.1匯編語言程序格式匯編語言形式匯編語言源程序的組成匯編語言程序中常用的符號匯編語言程序中的表達(dá)式和運(yùn)算符計(jì)算機(jī)學(xué)院102023/6/28匯編語言形式計(jì)算機(jī)學(xué)院112023/6/28匯編語言程序中常用的符號在匯編語言程序設(shè)計(jì)中,經(jīng)常使用各種符號表示變量、常量和地址組成:符號由大小寫字母、數(shù)字以及下劃線組成。大小寫:符號區(qū)分大小寫,同名的大、小寫符號會被編譯器認(rèn)為是兩個不同的符號。唯一性:符號在其作用范圍內(nèi)必須唯一,即在其作用范圍內(nèi)不可有同名的符號。自定義的符號名不能與系統(tǒng)的保留字相同。不能同名:符號名不應(yīng)與指令或偽指令同名。計(jì)算機(jī)學(xué)院122023/6/281.程序中的變量變量的類型:數(shù)值變量邏輯變量字符串變量作用范圍:全局變量局部變量
計(jì)算機(jī)學(xué)院132023/6/282.程序中的常量ARM(Thumb)匯編程序所支持的常量有數(shù)值常量、邏輯常量和字符串常量。
數(shù)值常量一般為32位的整數(shù),當(dāng)作為無符號數(shù)時,其取值范圍為0~232-1;當(dāng)作為有符號數(shù)時,其取值范圍為-231~231-1。在ARM匯編語言中,使用EQU來定義數(shù)值常量。數(shù)值常量一經(jīng)定義,其數(shù)值就不能再修改。
計(jì)算機(jī)學(xué)院142023/6/28數(shù)值常量有下列表示方式:十進(jìn)制數(shù):可以直接表達(dá)如:1、2、345。十六進(jìn)制數(shù):有兩種表達(dá)方法,使用前綴0x,如0x003、0x001C,或使用前綴&,如&10F、&134。這兩種方法都是等效的。n進(jìn)制數(shù):形如n_XXX,其中n的范圍是2到9,XXX是具體數(shù)值。如:8_247表示一個八進(jìn)制數(shù)。ASCII的表示:有些值可以使用ASCII表達(dá),例如:‘A’表達(dá)A的ASCII碼。
指令:MOVR1,#’B’等同于MOVR1,#0x42。計(jì)算機(jī)學(xué)院152023/6/28邏輯常量只有兩種取值情況:{TRUE}和{FALSE},注意帶大括號。字符串常量為一個固定的字符串,一般用于程序運(yùn)行時的信息提示。字符常量由單引號表示,包括C語言中的轉(zhuǎn)義字符,如’\n’。字符串常量用雙引號表示,也包括C語言中的轉(zhuǎn)義字符如“abcd\0xc\r”。計(jì)算機(jī)學(xué)院162023/6/28匯編語言程序中的表達(dá)式和運(yùn)算符數(shù)值表達(dá)式邏輯表達(dá)式字符串表達(dá)式表達(dá)式中各元素運(yùn)算次序的優(yōu)先級如下:括號運(yùn)算符的優(yōu)先級最高。相鄰的單目運(yùn)算符的運(yùn)算順序?yàn)閺挠业阶?,單目運(yùn)算符的優(yōu)先級高于其它運(yùn)算符。優(yōu)先級相同的雙目運(yùn)算符的運(yùn)算順序?yàn)閺淖蟮接?。?jì)算機(jī)學(xué)院172023/6/28匯編語言的語句格式:[Label]Operation[Operand][;Comment]標(biāo)號域操作助記符域操作數(shù)域注釋域
例:startMOVR0,#0x3F;將立即數(shù)傳送到寄存器R0計(jì)算機(jī)學(xué)院182023/6/28標(biāo)號域(Label):作用:標(biāo)號域用來表示指令的地址、變量、過程名、數(shù)據(jù)的地址和常量。開頭:標(biāo)號是一個自行設(shè)計(jì)的標(biāo)識符或名稱,語句標(biāo)號可以是大小寫字母混合,通常以字母開頭,由字母、數(shù)字、下劃線等組成。要求:語句標(biāo)號不能與寄存器名、指令助記符、偽指令(操作)助記符、變量名同名。位置:語句標(biāo)號必須在一行的開頭書寫,不能留空格。計(jì)算機(jī)學(xué)院192023/6/28操作助記符域(Operation):操作助記符域可以為指令、偽操作、宏指令或偽指令的助記符。大小寫要求:ARM匯編器對大小寫敏感,在匯編語言程序設(shè)計(jì)中,每一條指令的助記符可以全部用大寫、或全部用小寫,但不允許在一條指令中大、小寫混用。位置:所有的指令都不能在行的開頭書寫,必須在指令的前面有空格,然后再書寫指令。格式:指令助記符和后面的操作數(shù)或操作寄存器之間必須有空格,不可以在這之間使用逗號。計(jì)算機(jī)學(xué)院202023/6/28操作數(shù)域(Operand):操作數(shù)域表示操作的對象,操作數(shù)可以是常量、變量、標(biāo)號、寄存器名或表達(dá)式,不同對象之間必須用逗號“,”分開。
計(jì)算機(jī)學(xué)院212023/6/28課堂練習(xí):判斷指令格式正誤AREAEX3,CODE,READONLYGBLADATADATASETA0x20
ADDR0,R1,R2ADDR0,R1,r2
addR0,R1,r2AddR0,R1,r2;前面必須有空格;前面必須有空格;DATA變量名前面不能留空格;全部大寫,正確;寄存器小寫,正確;指令助記符小寫,寄存器大寫或小寫,正確;指令助記符大小寫混合,不正確計(jì)算機(jī)學(xué)院222023/6/284.2.2ARM匯編器的偽操作在匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,其沒有相對應(yīng)的操作碼,通常稱這些特助指令助記符為偽操作。偽操作僅在匯編過程中起各種準(zhǔn)備工作的作用。ARM匯編中偽操作有:符號定義偽操作數(shù)據(jù)定義偽操作匯編控制偽操作信息報(bào)告?zhèn)尾僮髌渌S玫膫尾僮饔?jì)算機(jī)學(xué)院232023/6/28符號定義偽操作
符號定義偽操作用于定義ARM匯編程序中的變量、對變量賦值以及定義寄存器的別名等操作。常見的符號定義偽操作有如下幾種:
(1)GBLA、GBLL、GBLS(2)LCLA、LCLL,LCLS(3)SETA、SETL、SETS(4)RLIST計(jì)算機(jī)學(xué)院242023/6/28各符號定義偽操作功能說明:GBLA:定義一個全局的數(shù)值變量,并初始化為0GBLL:定義一個全局的邏輯變量,并初始化為FGBLS:定義一個全局字符串變量,并初始化為空LCLA:定義一個局部的數(shù)值變量,并初始化為0LCLL:定義一個局部的邏輯變量,并初始化為FLCLS:定義一個局部字符串變量,并初始化為空SETA:給一個數(shù)值變量賦值;SETL:給一個邏輯變量賦值;SETS:給一個字符串變量賦值;計(jì)算機(jī)學(xué)院252023/6/28使用示例:
GBLAA1;定義一個全局的數(shù)值變量,變量名為A1A1SETA0x0F;將該變量賦值為0x0F
GBLLA2;定義一個全局的邏輯變量,變量名為A2A2SETL{TRUE};將該變量賦值為真
GBLSA3;定義一個全局字符串變量,變量名為A3A3SETS“Testing”;將該變量賦值為“Testing”LCLAT4;聲明一個局部的數(shù)值變量,變量名為T4T4SETA0xaa;將該變量賦值為0xaa計(jì)算機(jī)學(xué)院262023/6/28數(shù)據(jù)定義偽操作DCB:分配一片連續(xù)的字節(jié)存儲單元并初始化DCW(DCWU):分配一片連續(xù)的半字存儲單元并初始化DCD(DCDU):分配一片連續(xù)的字存儲單元并初始化DCDO:分配一片按字對齊的字內(nèi)存單元并初始化DCI:分配一片字或半字對齊內(nèi)存單元并初始化DCQ(DCQU):分配一片以8字節(jié)為單位的連續(xù)存儲單元并初始化DCFS(DCFSU):為單精度浮點(diǎn)數(shù)分配一片連續(xù)字存儲單元并初始化DCFD(DCFDU):為雙精度浮點(diǎn)數(shù)分配一片連續(xù)字存儲單元并初始化SPACE:分配一片連續(xù)的存儲單元FIELD:定義一個結(jié)構(gòu)化的內(nèi)存表的數(shù)據(jù)區(qū)MAP:定義一個結(jié)構(gòu)化的內(nèi)存表首地址LTORG:定義一個數(shù)據(jù)緩沖區(qū)池(literallypool)的開始計(jì)算機(jī)學(xué)院272023/6/28使用示例:
StrDCB“Thisisatest!”;分配一片連續(xù)的字節(jié)存儲單元并初始化。
DataTestDCW1,2,3
;分配一片連續(xù)的半字存儲單元并初始化。
DataTestDCD4,5,6
;分配一片連續(xù)的字存儲單元并初始化。計(jì)算機(jī)學(xué)院282023/6/28課堂練習(xí):
假設(shè)Str的地址為:8008,有如下偽操作,試畫出內(nèi)存中數(shù)據(jù)的分布示意圖。計(jì)算機(jī)學(xué)院292023/6/28計(jì)算機(jī)學(xué)院302023/6/28內(nèi)存中的數(shù)據(jù)分布圖計(jì)算機(jī)學(xué)院312023/6/284.2.3ARM匯編程序中的數(shù)據(jù)定義數(shù)據(jù)定義的目的是為目標(biāo)系統(tǒng)數(shù)學(xué)模型的各種抽象數(shù)據(jù)類型分配存儲單元,同時進(jìn)行初始化。DCB、DCW和DCD匯編器偽指令stringDCB“HelloWorld!”;分配一片連續(xù)的字節(jié)存儲單元
并初始化halfwordDCW1,2,3;分配一片連續(xù)的半字存儲單元并初始化WordDCD1,2,3;分配一片連續(xù)的字存儲單元并初始化SPACE匯編器偽指令Data SPACE 1024;分配一片連續(xù)的存儲區(qū)域并初始化為0計(jì)算機(jī)學(xué)院322023/6/28LTORG匯編器偽指令
LTORG用于聲明一個文字池(literalpool),用于存放常量。ARM匯編語言提供了LDR加載指令附加文字池的方法,文字池中可以存放任意的32比特?cái)?shù),LDR加載指令相對尋址文字池,以實(shí)現(xiàn)對任意立即數(shù)的訪問。
匯編過程中,匯編器會默認(rèn)地在每一個段的末尾填加一個文字池。需要注意的是,文字池不能遠(yuǎn)離文字池使用者(LDR指令),因?yàn)長DR指令的尋址范圍是指令位置的前后4KB。如果用戶程序比較大,則可能使程序段的末尾超出4KB范圍,此時需要在程序中的適當(dāng)位置,使用LTORG偽指令顯式聲明文字池。一般總可以在LDR偽指令前后4KB的范圍內(nèi)找到分支指令,文字池可聲明在分支(B)指令之后的緊鄰位置,不會影響代碼的正常執(zhí)行,因?yàn)锽指令總是會將程序的執(zhí)行轉(zhuǎn)移到其它地方的。計(jì)算機(jī)學(xué)院332023/6/281.缺省文字池 AREAdefault,CODE,READONLY ENTRY CODE32start LDR R1, =0xABCDEF LDR R2, =0x101 ADD R3, R1, R2 B start;匯編器默認(rèn)的文字池位置,常數(shù)0xABCDEF、0x101即存放于此 ENDstart [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 ....計(jì)算機(jī)學(xué)院342023/6/282.自定義文字池匯編器在每一個程序段的末尾附加缺省文字池,如果程序段較長,這個缺省的文字池和LDR指令的距離有可能超出了4KB,那么LDR指令也不能正確加載數(shù)據(jù)。計(jì)算機(jī)學(xué)院352023/6/28 AREAdefault,CODE,READONLY ENTRY CODE32start LDR R1, =0xABCDEF LDR R2, =0x101 ADD R3,R1, R2 Bbranch … ;其它匯編代碼branch … ;其它匯編代碼other SPACE4096 END計(jì)算機(jī)學(xué)院362023/6/28 AREAdefault,CODE,READONLY ENTRY CODE32start LDR R1, =0xABCDEF LDR R2, =0x101 ADD R3,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 0x00000000....00008024 [0x00000000] dcd 0x00000000....00008028 [0x00000000] dcd 0x00000000....其它常用的偽操作AREAALIGNCODE16、CODE32ENTRYENDEQUEXPORT(或GLOBAL)IMPORTEXTERNGET(或INCLUDE)INCBINRNROUT計(jì)算機(jī)學(xué)院372023/6/28計(jì)算機(jī)學(xué)院382023/6/284.2.4匯編語言程序的上機(jī)過程匯編語言上機(jī)環(huán)境計(jì)算機(jī)學(xué)院392023/6/281編輯匯編語言源程序建立工程文件計(jì)算機(jī)學(xué)院402023/6/28
編輯源文件計(jì)算機(jī)學(xué)院412023/6/28
添加源文件計(jì)算機(jī)學(xué)院422023/6/282編譯連接源程序在編譯連接之前還需要通過DebugSettings對話框?qū)?xiàng)目的運(yùn)行環(huán)境進(jìn)行一些設(shè)置。這里采用默認(rèn)設(shè)置。編譯時可以通過Projectcompile對源文件進(jìn)行編譯,然后再連接。但是比較簡便的做法是直接單擊工程窗口的Make圖標(biāo)按鈕。計(jì)算機(jī)學(xué)院432023/6/28計(jì)算機(jī)學(xué)院442023/6/283調(diào)試匯編程序計(jì)算機(jī)學(xué)院452023/6/28計(jì)算機(jī)學(xué)院462023/6/28第4章匯編語言程序設(shè)計(jì)1.匯編語言的基本概念2.ARM匯編程序的組成與結(jié)構(gòu)3.匯編語言程序設(shè)計(jì)的基本方法4.匯編語言和C語言交叉編程計(jì)算機(jī)學(xué)院472023/6/284.3.1ARM匯編語言程序設(shè)計(jì)程序設(shè)計(jì)步驟簡單程序設(shè)計(jì)分支程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)子程序設(shè)計(jì)計(jì)算機(jī)學(xué)院482023/6/28程序設(shè)計(jì)步驟:
分析題目確定算法。合理分配存儲空間和寄存器根據(jù)算法畫出程序框圖根據(jù)框圖編寫程序上機(jī)調(diào)試程序計(jì)算機(jī)學(xué)院492023/6/281.分析題目與確定算法算法:●解決實(shí)際問題的數(shù)學(xué)模型●相同的問題有不同的算法實(shí)現(xiàn)●不同的算法在運(yùn)行速度,占據(jù)的空間不同2.合理分配存儲空間和寄存器:●合理地為原始數(shù)據(jù),中間結(jié)果及最終結(jié)果安排存儲空間●分配原則:夠用就好,不浪費(fèi)空間,不定義多余變量,
變量名合乎常規(guī),增強(qiáng)可讀性。計(jì)算機(jī)學(xué)院502023/6/283.畫出程序的流程圖矩形框:
菱形框:分支判斷橢圓框:程序的開始或結(jié)束圓框:流程圖之間的連接箭頭:處理流程圓圈:連接流程圖某個處理計(jì)算機(jī)學(xué)院512023/6/284.根據(jù)流程圖編制語句:●簡潔明了,必要的注釋●不要出現(xiàn)絕對地址●注意中英文字符,半/全角,各數(shù)制對齊等5.匯編調(diào)試程序:●ADS進(jìn)行匯編、連接;●AXD進(jìn)行調(diào)試。6.判斷程序質(zhì)量的標(biāo)準(zhǔn):●程序執(zhí)行的時間●程序所占用的內(nèi)存字節(jié)數(shù)●程序的語句行數(shù)計(jì)算機(jī)學(xué)院522023/6/284.3.2結(jié)構(gòu)化程序設(shè)計(jì)的基本概念迪杰斯克拉(E.W.dijkstra)在1969年提出結(jié)構(gòu)化程序設(shè)計(jì)的基本思想采用“自頂向下,逐步求精”的程序設(shè)計(jì)方法。“單入口單出口”的控制結(jié)構(gòu)。“自頂向下、逐步求精”程序設(shè)計(jì)方法的主導(dǎo)思想是從問題本身開始,對問題進(jìn)行分解,將解決問題的方法步驟逐步細(xì)化,分解為由基本程序結(jié)構(gòu)模塊組成的結(jié)構(gòu)化程序框圖;“單入口單出口”的思想認(rèn)為一個復(fù)雜的程序,如果它僅是由順序、分支、循環(huán)和子程序四種基本程序結(jié)構(gòu)的組合、嵌套構(gòu)成,那么這個新構(gòu)造的程序一定是一個單入口單出口的程序。計(jì)算機(jī)學(xué)院532023/6/284.3.3匯編語言程序設(shè)計(jì)的流程使用計(jì)算機(jī)通過編程序解決某一問題時,通常按以下步驟進(jìn)行:分析問題,建立數(shù)學(xué)模型;確定算法;設(shè)計(jì)程序流程圖;合理分配寄存器、存儲空間和外設(shè)資源;編制程序;調(diào)試程序;形成文檔;研討目標(biāo)系統(tǒng)的本質(zhì)特性,用數(shù)學(xué)方法對其本質(zhì)特性進(jìn)行抽象描述,建立目標(biāo)系統(tǒng)的數(shù)學(xué)表示模型
在已建立的目標(biāo)系統(tǒng)數(shù)學(xué)表示模型上,進(jìn)一步研討目標(biāo)系統(tǒng)的內(nèi)在規(guī)則,設(shè)計(jì)相應(yīng)處理法則方案(算法分析與描述)把解題的方法、步驟用框圖形式表示。如果問題比較復(fù)雜,那么可以逐步細(xì)化,直到每一框圖可以容易編程為止。流程圖不僅便于程序的編制,且對程序邏輯正確性也比較容易查找和修改。①合理地分配存儲器資源,將前述的目標(biāo)系統(tǒng)‘?dāng)?shù)據(jù)結(jié)構(gòu)模型’表示到各存儲器單元。②
CPU寄存器數(shù)量有限,在程序中,大多數(shù)操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆棧操作使用SP/R13等),程序中要合理分配各寄存器的用途。用計(jì)算機(jī)語言,對數(shù)據(jù)結(jié)構(gòu)模型和流程圖表示的算法進(jìn)行準(zhǔn)確地描述。①語法調(diào)試:排除程序中的語法錯誤。②功能調(diào)試:保證程序的邏輯功能正確性。用文檔形式記錄說明程序的功能、使用方法、程序結(jié)構(gòu)、算法流程等每一個階段的工作。計(jì)算機(jī)學(xué)院542023/6/284.3.4順序程序設(shè)計(jì)順序程序是一種最簡單的程序結(jié)構(gòu),也稱為直線程序,它的執(zhí)行自始自終按照語句的先后順序進(jìn)行。這種結(jié)構(gòu)的流程圖,除了有一個起始框,一個終止框外,就是若干執(zhí)行框。計(jì)算機(jī)學(xué)院552023/6/28例:試編制一程序,完成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調(diào)試環(huán)境特約
LDR R1, =0x20026 ;程序運(yùn)行結(jié)束返回編譯器調(diào)試環(huán)境
SWI 0x123456 END ;結(jié)束計(jì)算機(jī)學(xué)院562023/6/284.4.4分支程序設(shè)計(jì)許多實(shí)際問題需要根據(jù)不同的情況作出不同的處理。在程序中,把不同的處理方法編制成各自的處理程序段,運(yùn)行時由機(jī)器根據(jù)不同的條件自動作出判斷,選擇執(zhí)行相應(yīng)的處理程序段。這樣的程序結(jié)構(gòu)中,計(jì)算機(jī)不再完全按指令存儲的順序執(zhí)行,稱之為分支。分支程序使用子程序調(diào)用指令BL、轉(zhuǎn)移指令B或帶狀態(tài)轉(zhuǎn)移指令BX來實(shí)現(xiàn)。計(jì)算機(jī)學(xué)院572023/6/28例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,那么轉(zhuǎn)向標(biāo)號ZERO處
BGT PLUS ;如果R2大于0,那么轉(zhuǎn)向標(biāo)號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計(jì)算機(jī)學(xué)院582023/6/284.4.5循環(huán)程序設(shè)計(jì)順序程序和分支程序中的指令每次運(yùn)行最多只執(zhí)行一次。在實(shí)際應(yīng)用中重復(fù)地做某些事的情況是很多的,這也是計(jì)算機(jī)最擅長的工作方式。重復(fù)地執(zhí)行某些指令,最好用循環(huán)程序來實(shí)現(xiàn)。循環(huán)程序的結(jié)構(gòu)初始化循環(huán)體修改判斷判斷結(jié)束循環(huán)程序的主要部分,視具體情況而定:可以是一個順序程序、分支程序或另一個循環(huán)程序。計(jì)數(shù)控制循環(huán):通過計(jì)數(shù)循環(huán)次數(shù),判斷是否已達(dá)到預(yù)定次數(shù),控制循環(huán)。條件控制循環(huán):通過判斷循環(huán)終止條件是否已成立,控制循環(huán)。建立循環(huán)初始值。如設(shè)置地址指針、計(jì)數(shù)器、其他循環(huán)參數(shù)的起始值等。判斷循環(huán)結(jié)束條件是否成立,決定是否繼續(xù)循環(huán)。為執(zhí)行下一個循環(huán)而修改某些參數(shù),尤其是循環(huán)控制變量的修改等。對循環(huán)結(jié)束進(jìn)行適當(dāng)處理;有的循環(huán)程序可以沒有這部分。計(jì)算機(jī)學(xué)院592023/6/28用計(jì)數(shù)控制循環(huán)
適用于已知循環(huán)次數(shù)的循環(huán)程序設(shè)計(jì)
例4?4從x單元開始的30個連續(xù)字單元中存放有30個無符號數(shù),從中找出最大者送入y單元中。分析:根據(jù)題意,把第一個數(shù)先送入Rx寄存器,將Rx中的數(shù)與后面的29個數(shù)逐個進(jìn)行比較,如果Rx中的數(shù)較小,則將該較大的數(shù)送入Rx;繼續(xù)與余下的數(shù)據(jù)逐個比較。在比較過程中,Rx中始終保持較大的數(shù),共計(jì)比較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作為計(jì)數(shù)器
LDR R3,[R0];將源數(shù)據(jù)塊x中第一個數(shù)加載到R3中compare ADD R0,R0, #4;每進(jìn)行一次比較,將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,#1;計(jì)數(shù)器值減1 BNE compare;如果不為0,那么繼續(xù)跳到compare執(zhí)行
STREQ R3,[R1];如果為0,那么循環(huán)比較結(jié)束,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計(jì)算機(jī)學(xué)院602023/6/28② 適用于無法確定循環(huán)次數(shù),但知道循環(huán)結(jié)束的條件的循環(huán)程序設(shè)計(jì)例4?5從自然數(shù)1開始累加,直到累加和大于1000為止,統(tǒng)計(jì)被累加的自然數(shù)的個數(shù),并把統(tǒng)計(jì)的個數(shù)送入n單元,把累加和送入sum單元。分析:根據(jù)題意,被累加的自然數(shù)的個數(shù)事先未知,因此不能用計(jì)數(shù)方法控制循環(huán)。但題目中給定一個條件,即累加和大于1000則停止累加,因此,可以根據(jù)這一條件控制循環(huán)。我們用R3寄存器放累加和,用R4寄存器放每次取得的自然數(shù),其中它的值也是統(tǒng)計(jì)自然數(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)計(jì)/每次取得的自然數(shù)
LDRR5,=1000;R5用于循環(huán)結(jié)束的界限值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計(jì)算機(jī)學(xué)院612023/6/28例:編制程序使S=1+2×3+3×4+4×5+…+N(N+1),
直到N等于10為止。分析過程算法功能:相鄰數(shù)相乘:MUL累加:ADD循環(huán)次數(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)流程圖計(jì)算機(jī)學(xué)院622023/6/28源程序:AREAEX4_45,CODE,READONLYENTRYCODE32STARTMOVR0,#1;R0用作累加,置初值1,SMOVR1,#2;R1用作第一個乘數(shù),初值為2,NREPEATADDR2,R1,#1;R2用作第二個乘數(shù),N+1MULR3,R2,R1;實(shí)現(xiàn)N*(N+1)部分積存于R3ADDR0,R0,R3;將部分乘積累加至R0ADDR1,R1,#1;修改N的值得到下一輪乘數(shù)
CMPR1,#10;循環(huán)次數(shù)比較BLEREPEAT;未完成則重復(fù)
END計(jì)算機(jī)學(xué)院632023/6/28多重循環(huán)程序設(shè)計(jì)多重循環(huán)即循環(huán)體內(nèi)套有循環(huán)。設(shè)計(jì)多重循環(huán)程序時,可以從外層循環(huán)到內(nèi)層循環(huán)一層一層地進(jìn)行。通常在設(shè)計(jì)外層循環(huán)時,僅把內(nèi)層循環(huán)看成一個處理粗框,然后再將該粗框細(xì)化,分成置初值、工作、修改和控制四個組成部分。內(nèi)層循環(huán)設(shè)計(jì)完之后,用其替換外層循環(huán)體中被視為一個處理粗框的對應(yīng)部分,以構(gòu)成一個多重循環(huán)。計(jì)算機(jī)學(xué)院642023/6/28多重循環(huán)程序設(shè)計(jì)多重循環(huán)又稱循環(huán)嵌套,即循環(huán)套循環(huán)。有些問題比較復(fù)雜,單重循環(huán)難以解決,必須使用多重循環(huán)。在使用多重循環(huán)時,必須注意以下幾點(diǎn):⑴關(guān)系:內(nèi)循環(huán)必須完整地包含在外循環(huán)內(nèi),內(nèi)外循環(huán)不能相
互交叉。⑵跳轉(zhuǎn):內(nèi)循環(huán)既可以嵌套在外循環(huán)中,也可以幾個內(nèi)循環(huán)并
列存在??梢詮膬?nèi)循環(huán)中直接跳到外循環(huán),但不能
從外循環(huán)直接跳進(jìn)內(nèi)循環(huán)中。⑶注意:防止出現(xiàn)“死循環(huán)”。無論是外循環(huán),還是內(nèi)循環(huán),
千萬不要使循環(huán)返回到初始部分。⑷參數(shù)設(shè)置:每次通過外循環(huán)再次進(jìn)入內(nèi)循環(huán)時,初始條件
必須重新設(shè)置。計(jì)算機(jī)學(xué)院652023/6/28[例]利用逐次求大數(shù)的方法對內(nèi)存單元ARRAY開始的以字節(jié)
為單位的無符號數(shù)進(jìn)行從大到小排序。根據(jù)題意,排序方法為:4938651297135527788549496565979738384949656578788585786555493827131212ARRAYR6BXSISISISISISISISISIBXSISISISISISISISI計(jì)算機(jī)學(xué)院662023/6/28綜合舉例:在以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)測計(jì)算機(jī)學(xué)院672023/6/28R1R2流程圖分析:采用逐一比較法:將第一個存儲單元中的數(shù)與其后n-1個存儲單元中的數(shù)逐一比較,每次比較之后,總是把小者放在第一個存儲單元之中,經(jīng)過n-1次比較之后,n個數(shù)中最小者存入第一存儲單元中;接著從第二個存儲單元開始,同理,經(jīng)過n-2次比較之后,得到n-1個數(shù)中最小者存入第二存儲單元中;如此類推,當(dāng)最后兩個存儲單元的數(shù)比較完成之后,從小到大的排列順序就實(shí)現(xiàn)了。“冒泡排序”算法。計(jì)算機(jī)學(xué)院682023/6/28
各寄存器分配功能如下:R0:用來指示緩沖區(qū)初始地址R1:外循環(huán)計(jì)數(shù)器R2:內(nèi)循環(huán)計(jì)數(shù)器R3:外循環(huán)地址指針R4:內(nèi)循環(huán)地指針R5:內(nèi)循環(huán)下一個數(shù)地址指針R6:存放內(nèi)循環(huán)一輪比較的最小值R7:存放內(nèi)循環(huán)取出的下一個比較值計(jì)算機(jī)學(xué)院692023/6/28源程序如下:NEQU10AREAEX4_47,CODE,READONLYENTRYCODE32STARTLDRR0,=BUF;指向數(shù)組的首地址
MOVR1,#0;外循環(huán)計(jì)數(shù)器
MOVR2,#0;內(nèi)循環(huán)計(jì)數(shù)器LOOPIADDR3,R0,R1,LSL#2;外循環(huán)首地址存R3MOVR4,R3;內(nèi)循環(huán)首地址存R4ADDR2,R1,#1;內(nèi)循環(huán)計(jì)數(shù)器初值MOVR5,R4;內(nèi)循環(huán)下一地址初值
LDRR6,[R4];取內(nèi)循環(huán)下一地址值R4計(jì)算機(jī)學(xué)院702023/6/28LOOPJADDR5,R5,#4;內(nèi)循環(huán)下一地址值
LDRR7,[R5];取出下一地址值至R7CMPR6,R7;比較BLTNEXT;小則取下一個
SWPR7,R6,[R5];大則交換,最小值R6MOVR6,R7NEXTADDR2,R2,#1;內(nèi)循環(huán)計(jì)數(shù)
CMPR2,#N;循環(huán)中止條件BLTLOOPJ;小于N則繼續(xù)內(nèi)循環(huán)SWPR7,R6,[R3];否則,內(nèi)循環(huán)一輪結(jié)束,將最;小數(shù)存入外循環(huán)的首地址處ADDR1,R1,#1;外循環(huán)計(jì)數(shù)計(jì)算機(jī)學(xué)院712023/6/28CMPR1,#N-1;外循環(huán)中止條件
BLTLOOPI;小于N-1則繼續(xù)執(zhí)行外循環(huán)BSTARTAREABlockData,DATA,READWRITEBUFDCD0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70END采用冒泡排序方法,程序運(yùn)行的結(jié)果如下:00H,10H,20H,30H,40H,50H,70H,80H,90H,FFH計(jì)算機(jī)學(xué)院722023/6/28程序模塊化結(jié)構(gòu)STARTLOOPILOOPJBLTNEXTNEXTBLTLOOPJBLTLOOPIBSTART計(jì)算機(jī)學(xué)院732023/6/28計(jì)算機(jī)學(xué)院742023/6/284.4.6子程序設(shè)計(jì)子程序概念 如果在一個程序中的多處用到同一段程序代碼,那么可以把這段共同的程序代碼抽取出來,寫成一個相對獨(dú)立的程序段,每當(dāng)需要執(zhí)行這段代碼時,就調(diào)用這個程序段,執(zhí)行完這個程序段后,再返回原來調(diào)用它的程序。這樣編寫程序時,就不必重復(fù)寫這段代碼了,而這樣的程序段稱為子程序或子過程。子程序的調(diào)用與返回主程序中使用BL指令實(shí)現(xiàn)子程序的調(diào)用
BL 子程序名在子程序結(jié)束處,使用如下指令返回到主程序中。
MOV PC, LR主程序與子程序之間的參數(shù)傳遞 主程序調(diào)用子程序時,可以向子程序傳遞一些參數(shù);同樣,子程序運(yùn)行后也可把一些結(jié)果參數(shù)傳回給主程序。主程序與子程序之間的這種信息傳遞稱為參數(shù)傳遞。三種參數(shù)傳遞方式
①寄存器傳遞參數(shù)方式 ②存儲區(qū)域傳遞參數(shù)方式
③堆棧傳遞參數(shù)方式計(jì)算機(jī)學(xué)院752023/6/28寄存器傳遞參數(shù)方式
技術(shù)思想:主程序?qū)⒋齻鬟f的數(shù)據(jù)直接寫入約定的通用寄存器,再進(jìn)行BL子程序調(diào)用;或子程序返回后,主程序直接從約定的通用寄存器中獲得子程序的結(jié)果數(shù)據(jù)。應(yīng)用特點(diǎn):這種方式適合于傳遞較少參數(shù)的應(yīng)用場合。例:用子程序?qū)崿F(xiàn)內(nèi)存區(qū)里的字符串拷貝功能,即將存儲單
元中源字符串對應(yīng)拷貝到目的字符串中。解題思路:通過設(shè)定兩個地址指針,分別指向存儲區(qū)中的源字符串和目的字符串;然后通過加載和存儲指令(LDR和STR)的寄存器間接尋址方式,依次從源字符串讀取一個字符數(shù)據(jù),寫入到目的字符串的對應(yīng)字符位置中,直到遇到源字符串的結(jié)束標(biāo)志’0’為止。AREAStrCopy,CODE,READONLYENTRYCODE32startLDRR1,=srcstr;R1指向數(shù)據(jù)區(qū)的源字符串
LDRR0,=dststr;R0指向數(shù)據(jù)區(qū)的目的字符串
BLstrcopy;調(diào)用子程序strcopy,完成字符串拷貝stopMOVR0,#0x18 ;程序結(jié)束返回編譯器調(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)到strcopy處執(zhí)行
MOVPC,LR;子程序返回AREAStrings,DATA,READWRITEsrcstrDCB"Firststring-source",0 ;源字符串dststrDCB"Secondstring-destination",0 ;目的字符串
END計(jì)算機(jī)學(xué)院762023/6/28存儲區(qū)域傳遞參數(shù)方式技術(shù)思想:主程序和子程序約定了某一共享內(nèi)存塊用于參數(shù)傳遞,主程序在BL調(diào)用子程序前,先將要傳遞的參數(shù)寫入到約定的存儲單元,子程序可從約定的內(nèi)存讀取這些參數(shù);子程序返回時,也可以使用該方式將數(shù)據(jù)傳給主程序。應(yīng)用特點(diǎn):這種方式可以傳遞大批量數(shù)據(jù)。實(shí)現(xiàn)方法:當(dāng)主程序與子程序有較多的數(shù)據(jù)需要傳遞時,可以通過共享內(nèi)存區(qū)或傳內(nèi)存數(shù)據(jù)塊地址方式來傳遞批量數(shù)據(jù)。①通過偽指令A(yù)DR直接裝載近距離數(shù)據(jù)塊地址;②通過偽指令A(yù)DRL直接裝載較近距離數(shù)據(jù)塊地址;③通過語句LDRRd,=Label轉(zhuǎn)載遠(yuǎn)距離的數(shù)據(jù)塊地址;例:通過設(shè)置的入口參數(shù)查找函數(shù)地址表,實(shí)現(xiàn)選擇不同函
數(shù)的功能。說明:本題中通過事先將函數(shù)地址存放在存儲單元中,通過查找地址表的方法,實(shí)現(xiàn)根據(jù)“選擇項(xiàng)(choice)”進(jìn)入不同函數(shù)體的功能。AREAJump,CODE,READONLYnumEQU4 ;函數(shù)地址表內(nèi)容的個數(shù)
ENTRYCODE32start
LDRR0,=choice ;R0指向存儲區(qū)的choice單元
LDRR0,[R0] ;設(shè)置第一個參數(shù):選擇執(zhí)行哪一個函數(shù)
MOVR1,#16 ;設(shè)置第1個操作數(shù)
MOVR2,#2 ;設(shè)置第2個操作數(shù)
BLarithfunc ;調(diào)用子程序arithfuncstopMOVR0,#0x18 ;程序結(jié)束返回編譯器調(diào)試環(huán)境
LDRR1,=0x20026SWI 0x123456arithfuncCMPR0,#num;比較R0的值是否超過函數(shù)地址表的個數(shù)
MOVHSpc,lr ;如果大于,那么就返回到標(biāo)號stop處
ADRR3,JumpTable ;將函數(shù)地址表的地址作為基地址
LDRpc,[R3,R0,LSL#2] ;根據(jù)R0參數(shù)進(jìn)入對應(yīng)的子程序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計(jì)算機(jī)學(xué)院772023/6/28③堆棧傳遞參數(shù)方式主程序和子程序使用同一個堆棧,主程序在BL調(diào)用子程序前,先將要傳遞的參數(shù)壓入到堆棧中,子程序可從堆棧中讀取傳過來的數(shù)據(jù);子程序返回需要向主程序傳遞參數(shù)時,也可使用此方法。計(jì)算機(jī)學(xué)院782023/6/28第4章匯編語言程序設(shè)計(jì)1.匯編語言的基本概念2.ARM匯編程序的組成與結(jié)構(gòu)3.匯編語言程序設(shè)計(jì)的基本方法4.匯編語言和C語言交叉編程計(jì)算機(jī)學(xué)院792023/6/281.匯編程序與C程序間變量互訪匯編程序訪問C程序中的變量 具體操作步驟:在C程序中,將供匯編程序訪問的變量用關(guān)鍵字extern聲明為全局變量;匯編程序中,用偽指令I(lǐng)MPORT引入C程序中的全局變量;使用偽指令LDR讀取這個全局變量的地址;使用指令LDR讀取這個全局變量的值;在匯編程序中使用這個全局變量;計(jì)算機(jī)學(xué)院802023/6/28C程序訪問匯編程序中的變量 具體操作步驟:在匯編語言程序中,用偽指令“global”定義全局變量,變量名必須是下劃線“_”為首字符的字母數(shù)字串;C程序中將該變量聲明為外部變量,即可訪問匯編程序定義的全局變量。1.匯編程序與C程序間變量互訪計(jì)算機(jī)學(xué)院812023/6/28例:匯編程序和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ù),訪問全局變量g_var*/printf("multis%d",_multiple); /*訪問匯編程序中全局變量_multiple*/printf("Modifiedvalueofg_varis:%d",g_var);return0;}計(jì)算機(jī)學(xué)院822023/6/28;visit.s文件
AREAasmfile,CODE,READONLY EXPORTasmVisit ;聲明全局函數(shù),供C程序調(diào)用
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中的值擴(kuò)大指定的倍數(shù)
STR R3, [R0] MOV PC, LR AREAasmData,DATA,READWRITE_multipleDCD2 END計(jì)算機(jī)學(xué)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 非營利財(cái)務(wù)制度
- 公司收付款財(cái)務(wù)制度
- 大辦局財(cái)務(wù)制度
- 公司辦公司上班請假制度
- 養(yǎng)老院老人康復(fù)理療師職業(yè)發(fā)展規(guī)劃制度
- 養(yǎng)老院老人訪客管理制度
- 古街夜游活動方案策劃(3篇)
- 河道渾水施工方案(3篇)
- 燈施工方案范本(3篇)
- 教育資源分配使用制度
- 管道區(qū)段長管理辦法
- 藥師崗前培訓(xùn)考試題及答案
- 2025年江西公務(wù)員考試(財(cái)經(jīng)管理)測試題及答案
- CRT-YS4690消防控制室圖形顯示裝置使用說明書-營口賽福德
- 植筋工程施工驗(yàn)收記錄表范例
- 2025至2030年中國冷凍食品行業(yè)市場調(diào)研及行業(yè)投資策略研究報(bào)告
- 壓空罐安全知識培訓(xùn)課件
- 2025年江蘇南京市建鄴區(qū)招聘第一批購崗人員5人筆試模擬試題及答案詳解1套
- 市場保潔管理方案(3篇)
- 醫(yī)院調(diào)料雜糧副食品采購項(xiàng)目方案投標(biāo)文件(技術(shù)方案)
- 靜脈給藥的安全管理
評論
0/150
提交評論