




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
4.1匯編語(yǔ)言程序的格式和處理過(guò)程
4.1.1匯編語(yǔ)言概述
用指令的助記符、符號(hào)地址、標(biāo)號(hào)、偽指令等符號(hào)書寫的語(yǔ)言稱為匯編語(yǔ)言,用這種匯編語(yǔ)言書寫的程序稱為匯編語(yǔ)言源程序。
匯編語(yǔ)言是一種符號(hào)語(yǔ)言,它是面向機(jī)器的。不同CPU構(gòu)成的計(jì)算機(jī)有不同的匯編語(yǔ)言,除硬件定義和指令系統(tǒng)外,其語(yǔ)義、語(yǔ)法規(guī)則都是特定的。8086/8088匯編語(yǔ)言源程序的基本組成單位是語(yǔ)句,源程序可使用的語(yǔ)句有三種:指令語(yǔ)句、偽指令語(yǔ)句和宏指令語(yǔ)句。前兩種是最常見的基本的語(yǔ)句。每個(gè)指令語(yǔ)句在匯編過(guò)程中都會(huì)產(chǎn)生相應(yīng)的目標(biāo)代碼。4.1.2匯編語(yǔ)言的語(yǔ)句
編寫一個(gè)匯編語(yǔ)言源程序需要兩種語(yǔ)句:一種是由CPU執(zhí)行的語(yǔ)句,叫做指令性語(yǔ)句;另一種是由匯編程序執(zhí)行的語(yǔ)句,叫做指示性語(yǔ)句。第3章中介紹的指令一般會(huì)在指令性語(yǔ)句中使用,而指示性語(yǔ)句中使用的指令稱為偽指令,以便與指令區(qū)別開。下面分別介紹這兩種語(yǔ)句的格式。
1.指令性語(yǔ)句格式
指令性語(yǔ)句包括四部分,格式如下:
[標(biāo)號(hào):]操作碼[操作數(shù)1][,操作數(shù)2][;注釋]說(shuō)明:
(1)標(biāo)號(hào)部分:以冒號(hào)分隔,該部分不是每條指令必需的,為提供其他指令引用而設(shè)。一個(gè)標(biāo)號(hào)與一條指令的地址符號(hào)名(即在當(dāng)前程序段內(nèi)的偏移量)相聯(lián)系。在同一程序段中,同樣的標(biāo)號(hào)名只允許定義一次。
(2)操作碼部分:操作碼助詞符是指令系統(tǒng)規(guī)定的。任何指令性語(yǔ)句必須有該部分,因?yàn)樗砻饕欢ǖ牟僮餍再|(zhì)并完成一個(gè)操作。
(3)操作數(shù)部分:表明操作的對(duì)象。
(4)注釋部分:這部分不被匯編語(yǔ)言程序翻譯,僅作為對(duì)該語(yǔ)句的一種說(shuō)明,以便程序的閱讀、備忘和交流。
上述格式中用方括號(hào)括起來(lái)的為可選部分。
2.指示性語(yǔ)句格式
指示性語(yǔ)句也包括四部分,格式如下:
[標(biāo)識(shí)符(名字)]指示符(偽指令)表達(dá)式[;注釋]
說(shuō)明:
(1)標(biāo)識(shí)符部分:標(biāo)識(shí)符是一個(gè)用字母、數(shù)字或下劃線表示的符號(hào),標(biāo)識(shí)符定義的性質(zhì)由偽指令指定。
(2)指示符部分:指示符又稱為偽指令,是匯編程序規(guī)定并執(zhí)行的命令,能將標(biāo)識(shí)符定義為變量、程序段、常數(shù)、過(guò)程等,且能給出其屬性。
(3)表達(dá)式部分:表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量與一些操作符相結(jié)合的序列,可以有數(shù)字表達(dá)式和地址表達(dá)式兩種。
(4)注釋部分:與指令性語(yǔ)句的注釋部分含義相同。4.1.3匯編語(yǔ)言程序
把匯編語(yǔ)言源程序翻譯成能在機(jī)器上執(zhí)行的機(jī)器語(yǔ)言程序(目標(biāo)代碼程序)的過(guò)程叫做匯編,完成匯編過(guò)程的系統(tǒng)程序稱為匯編程序。
圖4.1表示匯編語(yǔ)言程序的建立及處理過(guò)程。
圖4.1匯編語(yǔ)言程序的建立及處理過(guò)程首先用編輯軟件(可用文本編輯程序,如EDIT等)產(chǎn)生匯編語(yǔ)言的源程序(擴(kuò)展名為?.asm的源文件),源程序就是用匯編語(yǔ)言的語(yǔ)句編寫的程序,它是不能被機(jī)器直接識(shí)別和執(zhí)行的,所以必須把它翻譯成二進(jìn)制代碼組成的程序(?.obj),通常這一工作是由匯編程序完成的。因此匯編程序的作用就是把源文件轉(zhuǎn)換成用二進(jìn)制代碼表示的目標(biāo)文件(稱為OBJ文件)。在轉(zhuǎn)換過(guò)程中,匯編程序?qū)?duì)源程序進(jìn)行掃描,如果源程序中有語(yǔ)法錯(cuò)誤,則匯編結(jié)束后,匯編程序?qū)⒅赋鲈闯绦蛑械腻e(cuò)誤,用戶再回到編輯程序中修改源程序中的錯(cuò)誤,最后得到無(wú)語(yǔ)法錯(cuò)誤的OBJ文件。
OBJ文件雖然已經(jīng)是二進(jìn)制文件,但它還不能直接運(yùn)行,必須經(jīng)過(guò)連接程序(LINK)把目標(biāo)文件與庫(kù)文件或其他目標(biāo)文件連接在一起形成可執(zhí)行文件(EXE文件),這個(gè)文件就可以由操作系統(tǒng)裝入內(nèi)存并執(zhí)行了。
因此,在計(jì)算機(jī)上運(yùn)行匯編語(yǔ)言程序的步驟是:
(1)用編輯程序建立ASM源文件;
(2)用匯編程序把ASM文件翻譯成OBJ文件;
(3)用連接程序把OBJ文件轉(zhuǎn)換成EXE文件;
(4)在DOS命令環(huán)境下直接鍵入文件名執(zhí)行該程序。
【例4.1】
一個(gè)完整的匯編語(yǔ)言程序示例。由上例可以看出,匯編語(yǔ)言程序由若干條語(yǔ)句序列組成,每條語(yǔ)句一般占一行。第3章中介紹的能完成一定的操作功能的(如PUSH、SUB、MOV、ADD、RET等)是指令語(yǔ)句,它們是能夠翻譯成機(jī)器代碼的語(yǔ)句。而如DB、ASSUME、SEGMENT-ENDS和END等語(yǔ)句是指示性語(yǔ)句(偽指令),其形式與一般指令相似,但它只是為匯編程序在翻譯匯編語(yǔ)言源程序時(shí)提供有關(guān)信息,并不產(chǎn)生機(jī)器代碼。
一個(gè)匯編語(yǔ)言源程序的結(jié)構(gòu)是分段組織的,可以包含若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段。典型的匯編語(yǔ)言程序至少由3個(gè)段組成:代碼段、數(shù)據(jù)段、堆棧段。需獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段并指示程序執(zhí)行的起點(diǎn),所有的可執(zhí)行性語(yǔ)句必須位于某一個(gè)代碼段內(nèi),指示性語(yǔ)句可根據(jù)需要位于任一段內(nèi)。
【例4.2】
在屏幕上顯示字符串“Welcome!”。
程序如下: 4.2偽指令
4.2.1偽指令概述
偽指令也稱為偽操作,在匯編程序的指示性語(yǔ)句中作為指示符,在對(duì)匯編語(yǔ)言源程序進(jìn)行匯編期間,是由匯編程序處理的操作。偽指令可以對(duì)數(shù)據(jù)進(jìn)行定義,為變量分配存儲(chǔ)區(qū),定義一個(gè)程序段或一個(gè)過(guò)程,指示程序結(jié)束等。
偽指令不像機(jī)器指令那樣是在程序運(yùn)行期間由計(jì)算機(jī)來(lái)執(zhí)行的,偽指令不會(huì)產(chǎn)生任何目標(biāo)代碼,它是在匯編程序?qū)υ闯绦騾R編期間完成特定處理的操作。4.2.2常用偽指令
1.表達(dá)式賦值偽指令EQU
有時(shí)程序中多次出現(xiàn)同一個(gè)表達(dá)式,為方便起見,可以用賦值偽操作給表達(dá)式賦予一個(gè)名字。其格式如下:
ExpressionnameEQUExpression
此后,程序中凡需要用到該表達(dá)式之處,就可以用表達(dá)式名來(lái)代替了??梢?,EQU的引入提高了程序的可讀性,也使其更加易于修改。
還有一個(gè)與EQU相類似的“=”偽操作也可以作為賦值操作來(lái)使用。它們之間的區(qū)別是EQU偽操作中的表達(dá)式名是不允許重復(fù)定義的,而“=”偽操作則允許重復(fù)定義。
2.?dāng)?shù)據(jù)定義及存儲(chǔ)器分配偽指令
該指令的功能是開辟存儲(chǔ)空間存放數(shù)據(jù),把數(shù)據(jù)項(xiàng)或項(xiàng)表的數(shù)值存入存儲(chǔ)器連續(xù)的單元中,并把變量名與存儲(chǔ)單元地址聯(lián)系在一起,用戶可以用變量名來(lái)訪問(wèn)這些數(shù)據(jù)項(xiàng)。其格式如下:
[variable]Mnemonicoperand[,operand…][;comments]
(1)?variable(變量):是定義的數(shù)據(jù)存儲(chǔ)單元的名字,其地址是數(shù)據(jù)空間第一個(gè)字節(jié)的偏移地址。變量名省略時(shí),只代表開辟連續(xù)的地址空間。
(2)?Mnemonic(助詞符):說(shuō)明數(shù)據(jù)類型,常用的數(shù)據(jù)類型有DB、DW、DD幾種。
DB用來(lái)定義字節(jié),匯編時(shí)為其后的每個(gè)操作數(shù)分配1個(gè)字節(jié)存儲(chǔ)單元。
DW定義字,其后的每個(gè)操作數(shù)占有一個(gè)字(16位),其低位字節(jié)在第一個(gè)字節(jié)地址中,高位字節(jié)在第二個(gè)字節(jié)地址中。
DD定義雙字,其后的每個(gè)操作數(shù)占有兩個(gè)字(32位)。
(3)?operand(操作數(shù)):可以是十進(jìn)制、十六進(jìn)制、字符串、占位符及復(fù)制操作符DUP。
(4)?comments(注釋):用來(lái)說(shuō)明該偽操作的功能,是任選項(xiàng)。
這些偽操作可以把其后的數(shù)據(jù)存入指定的存儲(chǔ)單元,形成初始化數(shù)據(jù);或者只分配空間而不存入確定的數(shù)值,形成未初始化數(shù)據(jù)。
匯編程序可以在匯編期間把數(shù)據(jù)存入內(nèi)存,如圖4.2所示。 圖4.2MESS1、MESS2在內(nèi)存中的存放操作數(shù)可以是空間分配的操作:
ARRAYDB100DUP(0,2,DUP,(1,2),0,3)
本例中嵌套使用了復(fù)制操作符DUP,內(nèi)存分配如圖4.3所示。圖4.3ARRAY的內(nèi)存分配操作數(shù)可以是常數(shù)或表達(dá)式,也可是“?”,只保留存儲(chǔ)空間,但不存入數(shù)據(jù)。
OPER1DB?,1+9
OPER2DW1234H,5678H
其內(nèi)存分配如圖4.4所示。
MOVOPER1,0
MOVOPER2,0
則第1條指令應(yīng)為字節(jié)指令,而第2條指令應(yīng)為字指令。圖4.4OPER1、OPER2的內(nèi)存分配
3.段定義偽指令SEGMENT-ENDS
存儲(chǔ)器的地址空間是分段結(jié)構(gòu)的,邏輯上的段的地址稱為段地址,它是程序段在內(nèi)存的位置。段內(nèi)語(yǔ)句或變量有自己相對(duì)段起始地址的偏移地址,語(yǔ)句或變量在存儲(chǔ)器的物理地址由段地址和偏移地址指示出來(lái)。段定義偽指令的功能是把源程序劃分為邏輯段,便于匯編程序在相應(yīng)段名下生成目標(biāo)碼,同時(shí)也便于連接程序組合、定位、生成可執(zhí)行的目標(biāo)程序。利用段定義偽操作可以定義一個(gè)邏輯段的名稱和范圍,并且指明段的定位類型、組合類型和別名。段定義偽指令的完整格式如下:
SegnameSEGMENT[align_type][combine_type][use_type]['class']
…
SegnameENDS
在源程序中,每一個(gè)段都是以SEGMENT開始、以ENDS結(jié)束。段名由用戶自己選定,通常使用與本段用途相關(guān)的名字。
(1)?align_type(定位類型):說(shuō)明該段起始地址的邊界值,它們可以是以下幾種情況。默認(rèn)值是PARA。
PARA:指明段起始地址從節(jié)邊界開始。段地址為16的倍數(shù),即十六進(jìn)制的段地址最后一位為0。
BYTE:段從任何地址開始。
WORD:段從字邊界開始,即段起始地址要為偶數(shù)。
DWORD:段從雙字的邊界開始,即段起始地址為4的倍數(shù)。
PAGE:段從頁(yè)邊界開始,即段起始地址為256的倍數(shù),即十六進(jìn)制地址最后兩位為00。
(2)?combine_type(組合類型):說(shuō)明程序連接時(shí)各段在內(nèi)存中合并的方法,默認(rèn)值為PRIVATE。
PRIVATE:在連接時(shí)不與其他模塊中的同名段合并。
PUBLIC/MEMORY:依次把不同模塊中的同名段相連接而形成一個(gè)段(連接的結(jié)果可能有間隙)。
COMMEN:把不同模塊中的同名段重疊形成一個(gè)段,連接長(zhǎng)度取各段中的最大長(zhǎng)度,覆蓋部分的內(nèi)容取決于連接時(shí)排列在最后一段的內(nèi)容。
ATexpression:使段地址是表達(dá)式的值,它不能用來(lái)指定代碼段。
STACK:把不同模塊中的同名段無(wú)間隙地組合成一個(gè)堆棧段,其長(zhǎng)度為各段的總和。
(3)?class(類別):類別可以是任何合法的名稱,用單引號(hào)括起來(lái),如?'STACK','CODE'。在定位時(shí),鏈接程序把同類別的段集中在一起,但不合并。
4.段寄存器設(shè)定偽指令A(yù)SSUME
ASSUME偽操作指出由SEGMENT-ENDS偽指令定義的段與段寄存器的對(duì)應(yīng)關(guān)系,即設(shè)定已定義段各自屬于哪個(gè)段寄存器。其格式為
ASSUME assignment[,…,assignment]
其中,assignment說(shuō)明段寄存器的分配情況,其格式為
registername:segmentname
這里,段寄存器名必須是CS、DS、ES或SS,而段名必須是由SEGMENT定義的段中的段名。
使用ASSUME偽操作,僅告訴匯編程序段寄存器與定義段之間的對(duì)應(yīng)關(guān)系,而段寄存器的內(nèi)容需要用程序按要求加載。
5.匯編程序結(jié)束偽指令END
END標(biāo)志著整個(gè)源程序的結(jié)束,它使匯編程序停止匯編操作。其指令格式如下:
END [lable]
其中,lable(標(biāo)號(hào))指示源程序中第一條可執(zhí)行指令的起始地址,它提供了代碼段寄存器CS與指令指針I(yè)P的數(shù)值。偽指令END必須是匯編語(yǔ)言源程序中的最后一條語(yǔ)句,而且每一個(gè)源程序只能有一條END偽操作。如果出現(xiàn)多個(gè)END偽指令,則在第一條END偽指令后的語(yǔ)句是無(wú)效的。
6.地址計(jì)數(shù)器$
在匯編程序?qū)υ闯绦騾R編的過(guò)程中,使用地址計(jì)數(shù)器來(lái)保存當(dāng)前正在匯編的指令的偏移地址。地址計(jì)數(shù)器的值可用?$?來(lái)表示。例如:
JNE$+6 ;轉(zhuǎn)向地址是JNE的首址+6
7.對(duì)準(zhǔn)偽指令ORG
ORG偽操作用來(lái)設(shè)置當(dāng)前地址計(jì)數(shù)器的值,它指出其后的程序段或數(shù)據(jù)塊存放的起始地址的偏移量。其格式為
ORG常數(shù)表達(dá)式
ORG偽操作可以使下一個(gè)字節(jié)的地址成為常數(shù)表達(dá)式的值。匯編程序把語(yǔ)句中表達(dá)式之值作為起始地址,連續(xù)存放程序和數(shù)據(jù),直到出現(xiàn)一個(gè)新的ORG指令。若省略O(shè)RG,則從本段起始地址開始連續(xù)存放。
ORG100H ;使下一地址是100H
8.過(guò)程定義偽指令PROC-ENDP
子程序又稱為過(guò)程,它類似于高級(jí)語(yǔ)言中的過(guò)程和函數(shù)。在一個(gè)程序的不同部分,往往要用到類似的程序段,這些程序段的功能和結(jié)構(gòu)形式都相同,只是某些變量的賦值不同,此時(shí)就可以把這些程序段寫成子程序形式,以便需要時(shí)可以調(diào)用它。
過(guò)程(子程序)定義偽指令的格式如下:
procedure_namePROCNEAR(FAR)
…
procedure_nameENDP
子程序詳細(xì)設(shè)計(jì)見4.8節(jié)的子程序設(shè)計(jì)部分。
4.3系統(tǒng)功能調(diào)用
為了提高匯編語(yǔ)言程序的編寫效率,IBMPC中的BIOS和DOS操作系統(tǒng)都提供了豐富的中斷服務(wù)程序,這兩組功能子程序主要是實(shí)現(xiàn)系統(tǒng)外部設(shè)備的輸入輸出操作、文件管理等。DOS和BIOS是兩組系統(tǒng)軟件,因?yàn)锽IOS比DOS更靠近硬件,而DOS則是較高層次的系統(tǒng)軟件,DOS的許多功能是調(diào)用BIOS實(shí)現(xiàn)的。使用DOS操作比使用相應(yīng)功能的BIOS操作更簡(jiǎn)易,而且對(duì)硬件的依賴性更少。DOS功能與BIOS功能都通過(guò)軟中斷調(diào)用。在中斷調(diào)用前需要把功能號(hào)裝入AH寄存器,把子功能號(hào)裝入AL寄存器,此外,通常還需在CPU寄存器中提供專門的調(diào)用參數(shù)。一般地說(shuō),調(diào)用DOS或BIOS功能時(shí),有以下幾個(gè)基本步驟:
(1)將調(diào)用參數(shù)裝入指定的寄存器中;
(2)如需功能號(hào),把它裝入AH;
(3)如需子功能號(hào),把它裝入AL;
(4)按中斷號(hào)調(diào)用DOS或BIOS中斷,如INTn;
(5)檢查返回參數(shù)是否正確,即如果有出口參數(shù)并且需要的話,分析出口參數(shù)以決定后續(xù)的程序執(zhí)行。4.3.1
DOS功能調(diào)用
1.DOS鍵盤功能調(diào)用
DOS系統(tǒng)調(diào)用中的功能號(hào)為01H、06H、07H、08H、0AH、0BH、0CH等的都與鍵盤有關(guān),包括單字符輸入、字符串輸入和鍵盤輸入狀態(tài)檢驗(yàn)等。其中檢查鍵盤輸入狀態(tài)的功能號(hào)是0BH,可以確認(rèn)是否有字符鍵入。如果有鍵按下,則AL=FF,否則AL=00。功能號(hào)為01H、06H、07H、08H的都可以直接接收鍵入的單個(gè)字符。程序中常利用這些功能回答程序中的提示信息,或選擇其中的可選項(xiàng)以執(zhí)行不同的程序段。這樣的工作可由如下類似的程序段來(lái)完成。
通過(guò)鍵盤鍵入Y/N來(lái)轉(zhuǎn)向不同的程序段執(zhí)行。
2.字符串輸入
用戶程序經(jīng)常需要從鍵盤上接收一串字符。0AH號(hào)功能可以接收鍵入的字符串,將其存入內(nèi)存中用戶定義的緩沖區(qū)。緩沖區(qū)結(jié)構(gòu)如圖4.5所示。緩沖區(qū)第一個(gè)字節(jié)為用戶定義的最大鍵入字符數(shù),它由用戶給出。若用戶實(shí)際鍵入的字符數(shù)(包括回車符)大于此數(shù),則機(jī)器響鈴且光標(biāo)不再右移,直到鍵入回車符為止。緩沖區(qū)第二個(gè)字節(jié)為實(shí)際鍵入的字符數(shù)(不包括回車符),由DOS的功能A自動(dòng)填入。從第三個(gè)字節(jié)開始存放鍵入的字符。顯然,緩沖區(qū)的大小等于最大字符數(shù)加2。設(shè)在數(shù)據(jù)段定義的字符緩沖區(qū)如下:
BUFSIZEDB20H ;定義緩沖區(qū)
ACTLENDB?
STRINGDB32DUP
(?)或定義數(shù)據(jù)區(qū)如下:
BUFSIZEDB32,33DUP
(?)
調(diào)用DOS功能的0AH號(hào)功能的程序段為
LEA DX,BUFSIZE;DS:DX指向緩沖區(qū)的第一個(gè)字節(jié)
MOVAH,0AH ;OAH號(hào)功能,輸入字符串到緩沖區(qū)
INT 21H
此程序段最多從鍵盤接收32個(gè)字符碼(包括回車符)。如果鍵入字符串?"Howareyou?↙",此時(shí)緩沖區(qū)BUFSIZE的存儲(chǔ)情況如圖4.5所示。INT21H的功能A把實(shí)際字符數(shù)(不包括回車符)填入緩沖區(qū)的第二個(gè)字節(jié),并保持DS:DX指向緩沖區(qū)的第一個(gè)字節(jié)。圖4.5用戶定義的緩沖區(qū)
3.DOS顯示功能調(diào)用
功能號(hào)為02H、06H、09H的是關(guān)于顯示器(CRT)的系統(tǒng)功能調(diào)用。其中,顯示單個(gè)字符的是02H和06H,與BIOS調(diào)用類似。
(1)顯示單個(gè)字符。
(2)顯示字符串。顯示字符串的09H號(hào)功能是DOS調(diào)用獨(dú)有的,可以在用戶程序運(yùn)行過(guò)程中,在顯示器上向用戶提示下一步操作的內(nèi)容。使用09H號(hào)功能時(shí)要注意兩點(diǎn):一是被顯示的字符串必須以“$”為結(jié)束符;二是當(dāng)顯示由功能0AH鍵入的字符串時(shí),DS:DX應(yīng)指向用戶定義的緩沖區(qū)的第三個(gè)字節(jié)。4.3.2
BIOS功能調(diào)用
1.BIOS顯示字符
使用INT10H指令可調(diào)用BIOS屏幕操作功能。它包含了與顯示器有關(guān)的功能,可用來(lái)設(shè)置顯示方式、光標(biāo)大小和位置,以及顯示字符等。其調(diào)用格式如下:
MOVAH,功能號(hào)
MOVAL,字符的ASCII碼
INT10H
功能:將AL寄存器中的字符送顯示器顯示。
2.控制光標(biāo)
利用INT10H的功能2可設(shè)置光標(biāo)位置,光標(biāo)新位置的行號(hào)設(shè)在DH寄存器中,列號(hào)設(shè)在DL中。行列設(shè)在(0,0),是屏幕的左上角,(24,79)是屏幕的右下角。BH中必須包含被輸出的頁(yè)號(hào),對(duì)單色顯示器來(lái)說(shuō),頁(yè)號(hào)總是0。其調(diào)用格式為
MOVBH,頁(yè)號(hào)
MOVDH,行號(hào)
MOVDL,列號(hào)
MOVAH,2
INT10H此外,表4.1中還列出了INT10H的顯示器中斷操作的部分功能。表4.1INT10H的顯示器中斷操作的部分功能
3.從鍵盤上輸入字符
用INT16H可調(diào)用BIOS鍵盤輸入功能。INT16H的鍵盤中斷功能如表4.2所示。表4.2INT16H的鍵盤中斷功能其調(diào)用格式如下:
MOVAH,功能號(hào)
INT 16H
(1)?AH=0時(shí),從鍵盤讀一鍵值。出口參數(shù)AL=ASCII碼(即鍵的字符碼),AH=掃描碼。
功能:從鍵盤讀入一個(gè)鍵后返回,按鍵不顯示在屏幕上。
對(duì)于無(wú)相應(yīng)ASCII碼的鍵,如功能鍵等,AL返回0,例如:
MOVAH,0
INT 16H
程序執(zhí)行到INT16H的0號(hào)功能時(shí),CPU暫停執(zhí)行,等待從鍵盤輸入一個(gè)字符,輸入字符的ASCII碼送入AL,掃描碼送入AH。掃描碼是表示按鍵所在位置的代碼,它用一個(gè)字節(jié)表示,低7位是掃描碼的數(shù)字編碼01~53H,最高位BIT7表示鍵的狀態(tài)。當(dāng)某鍵按下時(shí),掃描碼的BIT7=0,稱為通碼;當(dāng)此鍵放開時(shí),掃描碼的BIT7=1,稱為斷碼。通碼與斷碼的值相差80H。
(2)當(dāng)AH=1時(shí),判斷是否有鍵可讀。出口參數(shù)ZF=0,則有鍵可讀,AL=ASCII碼,AH=掃描碼;否則,無(wú)鍵可讀。
(3)當(dāng)功能號(hào)AH=2時(shí),返回特殊功能鍵狀態(tài)(也稱“變換鍵”)的當(dāng)前狀態(tài)。出口參數(shù)AL?=?變換鍵的狀態(tài)。特殊功能鍵狀態(tài)如表4.3所示。
BIOS除提供對(duì)輸入/輸出設(shè)備的控制服務(wù)外,還有一些其他服務(wù)功能。例如,異步通信口輸入/輸出(INT14H)、內(nèi)存大小的測(cè)試(INT12H)、鍵盤操作(INT16H)、系統(tǒng)自舉(INT19H)、系統(tǒng)設(shè)備配置測(cè)試(INT11H)、讀/寫系統(tǒng)時(shí)鐘(INT1AH)等,每類中斷包含多個(gè)子功能,調(diào)用時(shí)通過(guò)功能號(hào)指定。表4.3特殊功能鍵狀態(tài)
4.4匯編語(yǔ)言的數(shù)據(jù)與表達(dá)式
4.4.1常用的運(yùn)算符
1.算術(shù)運(yùn)算符
算術(shù)運(yùn)算符有
+、-、
、/
和MOD。其中MOD是指除法運(yùn)算后所得到的余數(shù)。
算術(shù)運(yùn)算符可以用于數(shù)值表達(dá)式或地址表達(dá)式中,但當(dāng)它用于地址表達(dá)式時(shí),只有當(dāng)其結(jié)果有明確的物理意義時(shí)才是有效的結(jié)果。例如兩個(gè)地址相乘和相除的運(yùn)算是無(wú)意義的。地址表達(dá)式中可以使用+或-,但也必須注意其物理意義,如把兩個(gè)不同段的地址相加也是無(wú)意義的。經(jīng)常使用的是“地址
±
數(shù)字量”,這是有意義的。
2.邏輯運(yùn)算符與移位運(yùn)算符
邏輯運(yùn)算符有AND、OR、XOR、NOT,移位運(yùn)算符有SHL和SHR。它們都是按位操作的,只能用于數(shù)值表達(dá)式中。
邏輯運(yùn)算符對(duì)其中的操作數(shù)作指定的邏輯運(yùn)算,這里的AND語(yǔ)句等價(jià)于:
AND AX, 1
移位操作的格式是:
expression SHL(或SHR) numshift
匯編程序?qū)xpression左移或右移numshift位,如移位數(shù)大于15,則結(jié)果為0。
3.關(guān)系運(yùn)算符
關(guān)系運(yùn)算符有EQ(相等)、NE(不等)、LT(小于)、LE(小于或等于)、GT(大于)、GE(大于或等于)六種。關(guān)系運(yùn)算的結(jié)果應(yīng)為邏輯值。結(jié)果為邏輯真,表示為0FFFFH;結(jié)果為邏輯假,則表示為0000H。例如:
MOVDL,10HGE16
其中的源操作數(shù)在匯編時(shí)由匯編程序進(jìn)行關(guān)系運(yùn)算。根據(jù)運(yùn)算可知,10H不小于16,其關(guān)系不成立,結(jié)果為0。故指令執(zhí)行后,DL中的值為0。
4.?dāng)?shù)值回送操作符
數(shù)值回送操作符主要有TYPE、LENGTH、SIZE、OFFSET、SEG等。這些操作符把一些特征或存儲(chǔ)器地址的一部分作為數(shù)值回送。
1)類型回送操作符TYPE
格式:
TYPE expression
功能:如果該表達(dá)式是變量,則匯編程序?qū)⒒厮驮撟兞康囊宰止?jié)表示的類型DB、DW、DD,分別對(duì)應(yīng)變量的類型屬性1、2、4;如果表達(dá)式是標(biāo)號(hào),則匯編程序?qū)⒒厮痛碓摌?biāo)號(hào)類型的數(shù)值,NEAR為-1,F(xiàn)AR為-2。如果表達(dá)式為常數(shù),則應(yīng)回送0。
2)偏移回送操作符OFFSET
格式:
OFFSET variable(或lable)
功能:匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的偏移地址。
3)?SEG
格式:
SEG variable(或lable)
功能:匯編程序?qū)⒒厮妥兞炕驑?biāo)號(hào)的段地址值。
4)
LENGTH
格式:
LENGTH變量
功能:匯編程序?qū)⒒厮陀蒁UP定義的變量的單元數(shù),其他情況回送1,也即LENGTH用來(lái)計(jì)算一個(gè)存儲(chǔ)區(qū)中(變量用DUP時(shí))的單元數(shù)目,單元可以是字節(jié)、字或者雙字等。若變量中未使用DUP,則LENGTH回送1。
5)?SIZE
格式:
SIZE變量
功能:匯編程序回送分配給該變量的總字節(jié)數(shù),為L(zhǎng)ENGTH和TYPE值的乘積。例如,若變量ABC的存儲(chǔ)區(qū)是用偽指令“ABCDW100DUP(?)”來(lái)定義的,即存儲(chǔ)區(qū)中有100個(gè)字單元,也即有200個(gè)字節(jié)單元,那么
TYPEABC等于2;
LENGTHABC等于100;
SIZEABC等于200。
5.屬性操作符
1)?PTR操作符
格式:
typePTRexpression
其中,type表示所賦予的新的類型屬性,expression是被取代類型的符號(hào)地址。
功能:PTR用來(lái)更改一些已經(jīng)規(guī)定了類型的存儲(chǔ)單元的類型,即給已分配的存儲(chǔ)地址賦予另一種屬性,使該地址具有另一種類型。
有時(shí)指令要求使用PTR操作符用來(lái)顯式地指出操作的類型是字節(jié)、字或雙字等,從而使匯編程序分清是什么類型的操作。
2)?SEG段操作符
該操作符用來(lái)表示一個(gè)標(biāo)號(hào)、變量或地址表達(dá)式的段屬性,比如用段前綴指定某段的地址操作數(shù)。
格式:
段寄存器:地址表達(dá)式
3)?THIS操作符
格式:
THISattribute
THIStype
功能:它可以像PTR一樣建立一個(gè)指定類型(BYTE、WORD、DWORD)的或指定距離(NEAR、FAR)的地址操作數(shù),該操作數(shù)的段地址和偏移地址與下一個(gè)存儲(chǔ)單元的地址相同。
4)字節(jié)分離操作符HIGH和LOW
字節(jié)分離操作符接收一個(gè)數(shù)或地址表達(dá)式,HIGH取其高位字節(jié),LOW取其低位字節(jié)。4.4.2運(yùn)算符的優(yōu)先級(jí)
匯編程序在匯編表達(dá)式時(shí),應(yīng)該首先計(jì)算優(yōu)先級(jí)高的運(yùn)算符,然后從左到右地對(duì)優(yōu)先級(jí)相同的運(yùn)算符進(jìn)行計(jì)算。括號(hào)可以改變計(jì)算次序,且括號(hào)內(nèi)的表達(dá)式應(yīng)優(yōu)先計(jì)算。運(yùn)算符的優(yōu)先級(jí)如表4.4所示,其中有些運(yùn)算符未提及,另請(qǐng)參見附錄或相關(guān)手冊(cè)。表4.4運(yùn)算符的優(yōu)先級(jí)
4.5順序程序結(jié)構(gòu)
無(wú)論是高級(jí)語(yǔ)言還是匯編語(yǔ)言,程序設(shè)計(jì)的過(guò)程大致是相同的,一般都要經(jīng)過(guò)問(wèn)題分析、算法確定、框圖表達(dá)、源程序編寫等過(guò)程。
程序的基本結(jié)構(gòu)有順序、循環(huán)、分支和子程序四種形式。在進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)根據(jù)功能需要綜合利用這些結(jié)構(gòu)構(gòu)成完整的程序。
順序程序結(jié)構(gòu)是指按照程序書寫的順序逐條執(zhí)行的指令序列,即邏輯執(zhí)行順序與書寫順序(存儲(chǔ))是一致的。
【例4.3】
讀下面的程序,指出程序的運(yùn)行結(jié)果。
4.6分支程序結(jié)構(gòu)
在實(shí)際應(yīng)用中,往往需要對(duì)出現(xiàn)的各種情況進(jìn)行分析判斷,以決定進(jìn)行不同的處理。這種分不同情況進(jìn)行不同處理的程序結(jié)構(gòu)就是分支程序結(jié)構(gòu)。常見的分支程序結(jié)構(gòu)有兩種,如圖4.6所示。圖4.6分支程序結(jié)構(gòu)示意圖兩種分支程序結(jié)構(gòu)的共同特點(diǎn)是:運(yùn)行方向是向前的,在某一種確定條件下,只能執(zhí)行多個(gè)分支中的一個(gè)分支。
匯編程序的分支一般用條件轉(zhuǎn)移指令來(lái)實(shí)現(xiàn)。例如:
【例4.4】
編寫計(jì)算如下分段函數(shù)值的程序。
設(shè)輸入數(shù)據(jù)為X、輸出數(shù)據(jù)為Y,且皆為字節(jié)變量。程序流程圖如圖4.7所示。圖4.7分支程序設(shè)計(jì)流程圖本例利用轉(zhuǎn)移指令不影響條件標(biāo)志的特性,連續(xù)地使用條件轉(zhuǎn)移指令使程序產(chǎn)生了三個(gè)不同的分支。在利用條件轉(zhuǎn)移實(shí)現(xiàn)分支轉(zhuǎn)移時(shí)要注意合理地設(shè)置條件,正確地選擇指令。
在實(shí)際應(yīng)用中,有時(shí)會(huì)碰到多分支程序結(jié)構(gòu)。多分支程序結(jié)構(gòu)相當(dāng)于一個(gè)多路開關(guān),有多個(gè)并行的分支程序段,每個(gè)分支程序段與一個(gè)條件相對(duì)應(yīng),執(zhí)行時(shí)只能執(zhí)行其中一個(gè)分支段。若用條件轉(zhuǎn)移語(yǔ)句實(shí)現(xiàn),則N條分支需要N-1個(gè)條件轉(zhuǎn)移指令完成,轉(zhuǎn)移速度慢,程序代碼長(zhǎng),因此常采用地址表的方法來(lái)實(shí)現(xiàn)。地址表的設(shè)計(jì)思想是:在程序段中開辟一些存儲(chǔ)空間,形成一張地址表,用于依次存放各分支程序段的程序入口地址。程序執(zhí)行時(shí),首先判斷出滿足某分支程序段的條件,由此求出該分支程序段的編號(hào)。該編號(hào)乘2(段內(nèi)轉(zhuǎn)移),或乘4(段間轉(zhuǎn)移)得到相對(duì)地址表的偏移量,再加上地址表首地址,即得到地址表中的一個(gè)地址。也就是說(shuō),在這個(gè)地址表中存放著各個(gè)分支程序段的偏移地址(或偏移地址+段地址),轉(zhuǎn)到該地址去執(zhí)行程序,即執(zhí)行該分支程序段。
【例4.5】
設(shè)計(jì)一個(gè)程序段,要求根據(jù)鍵盤輸入的數(shù)字1~9轉(zhuǎn)向9個(gè)不同的處理程序段。
分析:在數(shù)據(jù)段定義一個(gè)存儲(chǔ)區(qū),形成一張地址表,用來(lái)存放9個(gè)程序段的起始地址。將鍵盤輸入的1~9數(shù)字符轉(zhuǎn)換為真值,用于查表得到偏移地址;若輸入非法字符則提示出錯(cuò)。
程序流程圖如圖4.8所示。圖4.8多分支結(jié)構(gòu)程序流程圖這種多分支結(jié)構(gòu)的實(shí)現(xiàn)也稱為跳躍表法。它用于實(shí)現(xiàn)CASE結(jié)構(gòu),使程序根據(jù)不同的條件轉(zhuǎn)移到多個(gè)程序分支中的一個(gè)去執(zhí)行。
地址表是由各路分支入口地址按序排列組成的表,它存放在數(shù)據(jù)段。表基址即表格的第一個(gè)數(shù)據(jù)單元的首地址,本例中表基址為BASE。地址表的每一個(gè)表項(xiàng)均是入口標(biāo)號(hào),占兩個(gè)字節(jié)。表內(nèi)偏移地址是表項(xiàng)地址到表基址之間的距離即其位移量,據(jù)分支號(hào)可以計(jì)算出其位移量:
轉(zhuǎn)移地址=表基址+表內(nèi)位移量=BASE+2×序號(hào)=TAB+2×(number-1)
4.7循環(huán)程序結(jié)構(gòu)
程序中的某些部分需要重復(fù)執(zhí)行,如果將重復(fù)部分反復(fù)地書寫,會(huì)使程序顯得冗長(zhǎng)。但若將程序中的重復(fù)執(zhí)行部分構(gòu)成循環(huán)結(jié)構(gòu),則這樣設(shè)計(jì)的程序既美觀又便于修改。循環(huán)結(jié)構(gòu)有兩種形式,如圖4.9所示。一種是每次測(cè)試循環(huán)控制條件,如果滿足條件,則重復(fù)執(zhí)行循環(huán)體;否則結(jié)束,退出循環(huán)。另一種是先執(zhí)行循環(huán)體,然后測(cè)試循環(huán)控制條件,如果滿足條件,則重復(fù)執(zhí)行循環(huán)體;否則結(jié)束,退出循環(huán)。圖4.9循環(huán)結(jié)構(gòu)的兩種方式不論哪一種結(jié)構(gòu)形式,循環(huán)程序均由三部分組成。
(1)循環(huán)初始化部分:為開始循環(huán)準(zhǔn)備必要的條件,如設(shè)置循環(huán)次數(shù)的計(jì)數(shù)值、設(shè)置循環(huán)初始化地址,以及為循環(huán)體正常工作而建立的初始狀態(tài)等。
(2)循環(huán)體部分:指重復(fù)執(zhí)行的程序部分,由循環(huán)的工作部分及參數(shù)修改部分組成。循環(huán)的工作部分是為完成程序功能而設(shè)計(jì)的主要程序段。循環(huán)的參數(shù)修改部分是為避免程序原地踏步,保證每一次重復(fù)(循環(huán))時(shí),參加執(zhí)行的信息能發(fā)生有規(guī)律變化而建立的程序段,它為下次循環(huán)能正確地執(zhí)行而做參數(shù)的修改。
(3)循環(huán)控制條件部分:判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán),以控制循環(huán)何時(shí)結(jié)束,它是循環(huán)程序設(shè)計(jì)的關(guān)鍵。每一個(gè)循環(huán)程序必須選擇一個(gè)循環(huán)控制條件來(lái)控制循環(huán)的運(yùn)行和結(jié)束。合理地選擇該控制條件是循環(huán)程序設(shè)計(jì)的關(guān)鍵。
常用的循環(huán)控制方法有計(jì)數(shù)循環(huán)和條件循環(huán)兩種:
(1)計(jì)數(shù)循環(huán)。計(jì)數(shù)循環(huán)利用循環(huán)次數(shù)作為控制條件,這是最簡(jiǎn)單和典型的循環(huán)。當(dāng)循環(huán)次數(shù)已知時(shí),用LOOP很容易實(shí)現(xiàn)這類程序。若循環(huán)次數(shù)已知且有可能使用其他特征或條件來(lái)使循環(huán)提前結(jié)束,則此時(shí)可用LOOPZ或LOOPNZ指令來(lái)實(shí)現(xiàn)。只要將循環(huán)次數(shù)或最大循環(huán)次數(shù)送入CX寄存器,就可以開始循環(huán)體,最后用LOOP指令對(duì)CX減1并判斷是否為0。
(2)條件循環(huán)。當(dāng)循環(huán)次數(shù)未知時(shí),就要根據(jù)具體情況用轉(zhuǎn)移指令判斷循環(huán)條件,找出控制循環(huán)結(jié)束的條件,這就是所謂的條件控制循環(huán)。轉(zhuǎn)移指令可以指定目的標(biāo)號(hào)來(lái)改變程序的運(yùn)行順序,如果標(biāo)號(hào)指向一個(gè)重復(fù)執(zhí)行的語(yǔ)句體的開始或結(jié)束,實(shí)際上便構(gòu)成了循環(huán)控制結(jié)構(gòu)。這時(shí),程序重復(fù)執(zhí)行該標(biāo)號(hào)至轉(zhuǎn)移指令之間的循環(huán)體。循環(huán)的控制條件是很靈活的,可能方案不止一種,應(yīng)分析比較選擇一種效率最高的方案來(lái)實(shí)現(xiàn)。
【例4.6】
編一個(gè)程序,將字單元BUF中所含1的個(gè)數(shù)存入COUNT單元中。
分析:要測(cè)出BUF字單元所含1的個(gè)數(shù),就應(yīng)逐位測(cè)試。一個(gè)比較簡(jiǎn)單的辦法是根據(jù)最高有效位是否為1來(lái)計(jì)數(shù),然后用移位的方法把各位數(shù)逐次移到最高位。循環(huán)的結(jié)束可以用計(jì)數(shù)值為16來(lái)控制,但更好的辦法是結(jié)合上述方法用測(cè)試數(shù)是否為0作為結(jié)束條件,這樣可以在很多情況下縮短程序的執(zhí)行時(shí)間。此外考慮到BUF本身為0的可能性,應(yīng)該采用WHILE結(jié)構(gòu)循環(huán)。根據(jù)以上分析,可以畫出如圖4.10所示的程序框圖。首先將BUF中的數(shù)送給寄存器AX,然后將AX寄存器邏輯左移一次,如果CF?=?1,則表明AX中的最高位為1,計(jì)數(shù)器CL計(jì)數(shù)1次;如果CF=0,表明AX最高位為0,……這樣依次將最高位移入CF中去測(cè)試。移位之后,判斷AX的值是否為0,如果為0,則結(jié)束循環(huán);不為0,則繼續(xù)循環(huán)。圖4.10循環(huán)結(jié)構(gòu)流程圖
【例4.7】
在以BUF為首地址的字存儲(chǔ)區(qū)中存放有N個(gè)有符號(hào)數(shù),現(xiàn)需將它們按由大到小的順序排列在BUF存儲(chǔ)區(qū)中,試編寫其程序。
分析:這里采用冒泡排序算法。從第一個(gè)數(shù)開始依次對(duì)相鄰兩個(gè)數(shù)進(jìn)行比較,如次序?qū)?,則不交換兩數(shù)位置;如次序不對(duì)則使這兩個(gè)數(shù)交換位置??梢钥闯?,第一遍需比較(N-1)次,此時(shí),最小的數(shù)已經(jīng)放到了最后;第二遍比較只需考慮剩下的(N-1)個(gè)數(shù),即只需比較(N-2)次;第三遍只需比較(N-3)次,……整個(gè)排序過(guò)程最多需(N-1)遍。下面的4個(gè)數(shù)即采用冒泡排序比較的例子。兩兩比較找到小者,每一遍比較后則把最小的放到最后面,經(jīng)過(guò)(N-1)遍比較后,則由大到小的次序排定,且每遍比較的次數(shù)遞減。
數(shù) 10 8 16 90 32
第一遍 10 16 90 32 8
第二遍 16 90 32 10 8
第三遍 90 32 16 10 8
程序流程圖如圖4.11所示。圖4.11冒泡排序算法的程序流程圖程序運(yùn)行后,BUF區(qū)中的內(nèi)容如下:
20,9,7,6,3,2,0,-4,-8,-9,-10
若要對(duì)N個(gè)無(wú)符號(hào)數(shù)按由大到小的順序排列,只需將指令“JGEL”改為“JAEL”即可。由上例可知,利用條件轉(zhuǎn)移指令作為循環(huán)控制條件,可以方便地構(gòu)造復(fù)雜的循環(huán)程序結(jié)構(gòu)。
4.8子?程?序?設(shè)?計(jì)
4.8.1子程序設(shè)計(jì)概述
常把具有獨(dú)立功能并具有一定通用性的程序段定義為子程序,供用戶使用。這種方法不僅可以簡(jiǎn)化主程序、實(shí)現(xiàn)模塊化,還可以重復(fù)利用已有的子程序,提高編程效率。子程序又稱為過(guò)程(procedure),它類似于高級(jí)語(yǔ)言中的過(guò)程和函數(shù)。
過(guò)程(子程序)定義偽指令的格式如下。
procedure_namePROCNEAR(FAR)
…
procedure_nameENDP一個(gè)過(guò)程是以PROC開始,以ENDP偽指令結(jié)束的。其中,過(guò)程名不能省略,并且過(guò)程的開始(PROC)和結(jié)束(ENDP)使用同一個(gè)過(guò)程名。過(guò)程名是這個(gè)子程序的名,它又是子程序入口的符號(hào)地址,也即子程序調(diào)用指令CALL的目標(biāo)操作數(shù)。它類似一個(gè)標(biāo)號(hào)的作用,由于子程序由偽指令來(lái)定義,故子程序名不需冒號(hào)說(shuō)明。子程序名也有3個(gè)屬性——段屬性、偏移屬性和類型屬性。子程序的類型屬性可以分為NEAR和FAR,默認(rèn)為NEAR屬性。為了方便應(yīng)用,80X86的匯編程序用PROC偽操作的類型屬性來(lái)確定CALL和RET指令的屬性,也就是說(shuō):
(1)?NEAR屬性:調(diào)用程序和子程序在同一代碼段中,屬于段內(nèi)調(diào)用。
(2)?FAR屬性:調(diào)用程序和子程序不在同一代碼段中,為段間調(diào)用。
每一個(gè)子程序的最后一條指令必定是返回指令RET。子程序有多種定義形式。
【例4.8】
子程序的結(jié)構(gòu)和使用。
程序如下:
CODE SEGMENT
...由于調(diào)用程序MAIN和子程序SUBR1是在同一代碼段中的,所以SUBR1定義為NEAR屬性。這樣,MAIN中對(duì)SUBR1的調(diào)用和SURB1中的RET就都是NEAR屬性的。但是通常MAIN應(yīng)定義為FAR屬性,因?yàn)槌绦虻闹鬟^(guò)程被看做DOS調(diào)用的一個(gè)子程序,因而DOS對(duì)MAIN的調(diào)用以及MAIN中的RET就是FAR屬性的。當(dāng)然,CALL和RET的屬性是由匯編程序確定的,用戶只需正確選擇PROC的屬性就可以了。
子程序定義可以嵌套,即一個(gè)過(guò)程定義中可以包含多個(gè)過(guò)程定義,但過(guò)程不能交叉。
上例程序段也可以改寫成如下形式:子程序允許嵌套和遞歸調(diào)用。主程序調(diào)用子程序,子程序還可以調(diào)用其他子程序,這就是子程序的嵌套調(diào)用。子程序可以多重嵌套調(diào)用。嵌套與遞歸調(diào)用時(shí)要注意堆??臻g的限制。
4.8.2子程序的參數(shù)傳遞
1.用寄存器傳遞參數(shù)
最簡(jiǎn)單和常用的參數(shù)傳遞方法是通過(guò)寄存器進(jìn)行的。用寄存器傳遞參數(shù)就是將子程序的入口參數(shù)和出口參數(shù)都放在約定的寄存器中。其優(yōu)點(diǎn)是信息傳遞快,編程也較方便,并且節(jié)省內(nèi)存單元。但由于寄存器個(gè)數(shù)有限,而且在處理過(guò)程中要經(jīng)常使用寄存器,如果要傳遞的參數(shù)很多,將導(dǎo)致無(wú)空閑寄存器供編程用,所以此法只適用于要傳遞的參數(shù)較少的情況。
【例4.9】
設(shè)ARRAY是一個(gè)含有N個(gè)字節(jié)元素的數(shù)組,試用子程序計(jì)算各數(shù)組元素的“累加和”。(為了簡(jiǎn)化程序設(shè)計(jì),這里不考慮溢出。)
分析:我們用子程序來(lái)完成求數(shù)組元素的累加和,主程序需要向它提供入口參數(shù),使得子程序能夠訪問(wèn)數(shù)組元素。子程序需要將求和結(jié)果這個(gè)出口參數(shù)傳給主程序。本例采用寄存器進(jìn)行參數(shù)的傳遞。
寄存器和存儲(chǔ)單元分配如下:BX用來(lái)存放數(shù)組首地址;CX用來(lái)存放數(shù)組元素個(gè)數(shù);AL用來(lái)存放數(shù)組元素累加和;RESULT
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 財(cái)報(bào)中的資產(chǎn)質(zhì)量評(píng)估與優(yōu)化策略
- 跨境B2B平臺(tái)的供應(yīng)鏈管理運(yùn)營(yíng)研究
- 建筑電氣控制技術(shù)趙建偉60課件
- 6.1《學(xué)無(wú)止境》教學(xué)設(shè)計(jì) - 2024-2025學(xué)年統(tǒng)編版道德與法治九年級(jí)下冊(cè)
- 現(xiàn)代辦公軟件的進(jìn)化與效能提升
- 建設(shè)工程招標(biāo)標(biāo)底的編制方法和程序?qū)W習(xí)情境二建設(shè)工程招標(biāo)課件
- 興安職業(yè)技術(shù)學(xué)院《企業(yè)經(jīng)營(yíng)決策沙盤模擬》2023-2024學(xué)年第二學(xué)期期末試卷
- 華北電力大學(xué)《音樂(lè)學(xué)科教學(xué)理論與方法(1)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025甘肅順路通機(jī)動(dòng)車管理有限公司招聘2人筆試參考題庫(kù)附帶答案詳解
- 廣東理工學(xué)院《圖形設(shè)計(jì)提煉與表達(dá)》2023-2024學(xué)年第二學(xué)期期末試卷
- 鐵路信號(hào)基礎(chǔ)設(shè)備維護(hù)(第二版) 課件 項(xiàng)目一 信號(hào)繼電器檢修
- 江蘇省南京市2024年中考英語(yǔ)試題(含解析)
- 2025年匯成集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 《礦山機(jī)械》課件
- 湖南長(zhǎng)沙自貿(mào)投資發(fā)展集團(tuán)有限公司招聘筆試沖刺題2024
- 電力安全工作規(guī)程考試試題題庫(kù)
- 2024年抗菌藥物培訓(xùn)試題及答案
- UL1026標(biāo)準(zhǔn)中文版-2019家用電飯煲和食品服務(wù)用具第六版
- 《佛跳墻英文介紹》課件
- 2024糖尿病腎病指南
- 基于大數(shù)據(jù)分析的5G網(wǎng)絡(luò)安全態(tài)勢(shì)感知系統(tǒng)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論