




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
匯編語(yǔ)言程序設(shè)計(jì)movax,12hcalldisplayJmp1234h主要內(nèi)容:匯編語(yǔ)言源程序的結(jié)構(gòu)匯編語(yǔ)言語(yǔ)句格式偽指令功能調(diào)用匯編語(yǔ)言程序設(shè)計(jì)3.1 匯編語(yǔ)言源程序
機(jī)器語(yǔ)言——二進(jìn)制數(shù)形式的指令和數(shù)據(jù)。
B064是什么意思?這就是機(jī)器語(yǔ)言。既不直觀,又不易理解和記憶.MOVAL,64H
;容易記憶理解,這就是助記符。
助記符——用便于記憶的英語(yǔ)單詞表示的指令操作碼。它反映了指令的功能和主要特征,便于人們理解和記憶。
操作數(shù)可能放在存儲(chǔ)器中,這就涉及操作數(shù)的地址。程序中遇到轉(zhuǎn)移指令或調(diào)用指令,也需要知道轉(zhuǎn)移地址,若采用具體地址就很不方便,一旦有錯(cuò),改動(dòng)也很麻煩。于是人們采用標(biāo)號(hào)或符號(hào)來(lái)代替地址,例:
LP1:mov
ax,VAR…loopLP1
匯編語(yǔ)言——指令助記符,符號(hào)地址,標(biāo)號(hào),偽指令等語(yǔ)言元素的集合以及這些元素使用的規(guī)則。用匯編語(yǔ)言編寫(xiě)的程序叫匯編語(yǔ)言源程序。指令除了操作碼以外,還有一個(gè)操作數(shù)問(wèn)題。匯編程序源程序的編譯程序匯編程序匯編語(yǔ)言源程序機(jī)器語(yǔ)言目標(biāo)程序匯編源程序需翻譯成機(jī)器語(yǔ)言,變成可執(zhí)行文件,機(jī)器才能執(zhí)行,這個(gè)翻譯過(guò)程叫匯編?!呒?jí)語(yǔ)言中稱該過(guò)程為“解釋”或“編譯”。執(zhí)行翻譯的程序稱為“匯編程序”。匯編語(yǔ)言程序設(shè)計(jì)與執(zhí)行過(guò)程輸入?yún)R編語(yǔ)言源程序源文件.ASM匯編(編譯)目標(biāo)文件.OBJ鏈接可執(zhí)行文件.EXE調(diào)試最終程序3.1.1.匯編語(yǔ)言源程序的結(jié)構(gòu)
匯編語(yǔ)言源程序通常由一個(gè)或幾個(gè)程序模塊組成,每個(gè)模塊一般由三個(gè)邏輯段組成:數(shù)據(jù)段——存放數(shù)據(jù)、變量堆棧段——堆棧區(qū)域代碼段——存放程序指令一個(gè)基本的匯編語(yǔ)言程序框架如下:
stack
SEGMENTPARA‘stack‘DB100DUP(‘stack’)
stackENDS
dataSEGMENT
<數(shù)據(jù)、變量在此定義>
dataENDS
codeSEGMENTASSUMECS:code,DS:data,ES:data
start:MOVAX,dataMOVDS,AXMOVES,AX
<此處加入你自己的程序段>MOVAL,4CHINT21H
code
ENDSEND
start
堆棧段數(shù)據(jù)段代碼段3.1.2匯編語(yǔ)言的語(yǔ)句與格式匯編語(yǔ)言的語(yǔ)句有兩種:指令性語(yǔ)句——由8086指令助記符構(gòu)成的語(yǔ)句指示性語(yǔ)句——由偽指令構(gòu)成的語(yǔ)句指令性語(yǔ)句的格式為:
標(biāo)號(hào):
指令助記符
目的操作數(shù),源操作數(shù)
;注釋
指示性語(yǔ)句的格式為:
名字
偽指令
操作數(shù)1,操作數(shù)2,…,操作數(shù)n
;注釋
注:各部分之間至少要用一個(gè)空格作為分隔符。●指令性語(yǔ)句由CPU執(zhí)行,每一條指令性語(yǔ)句都有一條機(jī)器碼指令與其對(duì)應(yīng);
●指示性語(yǔ)句由匯編程序執(zhí)行。它指出匯編程序應(yīng)如何對(duì)源程序進(jìn)行匯編,如何定義變量、分配存儲(chǔ)單元以及指示程序開(kāi)始和結(jié)束等。指示性語(yǔ)句無(wú)機(jī)器碼指令與其相對(duì)應(yīng)。
指令性語(yǔ)句匯編時(shí)生成機(jī)器碼;
指示性語(yǔ)句匯編時(shí)不生成機(jī)器碼。語(yǔ)句的構(gòu)成元素:標(biāo)號(hào)——指令的符號(hào)地址,用來(lái)代表指令在存儲(chǔ)器中的地址。只能出現(xiàn)在指令性語(yǔ)句中,標(biāo)號(hào)后應(yīng)加上冒號(hào)。名字——段、過(guò)程、變量的名字,用來(lái)代表它們?cè)诖鎯?chǔ)器中的地址。只能出現(xiàn)在指示性語(yǔ)句中,名字后不加冒號(hào)。指令助記符——8086助記符、偽指令操作數(shù)——即指令的操作對(duì)象對(duì)指令性語(yǔ)句——0,1,2個(gè)對(duì)指示性語(yǔ)句——根據(jù)需要而定操作數(shù)之間以逗號(hào)分隔操作數(shù)可以是:寄存器、存儲(chǔ)單元、常數(shù)或表達(dá)式
例如:AX,[DI+BX+10],200,16*8+TABLE,等等注釋——以分號(hào)開(kāi)頭,可放在指令后,也可單獨(dú)一行。
注意注解的寫(xiě)法。要寫(xiě)指令(段)在程序中的作用,而不要寫(xiě)指令的操作。例如:以下為同一條指令寫(xiě)的注釋
1)MOVCX,100;傳送100到CX2)MOVCX,100;循環(huán)計(jì)數(shù)器置初值顯然,第二種寫(xiě)法要比第一種寫(xiě)法要好。
匯編語(yǔ)言的一個(gè)實(shí)例:hello.asm
dataSEGMENTHelloDB‘Hello,world!’,0DH,0AH,’$’dataENDSprogSEGMENT
ASSUME
CS:prog,DS:datastart:MOVAX,dataMOVDS,AX
LEADX,hello
;取字符串首地址
MOVAH,9INT21H ;顯示字符串
MOVAH,4CHINT21H ;退回DOSprogENDSENDstart名字標(biāo)號(hào)
3.1.3數(shù)據(jù)項(xiàng)與表達(dá)式數(shù)據(jù)項(xiàng)包括常量、變量、標(biāo)號(hào)及表達(dá)式。1.常量二進(jìn)制數(shù),以B結(jié)尾。如01001101B。十進(jìn)制數(shù),如85。十六進(jìn)制數(shù),以H結(jié)尾。第1個(gè)數(shù)字為A-F時(shí),前面應(yīng)加0,如0F160H。字符串:用引號(hào)括起來(lái)的1個(gè)或多個(gè)字符。如‘ERROR!’,’a’,匯編時(shí)被翻譯成對(duì)應(yīng)的ASCII碼45H,52H,52H,4FH,52H,21H和61H。有三個(gè)屬性:
段地址:即標(biāo)號(hào)所在段的段地址;
偏移量:標(biāo)號(hào)所代表存儲(chǔ)單元的段內(nèi)偏移地址;
類型:NEAR或FAR:
NEAR—表示標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令/
調(diào)用指令在同一碼段內(nèi),跳轉(zhuǎn)時(shí)只需改變IP即可。
FAR—標(biāo)號(hào)所在語(yǔ)句與轉(zhuǎn)移指令/調(diào)用指令不在同一代碼段內(nèi)。
若沒(méi)有對(duì)類型進(jìn)行說(shuō)明,默認(rèn)為NEAR。標(biāo)號(hào)通常作為轉(zhuǎn)移指令或CALL指令的轉(zhuǎn)移地址。2.標(biāo)號(hào)——指令所在內(nèi)存單元的符號(hào)地址變量——即內(nèi)存中的存儲(chǔ)單元或數(shù)據(jù)區(qū)。變量名——是存儲(chǔ)單元(數(shù)據(jù)區(qū))的符號(hào)地址或名字。變量也有三個(gè)屬性:段地址—變量所在段的段地址偏移量—變量單元地址與段首地址之間的位移量。類型—有BYTE、WORD和DWORD三種。變量在程序中作為存儲(chǔ)器操作數(shù)被引用。3.變量標(biāo)號(hào)和變量名的使用規(guī)則組成:A-Z(不分大小寫(xiě)),0-9,?@
._$不能以數(shù)字開(kāi)頭,句號(hào)(.)只能作為首字符長(zhǎng)度小于31個(gè)字符不能與保留字(指令助記符、偽指令、預(yù)定義符號(hào)等)重名不能重復(fù)定義例如:
正確的:LP1,AGAIN,NEXT,_GO,OK_1
錯(cuò)誤的:4M,LOOP,AAA,#HELP,+ONE4.表達(dá)式表達(dá)式是常數(shù)、寄存器、標(biāo)號(hào)、變量與運(yùn)算符的組合。有數(shù)字表達(dá)式和地址表達(dá)式兩種。匯編時(shí)按優(yōu)先規(guī)則對(duì)表達(dá)式進(jìn)行計(jì)算,計(jì)算出具體的數(shù)值或地址。運(yùn)行時(shí)不能改變。表達(dá)式中的運(yùn)算符有6類:算術(shù)、邏輯、關(guān)系、取地址、屬性、雜類。用于數(shù)字表達(dá)式,例:
MOVAX,4*1024匯編后的形式為:MOVAX,4096用于地址表達(dá)式,例:LEASI,TAB+3若TAB的偏移地址為1000H,則匯編后的形式為:
LEASI,[1003H]1)算術(shù)運(yùn)算符——+、-、*、/,MOD邏輯運(yùn)算符只能用于數(shù)字表達(dá)式中。例:MOV CL,36HAND0FH
經(jīng)匯編后:MOVCL,06H注意,不要把邏輯運(yùn)算符與邏輯運(yùn)算指令混淆:例:ANDAX,3FC0HAND0FF00H
匯編后源操作數(shù)被翻譯為:3F00H,所以上述指令與ANDAX,3F00H等價(jià)。2)邏輯運(yùn)算符——AND、OR、XOR、NOT關(guān)系運(yùn)算的結(jié)果是一個(gè)邏輯值:真或假關(guān)系為真,結(jié)果為全1
關(guān)系為假,結(jié)果為全0例:MOVBX,PORTGT300H
若PORT的值大于300H,則匯編后為:
MOVBX,0FFFFH
否則匯編后為:
MOVBX,03)關(guān)系運(yùn)算符——EQ、NE、LT、GT、LE、GESEG:取變量/標(biāo)號(hào)的段地址OFFSET:取變量/標(biāo)號(hào)的偏移地址例:VARDB12H ……MOVBX,OFFSET VAR;取變量VAR的偏移地址
MOVAX,SEGVAR;取變量VAR的段地址注意,以下指令的異同:
MOVBX,OFFSETVARLEABX,VAROFFSET只能取靜態(tài)的偏移地址;LEA指令即可取靜態(tài)的偏移地址,也可取動(dòng)態(tài)的偏移地址。4)取地址運(yùn)算符——SEG、OFFSETTYPE取變量的類型(1,2,4)LENGTH取所定義變量的長(zhǎng)度(即變量中元素的個(gè)數(shù))SIZE取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)
(=TYPE*LENGTH)例:VARDW1,2,3,4,5
則TYPEVAR=2LENGTHVAR=5SIZEVAR=105)取值運(yùn)算符——TYPE、LENGTH、SIZE6)屬性運(yùn)算符——PTR用來(lái)指定地址操作數(shù)的類型。格式:<類型>PTR<地址操作數(shù)>
類型∈{BYTE,WORD,DWORD,NEAR,FAR}BYTE、WORD、DWORD
用于描述數(shù)據(jù)存儲(chǔ)單元(變量)地址NEAR、FAR
用于描述轉(zhuǎn)移、調(diào)用的目的地址例:MOV BYTEPTR[DI],0;字節(jié)類型
MOV WORDPTR[DI],0;字類型
MOV [DI],0B5H;類型不定PTR也可用來(lái)進(jìn)行強(qiáng)制類型轉(zhuǎn)換例:STR1DW? ;STR1定義為字類型
MOV AX,STR1;合法
MOV AL,STR1;非法
MOVAL,BYTEPTRSTR1;合法3.2偽指令數(shù)據(jù)定義偽指令符號(hào)定義偽指令段定義和段寄存器指定偽指令過(guò)程定義偽指令結(jié)束偽指令由匯編程序執(zhí)行的指令,它本身不被匯編成機(jī)器指令。常用的偽指令有:3.2.1數(shù)據(jù)定義偽指令用于定義變量,即內(nèi)存單元或數(shù)據(jù)區(qū)。數(shù)據(jù)定義偽指令的格式為:變量名數(shù)據(jù)定義偽指令操作數(shù),操作數(shù),…常用的數(shù)據(jù)定義偽指令有如下幾種:
DB定義字節(jié)
DW定義字
DD定義雙字操作數(shù)可以是常數(shù)、變量或表達(dá)式例1:DATA_BDB10,5,10HDATA_WDW100H,-4DATA_DDD0FFFBH匯編后的內(nèi)存分配情況如右圖所示。05H10H00H01HFCHFFHFBHFFH00H00H0AHQDATA_BDATA_WDATA_D10510H100H-40FFFBH例2:操作數(shù)可以是字符串,例如
STRDB ‘HELLO’匯編后的情況如圖:STR‘H’‘E’‘L’‘L’‘O’注意下面兩個(gè)定義的不同之處:DB ‘AB’ ;41H在低字節(jié),42H在高字節(jié)DW‘AB’;42H在低字節(jié),41H在高字節(jié)48H45H4CH4CH4FH操作數(shù)?用來(lái)保留存儲(chǔ)空間,但不存入數(shù)據(jù).例3:ABCDB0,1,2,3,4,’OK’,’$’RSVDW?,?,?,?,?,?,?,?復(fù)制操作符DUP:重復(fù)的數(shù)據(jù)可以使用復(fù)制操作符DUP,如上面RSV亦可寫(xiě)成:RSVDW8DUP(?)若操作數(shù)中若使用$,則表示的是地址計(jì)數(shù)器的當(dāng)前值。例:TABLEDB10DUP(?)BUFFERDWTABLE,$+3設(shè)TABLE的偏移地址為0080H,則匯編后如下圖所示:BUFFER0080H80HTABLE008AH008BH008CH008DH...8FH00H00H0089H10Bytes3.2.2符號(hào)定義偽指令把一個(gè)表達(dá)式用一個(gè)符號(hào)表示,以后凡出現(xiàn)該表達(dá)式的地方都可用這個(gè)符號(hào)表示。類似于C語(yǔ)言中的#define。符號(hào)定義偽指令有兩種:EQU,=用EQU定義的符號(hào)未清除前,不能重新定義。清除EQU定義可用PURGE偽指令。用”=”定義的符號(hào)可在任何時(shí)候進(jìn)行重定義。二者均不占用存儲(chǔ)空間,僅是給符號(hào)賦值例:FIVEEQU5
COUNTEQUCX
TENEQU10
DIST=BYTEPTR[SI+BP]
GOTO=JMP…MOVAX,TENMOVCX,COUNTADDDIST,FIVE
DIST=WORDPTR[SI+BP+1]ADDDIST,AX
GOTOLABEL定義引用3.2.3段定義偽指令匯編語(yǔ)言程序是按段來(lái)組織程序和數(shù)據(jù)的。和存儲(chǔ)器的物理段相對(duì)應(yīng),匯編語(yǔ)言程序中的段稱為邏輯段。匯編連接后被映射到物理段中。三類段:代碼(程序)、數(shù)據(jù)、堆棧段定義偽指令:SEGMENT、ENDS、ASSUME、ORG定義一個(gè)段的基本格式:
段名
SEGMENT
[定位類型][組合方式][類別]
<匯編語(yǔ)言語(yǔ)句>
段名
ENDS這兩個(gè)偽指令總是成對(duì)出現(xiàn),二者前面的段名應(yīng)一致。SEGMENT說(shuō)明了一個(gè)段的開(kāi)始,ENDS說(shuō)明了一個(gè)段的結(jié)束。對(duì)數(shù)據(jù)段和堆棧段,段中的語(yǔ)句一般是變量定義。對(duì)代碼段則是指令語(yǔ)句。如:codeSEGMENT<指令語(yǔ)句>codeENDSSEGMENT和ENDS偽指令A(yù)SSUME偽指令在代碼段中,還必須明確段和段寄存器的關(guān)系,這由ASSUME語(yǔ)句來(lái)指定。如
ASSUMECS:code,DS:data,ES:data
語(yǔ)句中的code和data為段名。這個(gè)語(yǔ)句說(shuō)明:
1.CS將指向名字為code的代碼段
2.DS和ES將指向名字為data的數(shù)據(jù)段但要注意,ASSUME偽指令只是告知匯編程序有關(guān)段寄存器與段的關(guān)系,并沒(méi)有給段寄存器賦予實(shí)際的初值。故下面的語(yǔ)句
MOV AX,DATAMOV DS,AXMOV ES,AX將段基址裝入段寄存器。如果程序中用到堆棧段,則SS也需裝入實(shí)際的初值。代碼段基地址不需要程序員裝入CS寄存器,而由OS負(fù)責(zé)裝入。SEGMENT語(yǔ)句后可以帶有可選參數(shù),用以規(guī)定邏輯段的其他一些屬性。1)定位類型說(shuō)明如何確定邏輯段的邊界。有四種:PARA(Paragraph):
邏輯段從一個(gè)節(jié)(16個(gè)字節(jié))的邊界開(kāi)始。即段的起始地址應(yīng)能被16整除,或這說(shuō)段起始物理地址應(yīng)為××××0H?!J(rèn)類型BYTE:
邏輯段從字節(jié)邊界開(kāi)始,即段可以從任何地址開(kāi)始。WORD:
邏輯段從字邊界開(kāi)始。即段的起始地址必須是偶數(shù)。PAGE:
邏輯段從頁(yè)邊界開(kāi)始。256字節(jié)稱為一頁(yè),故段的起始物理地址應(yīng)為×××00H。
2)組合類型說(shuō)明不同模塊中同名段的組合方式。PUBLIC :所有此類型的同名段組合成一個(gè)邏輯段,公用一個(gè)段地址,運(yùn)行時(shí)裝入同一個(gè)物理段中。COMMON:所有此類型的同名段具有相同的起始地址(覆蓋),共享相同的存儲(chǔ)區(qū)域。AT<數(shù)值表達(dá)式>:按絕對(duì)地址定位,段地址就是表達(dá)式的值。STACK:專用于說(shuō)明堆棧段,組合方式同PUBLIC3)類別用單引號(hào)括起來(lái)的字符串。所有同類別的段被安排在連續(xù)的存儲(chǔ)區(qū)域中。如:在模塊1中有段定義:
seg1SEGMENTPARASTACK‘stack’…seg1ENDS
在模塊2中有段定義:
seg2SEGMENTPARASTACK‘stack’…seg2ENDS則連接時(shí)這兩個(gè)段被安排在一起。ORG規(guī)定了段內(nèi)的指令或數(shù)據(jù)存放的開(kāi)始地址(偏移地址的初值),其格式為:
ORG<表達(dá)式>表達(dá)式的值即為開(kāi)始地址,從此地址起連續(xù)存放程序或數(shù)據(jù)。例:ABCSEGMENTORG100Hbegin:……ABCENDSORG偽指令指令從100H開(kāi)始存放匯編結(jié)束偽指令END
該偽指令表示源程序的結(jié)束.令匯編程序停止匯編。因此,任何一個(gè)完整的源程序均應(yīng)有END指令。一般格式:END[表達(dá)式]其中表達(dá)式表示該匯編程序的啟動(dòng)地址。例如:ENDSTART;表明該程序的啟動(dòng)地址為START。3.4匯編語(yǔ)言程序設(shè)計(jì)3.4.1匯編語(yǔ)方程序設(shè)計(jì)步驟3.4.2順序程序3.4.3分支程序3.4.4循環(huán)程序3.4.5子程序返回本章首頁(yè)3.4.1匯編語(yǔ)方程序設(shè)計(jì)步驟1.分析問(wèn)題2.確定算法3.設(shè)計(jì)程序流程圖4.分配內(nèi)存單元5.編寫(xiě)匯編語(yǔ)言源程序6.調(diào)試程序返回本節(jié)3.4.2順序程序 順序程序是一種最簡(jiǎn)單,最基本的程序。特點(diǎn):程序按編寫(xiě)的順序依次往下執(zhí)行每一條指令,直到最后一條?!纠?.17】編制一程序,求出下列公式中x=2時(shí),Y的值,=6x4+3x3+5x2+8x+10。解:1)由于本題運(yùn)算的結(jié)果大于256,故采用字運(yùn)算。2)為方便運(yùn)算,可對(duì)上式變形為
Y={[(6x+3)x+5]x+8}x+10
DATA SEGMENT Xdw2 Ydw0DATA ENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,X ;X→AX MOVBX,X ;X→BX MOVCX,6 ;CX=6
MULCX ;AX·CX=6X→AX
ADDAX,3 ;AX+3→AX=(6X+3) MULBX ;AX·BX→AX=X·(6X+3) ADDAX,5 ;AX+5→AX=X·(6X+3)+5 MULBX ;AX·BX→AX=X(X(6X+3)+5) ADDAX,8 ;AX+8→AX=X(X(6X+3)+5)+8 MULBX ;AX·BX→AX=X(X(X(6X+3)+5)+8) ADDAX,10 ;AX+10→AX=X(X(X(6X+3)+5)+8)+10 MOVY,AX ;AX→Y MOVAH,4CH INT21H CODEENDSEND START
順序程序設(shè)計(jì)
【例3.18】
用查表的方法將一位十六進(jìn)制數(shù)轉(zhuǎn)換成它相應(yīng)的ASCII碼。解:算法分析1)0~9數(shù)字對(duì)應(yīng)的ASCII碼為30H~39H,A~F對(duì)應(yīng)的ASCII碼為41H~46H,按從小到大順序?qū)?~F的ASCII碼存入TABLE表中。2)待轉(zhuǎn)換數(shù)0AH存入HEX1中。3)表首地址加上待轉(zhuǎn)換數(shù)所對(duì)應(yīng)的ASCII碼存儲(chǔ)單元地址為所求的ASCII碼。
程序如下:DATA SEGMENT TABLEDB30H,31H,32H,33H,34H,35H,36H,37H,
DB38H,39H,41H,42H,43H,44H,45H,46H,
HEX1DB0AH ASC1DB?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVBX,OFFSETTABLE MOVAH,0 MOVAL,HEX1 XLAT MOVASC1,AL MOVAH,4CH INT21HCODE ENDS ENDSTART3.4.3分支程序 1.分支程序的基本形式分支程序有三種基本形式,如圖4-3所示。分支程序的設(shè)計(jì)要點(diǎn)如下:(1)先建立可供條件轉(zhuǎn)移指令測(cè)試的條件。(2)選用合適的條件轉(zhuǎn)移指令。(3)在轉(zhuǎn)移的目的地址處設(shè)定標(biāo)號(hào)。條件滿足?AYN(a)條件滿足?ABNY(b)(c)A0A1AnK=0K=1…K=nK=?……分支程序結(jié)構(gòu)流程圖
1.簡(jiǎn)單分支結(jié)構(gòu)
例[3.19]變量X中為一任意有符號(hào)字節(jié)數(shù),若X為負(fù)數(shù),則將其取補(bǔ)碼,否則和Y變量相加并將和放在AX中。解:算法分析1)當(dāng)X<0時(shí),則求補(bǔ)碼。2)當(dāng)X>=0時(shí),X與Y相加,其和放在AX中。
DATA SEGMENT XDB6 YDB2DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVAH,0 MOVAL,X CMPAL,AH JGELP1 NEGAL MOVX,AL JMPLP2LP1: ADDAL,Y ADCAH,0LP2: MOVAH,4CH INT21HCODE ENDS
ENDSTART
【例3.20】求符號(hào)函數(shù),設(shè)X在-128~+127之間。解:算法分析
1)當(dāng)X>0時(shí),Y單元為1。
2)當(dāng)X<0時(shí),Y單元為0FFH。
3)當(dāng)X=0時(shí),Y單元為0。
DATA SEGMENT XDB10H YDB?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVAL,X MOVAH,0 CMPAL,AH JLSMALL JZSAVE1 INCAH JMPSAVE1SMALL: MOVAH,OFFHSAVE1: MOVY,AH MOVAH,4CH INT21HCODE ENDS ENDSTART
【例3.21】計(jì)算1+2+3+…+100的和。解:算法分析
1)通過(guò)分析,得出該數(shù)列為等差數(shù)列,前項(xiàng)比后項(xiàng)少1。
2)用AX累加器放和,初值為0;BX寄存器為數(shù)列項(xiàng)(1,2,3,…,100)。
3)AX+BX→AX累加100次,CX存放累加次數(shù),初值為100,遞減到0為止。
程序如下:CODE SEGMENT ASSUMECS:CODESTART: MOVAX,0 MOVBX,1 MOVCX,100ADD1:
ADDAX,BX INCBX DECCX JNZADD1 MOVAH,4CH INT21HCODE ENDS ENDSTART此題算法可簡(jiǎn)化:不用BX,以CX兼作數(shù)列項(xiàng).
2.多分支結(jié)構(gòu)在高級(jí)語(yǔ)言中,利用CASE語(yǔ)句實(shí)現(xiàn)多分支程序結(jié)構(gòu),匯編語(yǔ)言中可利用跳轉(zhuǎn)表實(shí)現(xiàn)多分支結(jié)構(gòu)。所謂跳轉(zhuǎn)表,就是在某一內(nèi)存區(qū)域順序排列的一組有規(guī)律的轉(zhuǎn)移目標(biāo)的入口地址。【例3.22】試根據(jù)AL寄存器中某一位狀態(tài)(為“1”)將程序轉(zhuǎn)移到8個(gè)相應(yīng)的分支中的一個(gè)。解:假設(shè)8個(gè)分支程序的偏移地址為L(zhǎng)1~L8,根據(jù)要求當(dāng)AL寄存器的第Di(i=0~7)位為1,跳轉(zhuǎn)到(i+1)分支。
數(shù)據(jù)段的跳轉(zhuǎn)表為DATA SEGMENTTABLE DWL1,L2,L3,L4,L5,L6,L7,L8DATA ENDS …………. LEABX,TABLEB1: SHRAL,1 JNCNOT1 JMPB1 ………….L1: ……L2: ……NOT1..…..【例3.23】以例3.21來(lái)說(shuō)明循環(huán)程序的應(yīng)用。解:例3.21是用分支結(jié)構(gòu)來(lái)實(shí)現(xiàn)循環(huán)的,現(xiàn)用循環(huán)指令來(lái)實(shí)現(xiàn),結(jié)構(gòu)既簡(jiǎn)單又清晰。程序如下:
MOVAX,0;初始部分
MOVBX,1 MOVCX,100ADD1:ADDAX,BX;循環(huán)體
INCBX;修改部分
LOOPADD1;控制部分3.4.4循環(huán)程序 1.循環(huán)程序的結(jié)構(gòu)(如圖3-19所示)☆循環(huán)程序一般包括如下四個(gè)部分:(1)初始化(2)循環(huán)體(3)循環(huán)控制(4)結(jié)束☆循環(huán)程序按結(jié)構(gòu)形式,有單重循環(huán)與多重循環(huán)。(a)當(dāng)型循環(huán)結(jié)構(gòu)(b)直到型循環(huán)結(jié)構(gòu)循環(huán)結(jié)束?循環(huán)體YN初始化修改循環(huán)參數(shù)結(jié)束部分開(kāi)始結(jié)束循環(huán)結(jié)束?循環(huán)體Y初始化修改循環(huán)參數(shù)結(jié)束部分開(kāi)始N結(jié)束
循環(huán)結(jié)構(gòu)程序流程圖
3.4.4循環(huán)程序設(shè)計(jì)
【例3.24】求一個(gè)長(zhǎng)為N的ARRAY字?jǐn)?shù)組中正數(shù)、負(fù)數(shù)與零的個(gè)數(shù),正數(shù)的個(gè)數(shù)存放在DI中,負(fù)數(shù)的個(gè)數(shù)存放在BX中,零的個(gè)數(shù)存放在DX中。解:算法分析1)用計(jì)數(shù)控制循環(huán)。因循環(huán)次數(shù)已知,將數(shù)組長(zhǎng)度送到CX中作為循環(huán)控制次數(shù)。2)將數(shù)組ARRAY中的每個(gè)元素分別與“0”進(jìn)行比較,大于0為正數(shù),DI加1;小于0為負(fù)數(shù),BX中加1;根據(jù)N-DI-BX求得等于0的個(gè)數(shù)。
3.4.4循環(huán)程序設(shè)計(jì)
程序如下:DATA SEGMENTARRAYDW2,3,4,-5,8,0,20,-88,0,100,-40,99N
DW
($-ARRAY)/2DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA
MOVDS,AX
MOVCX,N
MOVBX,0
MOV
DI,0
MOVSI,0
3.4.4循環(huán)程序設(shè)計(jì)
NEXT: CMPARRAY[SI],0 JLELESS1 INCDI;正數(shù),DI+1 JMPLOP1LESS1:JZLOP1 INCBX;負(fù)數(shù),BX+1LOP1: ADDSI,2 LOOPNEXT MOVDX,N SUBDX,DI SUBDX,BX;0的個(gè)數(shù),N-DI-BX MOVAH,4CH INT21HCODE ENDS
ENDSTART
3.4.4循環(huán)程序設(shè)計(jì)
【例3.25】試編制求小于1000的最大的斐波那契數(shù)及其對(duì)應(yīng)項(xiàng)數(shù)的程序。將計(jì)算出的斐波那契數(shù)送入變量VAR中,項(xiàng)數(shù)送入ITEM中。解:算法分析1)已知循環(huán)條件為1000,當(dāng)小于1000時(shí)繼續(xù)求斐波那契數(shù),若大于1000結(jié)束循環(huán),所以采用條件控制循環(huán)方式。2)A1=0,A2=1,A3=A1+A2,…,Ai=Ai-2+Ai-1。3)將計(jì)算結(jié)果送到VAR和ITEM單元中。
3.4.4循環(huán)程序設(shè)計(jì)
程序如下:DATA SEGMENT VARDW?
ITEMDB2DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,0 MOVCX,1 MOVBX,1000LOP: ADDAX,CX CMPAX,BX JAEDONE XCHGAX,CX INCITEM JMPLOPDONE:MOVVAR,CX MOVAH,4CH INT21HCODE ENDS ENDSTART
3.4.4循環(huán)程序設(shè)計(jì)
【例3.26】已知數(shù)據(jù)段中有兩個(gè)長(zhǎng)度為8字節(jié)的數(shù)組,編程計(jì)算下列式子。Z1=X1-Y1 Z2=X2×Y2 Z3=X3×Y3Z4=X4-Y4 Z5=X5×Y5 Z6=X6-Y6Z7=X7-Y7 Z8=X8×Y8解:算法分析1)上述計(jì)算式子中有乘法、減法,循環(huán)體中的運(yùn)算不同,故采用邏輯尺控制法。設(shè)對(duì)應(yīng)二進(jìn)制為“1”表示做乘法,為“0”表示做減法。邏輯尺控制為10010110。2)用右移指令來(lái)判斷是做乘法還是做減法。3)每次計(jì)算結(jié)果存到相應(yīng)Z數(shù)組中。
3.4.4循環(huán)程序設(shè)計(jì)
程序如下:DATA SEGMENT XDBX1,X2,X3,X4,X5,X6,X7,X8 YDBY1,Y2,Y3,Y4,Y5,Y6,Y7,Y8 ZDW8DUP(?)
RDB10010110BDATA ENDSCODE SEGMENT ASSUMCS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVCX,8 MOVSI,0 MOVDI,0 MOVBL,R
3.4.4循環(huán)程序設(shè)計(jì)
D0: MOVAL,X[SI]
SHRBL,1 JNCOTHER;根據(jù)CF跳轉(zhuǎn) MOVAH,0 MULY[SI];乘法
JMPSAVEOTHER:MOVAH,0 SUBAL,Y[SI]
SBBAH,0;減法SAVE:MOVZ[DI],AX INCSI ADDDI,2 LOOPD0 MOVAH,4CH INT21HCODE ENDS ENDSTART外循環(huán)中循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)外循環(huán)內(nèi)循環(huán)內(nèi)循環(huán)(a)嵌套正確(b)嵌套正確(c)交叉不正確多重循環(huán)示意圖2.多重循環(huán)在多重循環(huán)中,只允許外重循環(huán)嵌套內(nèi)重循環(huán)。不允許循環(huán)相互交叉,也不允許從循環(huán)程序的外部跳入循環(huán)程序的內(nèi)部
3.4.4循環(huán)程序設(shè)計(jì)
【例3.27】編程統(tǒng)計(jì)一個(gè)字?jǐn)?shù)組中各元素所含有二進(jìn)制位為1的個(gè)數(shù)及所有元素中1的個(gè)數(shù)之總和(數(shù)組全部由非零元素組成)。解:算法分析1)一個(gè)字元素有16位二進(jìn)制,統(tǒng)計(jì)1的位數(shù)需用移位指令移位16次,N個(gè)字元素需統(tǒng)計(jì)N×16次,顯然,統(tǒng)計(jì)一個(gè)字元素中含1的位數(shù)作為內(nèi)循環(huán),N個(gè)字元素作為外循環(huán),最后得到N個(gè)字元素所有二進(jìn)制為1的位數(shù)總和。2)分工:內(nèi)循環(huán)負(fù)責(zé)統(tǒng)計(jì)一個(gè)字元素中含1的位數(shù);外循環(huán)負(fù)責(zé)每個(gè)字元素中為1的位的個(gè)數(shù)的累加,并取下一個(gè)元素為再次內(nèi)循環(huán)統(tǒng)計(jì)作準(zhǔn)備。統(tǒng)計(jì)結(jié)果存到相應(yīng)的存儲(chǔ)單元中。
3.4.4循環(huán)程序設(shè)計(jì)
程序如下:DATA SEGMENT ARRAYWDW200,502,106,600,800 LENEQU($-ARRAYW)/2 NUMDBLENDUP(?)
TOTADB?
DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEASI,ARRAYW ;數(shù)組首址送SI寄存器
LEADI,NUM ;將存統(tǒng)計(jì)個(gè)數(shù)緩沖區(qū)的首址送DI MOVCX,LENLOP1: MOVAX,[SI] ;取數(shù)組元素
MOVBL,0LOP2: CMPAX,0 JENEXT SHRAX,1 ;邏輯右移一次,判斷該位是否為0 JNCNO_CNT INCBL
3.4.4循環(huán)程序設(shè)計(jì)
NO_CNT:JMPLOP2NEXT: MOV[DI],BL ;存各元素對(duì)應(yīng)的統(tǒng)計(jì)“0”的位數(shù)
ADDSI,2 INCDI LOOPLOP1 ;外循環(huán)控制
LEABX,NUM MOVCX,LEN MOVAL,0COUNT:ADDAL,[BX]
INCBX LOOPCOUNT MOVTOTA,AL MOVAH,4CH INT21HCODE ENDS ENDSSTATR3.4.5子程序
1.子程序概念所謂調(diào)用子程序,暫時(shí)中斷主程序的執(zhí)行,而轉(zhuǎn)到子程序的入口地址去執(zhí)行子程序。如圖所示。調(diào)用子程序應(yīng)注意:(1)子程序占用的存儲(chǔ)單元和寄存器。(2)參數(shù)的傳遞。(3)子程序經(jīng)過(guò)調(diào)用后得到的數(shù)據(jù)來(lái)完成程序之間的參數(shù)傳遞。
(4)嵌套調(diào)用與遞歸調(diào)用。如圖4-11RETCALLpro1子程序的調(diào)用與返回CALLARETRETCALLB子程序的嵌套調(diào)用與返回
3.4.5子程序設(shè)計(jì)
1.子程序結(jié)構(gòu)形式一般子程序以子程序文件形式存在,子程序文件由說(shuō)明文件和子程序本身構(gòu)成。子程序說(shuō)明文件主要有:1)功能描述,包括程序的名稱、功能、性能指標(biāo)。2)所用的寄存器、存儲(chǔ)單元及其說(shuō)明。3)子程序的入口、出口參數(shù)說(shuō)明。4)子程序中又調(diào)用的其他子程序的說(shuō)明。
3.4.5子程序設(shè)計(jì)
子程序一般包含以下幾部分內(nèi)容:①保護(hù)現(xiàn)場(chǎng)。保護(hù)和恢復(fù)現(xiàn)場(chǎng)是主程序和子程序所使用的硬件資源發(fā)生沖突的解決方法。由于機(jī)器中的寄存器和存儲(chǔ)單元是有限的,主程序和子程序又是相對(duì)獨(dú)立、分開(kāi)編制的,不可避免地會(huì)使用到同一個(gè)或多個(gè)寄存器或存儲(chǔ)單元,從而使調(diào)用前后的寄存器或存儲(chǔ)單元的內(nèi)容被修改,導(dǎo)致主程序無(wú)法繼續(xù)運(yùn)行的致命錯(cuò)誤。保護(hù)和恢復(fù)現(xiàn)場(chǎng)一般有如下兩種方法。
3.4.5子程序設(shè)計(jì)
在子程序中進(jìn)行保護(hù),其形式如下:SUB1 PROC PUSHAX PUSHBX PUSHCX PUSHDX …….
POPDX POPCX POPBX POPAX RETSUB1 ENDP
3.4.5子程序設(shè)計(jì)
在主程序中進(jìn)行保護(hù),其形式如下:
…….. PUSHAX PUSHBX PUSHCX PUSHDX CALLSUB1 POPDX POPCX POPBX POPAX ………..
3.4.5子程序設(shè)計(jì)
②從入口參數(shù)中取得所需的數(shù)據(jù)。③執(zhí)行子程序,這里還可再調(diào)用其他子程序本身(子程序嵌套或遞歸)。④將處理后的數(shù)據(jù)傳送到出口參數(shù)中。⑤恢復(fù)現(xiàn)場(chǎng)用POP指令,方法見(jiàn)①。⑥返回調(diào)用程序,用RET指令來(lái)完成。
3.4.5子程序設(shè)計(jì)
子程序調(diào)用和返回是由主程序中的CALL指令和子程序中的RET指令來(lái)完成的,其結(jié)構(gòu)格式如下:
CODE SEGMENT ……….. MAIN PROCFAR ……….. CALLSUB1 ………. RET SUB1 PROCNEAR ………. RET SUB1 ENDP MAIN ENDP CODE ENDS
上述結(jié)構(gòu)說(shuō)明主程序和子程序在同一代碼段中。注意,調(diào)用程序和過(guò)程在同一代碼段中則使用NEAR屬性;
3.4.5子程序設(shè)計(jì)
調(diào)用過(guò)程和過(guò)程不在同一代碼段中則使用FAR屬性說(shuō)明,其結(jié)構(gòu)如下:
CODE1 SEGMENT ….. MAIN PROCFAR ….. CALL SUB1 ….. RET MAIN ENDPS CODE1 ENDS …..
CODE2 SEGMENT SUB1 PROCNEAR ….. RET SUB1 ENDP CODE2 ENDS
3.4.5子程序設(shè)計(jì)
2.主程序與子程序之間的參數(shù)傳送主程序與子程序之間的參數(shù)傳送通過(guò)以下3種方法來(lái)實(shí)現(xiàn):1)用寄存器傳送:寄存器傳送快,只適用于參數(shù)較少的場(chǎng)合。2)用存儲(chǔ)單元傳送:適用于傳送參數(shù)多的情況,其缺點(diǎn)是需占用一定的存儲(chǔ)單元,對(duì)提高內(nèi)存的利用率是不利的。3)用堆棧傳送:堆棧傳送參數(shù)是最佳的方法,因?yàn)樗梢噪S時(shí)釋放數(shù)據(jù)占用的內(nèi)存空間,傳送的參數(shù)可多可少,下面通過(guò)兩個(gè)例子加以說(shuō)明。
3.4.5子程序設(shè)計(jì)
【例3.28】將一組有符號(hào)字?jǐn)?shù)組ARRAY按從大到小排序,利用寄存器傳送參數(shù)。解:算法分析1)采用冒泡法,相鄰兩元素進(jìn)行比較排序2)根據(jù)上述排序過(guò)程分析得出:N個(gè)元素需比較I=N-1輪,每一輪中比較N-I(I=1,2,3,…,N-1)次,從中可以看出外循環(huán)與內(nèi)循環(huán)的關(guān)系。將比較過(guò)程作為子程序SORT,使用DX寄存器傳送參數(shù)。3)CX寄存器中存放了內(nèi)、外循環(huán)次數(shù),通過(guò)對(duì)CX內(nèi)容的壓棧與出棧來(lái)切換內(nèi)、外循環(huán)控制次數(shù),以達(dá)到雙重循環(huán)的目的。DX作為控制內(nèi)循環(huán)比較次數(shù)相當(dāng)與上述過(guò)程中的I,即CX(N)-DX(I)。
3.4.5子程序設(shè)計(jì)
程序如下:
DATA
SEGMENT
ARRAY
DW8,5,16,84,32
LEN
DW5
COUNTDW1
DATA
ENDS
CODE
SEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVCX,LEN
DECCX
MOVDX,1
LOP1:
CALLSORT
INCDX ;子程序名:SORT
LOOPLOP1
;功能:數(shù)組排序
MOVAH,4CH
;入口參數(shù):計(jì)數(shù)值為DX,數(shù)組長(zhǎng)度為L(zhǎng)EN
INT21H
;出口參數(shù):DX作為內(nèi)循環(huán)控制參數(shù)
3.4.5子程序設(shè)計(jì)
SORT
PROC
PUSH
AX
PUSH
BX
PUSH
CX
;保護(hù)現(xiàn)場(chǎng)
MOV
CX,LEN
SUB
CX,DX
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- α-Pyrrolidinocyclohexanophenone-hydrochloride-生命科學(xué)試劑-MCE
- MAT2A-IN-21-生命科學(xué)試劑-MCE
- EGFR-IN-145-生命科學(xué)試劑-MCE
- 科技產(chǎn)業(yè)變革的經(jīng)濟(jì)影響分析
- 電動(dòng)汽車電池技術(shù)推動(dòng)商業(yè)創(chuàng)新的引擎
- 社區(qū)勞動(dòng)教育與商業(yè)文化傳承的實(shí)踐
- 電商平臺(tái)在農(nóng)產(chǎn)品銷售中的創(chuàng)新?tīng)I(yíng)銷策略
- 物流運(yùn)輸中貨物的包裝設(shè)計(jì)與生產(chǎn)管理探討
- 科技產(chǎn)業(yè)園區(qū)多企業(yè)合作模式探討
- 電商平臺(tái)的品牌形象塑造與市場(chǎng)競(jìng)爭(zhēng)力提升
- 2025年初中主題班會(huì)課件:好習(xí)慣成就好人生
- 學(xué)校教職工代表大會(huì)全套會(huì)議會(huì)務(wù)資料匯編
- 新部編版小學(xué)六年級(jí)下冊(cè)語(yǔ)文第二單元測(cè)試卷及答案
- 2025年山東傳媒職業(yè)學(xué)院高職單招高職單招英語(yǔ)2016-2024歷年頻考點(diǎn)試題含答案解析
- 《中醫(yī)基礎(chǔ)理論》課件-中醫(yī)學(xué)理論體系的基本特點(diǎn)-整體觀念
- 2025年廣東省深圳法院招聘書(shū)記員招聘144人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年人教版新教材數(shù)學(xué)一年級(jí)下冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- 2025年春西師版一年級(jí)下冊(cè)數(shù)學(xué)教學(xué)計(jì)劃
- 課題申報(bào)書(shū):“四新”視域下地方高校學(xué)科建設(shè)與人才培養(yǎng)研究
- 企業(yè)員工退休管理規(guī)章制度(3篇)
- 中國(guó)干眼臨床診療專家共識(shí)(2024年)解讀
評(píng)論
0/150
提交評(píng)論