版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1微機(jī)原理與接口技術(shù)2第四章匯編語(yǔ)言程序設(shè)計(jì)匯編語(yǔ)言程序格式偽指令語(yǔ)句DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用程序設(shè)計(jì)方法宏匯編和條件匯編內(nèi)容提要3計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言一般分為機(jī)器語(yǔ)言、匯編語(yǔ)言和高級(jí)語(yǔ)言三種?!鴧R編語(yǔ)言(AssemblyLanguage)指令的助記符+符號(hào)地址+標(biāo)號(hào)是機(jī)器語(yǔ)言的符號(hào)表示,是較低級(jí)的語(yǔ)言?!呒?jí)語(yǔ)言:可讀性好,編程簡(jiǎn)單;
▲匯編語(yǔ)言:實(shí)時(shí)性能好,程序效率高,節(jié)省內(nèi)存,運(yùn)行速度快。第四章宏匯編語(yǔ)言程序設(shè)計(jì)——概述
4.1概述4匯編程序的開(kāi)發(fā)過(guò)程操作得到的文件
操作使用的工具
說(shuō)明:編輯程序連接程序匯編程序文件XXX.ASMLINKASMMASMTASM記事本W(wǎng)PSWORDEDIT文件
XXX.OBJXXX.LSTXXX.CRF文件
XXX.EXEXXX.MAPXXX.LIBDEBUG出錯(cuò)出錯(cuò)出錯(cuò)出錯(cuò).OBJ:目標(biāo)文件,.LST:列表文件,.CRF:交叉引用文件.MAP:映像文件,LIB:庫(kù)文件54.2匯編語(yǔ)言格式DATA SEGMENTSTRING DB ‘HELLOWORLD!’,0DH,0AH,‘$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATABEGIN: MOV AX,DATA
MOV DS,AX ;初始化數(shù)據(jù)段的段地址 MOV AH,09H LEA DX,STRING;輸出字符串 INT 21H MOV AH,4CH INT 21H;調(diào)用4CH號(hào)系統(tǒng)功能返回DOSCODE ENDS END BEGIN數(shù)據(jù)段代碼段一個(gè)簡(jiǎn)單的8086系統(tǒng)下的匯編語(yǔ)言程序:1、匯編語(yǔ)言程序是由若干個(gè)段組成,段由若干條語(yǔ)句組成。3、程序以END結(jié)束。64.2匯編語(yǔ)言格式語(yǔ)句是匯編語(yǔ)言程序的基本組成單位。匯編語(yǔ)言有3種基本語(yǔ)句類型:指令語(yǔ)句、偽指令語(yǔ)句和宏指令語(yǔ)句。指令語(yǔ)句由CPU執(zhí)行,可產(chǎn)生機(jī)器代碼,CPU根據(jù)這些代碼才能執(zhí)行相應(yīng)的操作。偽指令語(yǔ)句由編譯器處理,為編譯和連接提供控制信息,不產(chǎn)生機(jī)器代碼。宏指令語(yǔ)句以一個(gè)宏名定義的一段指令序列,在匯編中凡是出現(xiàn)宏指令語(yǔ)句的地方,都會(huì)有相應(yīng)的指令語(yǔ)句序列的目標(biāo)代碼插入。74.2匯編語(yǔ)言格式指令語(yǔ)句
[標(biāo)號(hào):]指令助記符[操作數(shù),操作數(shù)][;注釋]例如:movcx,8;2操作數(shù)指令
s:nop;0操作數(shù)指令(nop空操作)loops;1操作數(shù)指令偽指令語(yǔ)句
[名字]偽指令助記符參數(shù),參數(shù)…[;注釋]例如:data1db0,1,2;數(shù)據(jù)定義偽指令DB,在內(nèi)存中定義
;3個(gè)連續(xù)的字節(jié)單元,初值是0,1,2;data1表示第一個(gè)數(shù)據(jù)0的偏移地址84.3匯編語(yǔ)言的基本數(shù)據(jù)匯編語(yǔ)言程序的語(yǔ)句中包含的元素:字符集保留字與標(biāo)識(shí)符常量、變量與標(biāo)號(hào)表達(dá)式及運(yùn)算符9一、字符集允許使用的字符:字母,包括大寫(xiě)字母A~Z和小寫(xiě)字母a~z;數(shù)字,包括0~9;特殊字符,包括:+-*/=()[]<>;,‘“.—:?@$&及空格、制表符、回車、換行等。注意:除了字符串,字母都是不區(qū)分大小寫(xiě)一系列相連的空格、制表符效果相當(dāng)于一個(gè)空格一系列相連的回車換行相當(dāng)于一次回車換行分號(hào)“;”后一直到行尾的內(nèi)容都是注釋字符“&”若用于某行的開(kāi)頭,則表示該行是上一行的續(xù)行10二、保留字與標(biāo)識(shí)符1、保留字 在匯編語(yǔ)言中有特定意義的詞,可分為:指令助記符及指令前綴
如:MOV、ADD、REP等寄存器名 如:AX、EBX、CL等偽指令助記符
如:DB、SEGMENT等其他保留字,包括運(yùn)算符、操作符等 如:EQ、LT、OFFSET、SEG等112、標(biāo)識(shí)符標(biāo)識(shí)符是程序員自己起的名字,如變量名、標(biāo)號(hào)、段名、過(guò)程名等標(biāo)識(shí)符的命名規(guī)則:標(biāo)識(shí)符必須由字母、數(shù)字和幾個(gè)特殊字符(包括_@$?:)組成,而且第一個(gè)字符不能是數(shù)字(否則可能與16進(jìn)制的數(shù)字混淆)標(biāo)識(shí)符不能與某個(gè)保留字相同,以免混淆。盡量用有意義的英文單詞或縮寫(xiě)來(lái)命名,以增加程序的可讀性12三、常量、變量與標(biāo)號(hào)1、常量數(shù)字常量二進(jìn)制:以B結(jié)尾,如10101010B八進(jìn)制:以Q結(jié)尾,如123Q,67Q十進(jìn)制:以D結(jié)尾,“D”可省略,如1234D,5678十六進(jìn)制:以H結(jié)尾,A~F開(kāi)頭的數(shù)須在前面加“0”
如:1234H,0FFFFH字符串常量用單引號(hào)或雙引號(hào)引起來(lái)的一個(gè)或多個(gè)ASCII字符每個(gè)字符的值等于其ASCII碼值例:‘A’=41H一個(gè)字節(jié),‘12’=31H、32H兩個(gè)字節(jié)132、變量變量是存放在存儲(chǔ)器中的操作數(shù)可通過(guò)變量的名字來(lái)訪問(wèn)變量變量具有三個(gè)屬性:段屬性,即變量所在的段的基地址;偏移量屬性,即變量相對(duì)于段的起始地址的偏移量;類型屬性,包括BYTE(字節(jié))、WORD(字)、DWORD(雙字)FWORD(6字節(jié))、QWORD(四字)、TBYTE(10字節(jié))等。143、標(biāo)號(hào)標(biāo)號(hào)是一條指令性語(yǔ)句的起始地址變量具有三個(gè)屬性:段屬性,即變量所在的段的基地址;偏移量屬性,即變量相對(duì)于段的起始地址的偏移量;類型屬性,包括NEAR(近程,即段內(nèi))、FAR(遠(yuǎn)程,即段間)15四、表達(dá)式及運(yùn)算符由常量、變量、標(biāo)號(hào)和一些運(yùn)算符、操作符構(gòu)成的式子表達(dá)式的值在匯編的過(guò)程中就已經(jīng)被匯編程序計(jì)算出來(lái)運(yùn)算符的分類:算術(shù)運(yùn)算符邏輯運(yùn)算符關(guān)系運(yùn)算符屬性運(yùn)算符數(shù)值返回操作符161、算術(shù)運(yùn)算符五種算術(shù)運(yùn)算: 加:+、減:-、乘:*、除:/、模:MOD合法地址表達(dá)式:地址-地址(處在同個(gè)段中);地址±常數(shù)ADDR1-ADDR2(假設(shè)兩個(gè)地址處在同個(gè)段中)ADDR1+1ADDR2-2非法地址表達(dá)式:地址+地址;地址*地址;地址/地址;常量-地址;地址-地址(處在不同段中)ADDR1+ADDR2ADDR1*ADDR2ADDR1/2100-ADDR1SEG1_A-SEG2_B(假設(shè)兩個(gè)地址處在不同段中)172、邏輯運(yùn)算符五種算術(shù)運(yùn)算:
與AND、或OR、異或XOR、非NOT、邏輯左移SHL、邏輯右移SHR
只用于數(shù)字表達(dá)式中例:MOVAL,10101010BAND11001100B;AL←10001000BMOVAL,10001000BOR01000100B;AL←11001100BMOVAX,1000100010001000BXOR1100110011001100B ;AX←0100010001000100BMOVAX,NOT1010101010101010B ;AX←0101010101010101B183、關(guān)系運(yùn)算符六種關(guān)系運(yùn)算符:EQ(Equal,相等)NE(NotEqual,不等)LT(LessThan,小于)LE(LessthanorEqual,小于或等于)GT(GreatThan,大于)GE(GreatthanorEqual,大于或等于)運(yùn)算結(jié)果:關(guān)系為真,則運(yùn)算結(jié)果為0FFFFH關(guān)系為假,則運(yùn)算結(jié)果為0194、屬性運(yùn)算符(1)型重新指定操作符PTR功能: 臨時(shí)指定或修改存儲(chǔ)器操作數(shù)的數(shù)據(jù)類型屬性或地址類型屬性格式:類型PTR表達(dá)式例:VAR_WDW 1234HMOVAX,VAR_W;AX←1234HMOVAL,BYTEPTRVAR_W;AL←34H20(2)類型指定操作符THIS功能:指定或說(shuō)明變量或標(biāo)號(hào)的類型例1: DATA_WEQUTHISWORD DATA_BDB 1,2,3,4 MOV AL,DATA_B;AL←1 MOV AX,WORDPTRDATA_B;AL←0201H MOV AX,DATA_W;AL←0201H例2: ADDR_FEQUTHISFAR ADDR_N:MOVAX,1 JMPADDR_F;等價(jià)于:JMPFARPTRADDR_N215、數(shù)值返回操作符(1)SEG、OFFSET功能:SEG操作符用于求一個(gè)標(biāo)號(hào)或變量所在段的基地址OFFSET操作符則用于求標(biāo)號(hào)或變量在段中的地址偏移量例如,對(duì)于代碼段中的一條指令:2000H:1234HADDR:INCCX;段地址=2000H偏移量=1234H則有:MOVAX,SEGADDR;AX←2000HMOVAX,OFFSETADDR;AX←1234H;與指令“LEAAX,ADDR”等價(jià)22(2)TYPE、LENTH、SIZE功能:TYPE:求變量的數(shù)值類型屬性,即變量具有的字節(jié)數(shù)BYTE:返回1;WORD:返回2;DWORD:返回4;FWORD:返回6;QWORD:返回8,TBYTE:返回10;NEAR:返回0FFH;FAR:返回0FEHLENGTH:求變量所占用的內(nèi)存單元數(shù)用于由重復(fù)操作符DUP()定義的存儲(chǔ)器變量對(duì)于其他變量,LENGTH的返回值都是1SIZE:計(jì)算變量所占存儲(chǔ)器的總字節(jié)數(shù)關(guān)系:
SIZE=LENGTH×TYPE23例: DATA1DW1234H DATA2DB‘HELLO’ DATA3DD100DUP(0);表示定義100個(gè)值為0的雙字 MOVAL,TYPE DATA1 ;AL←2 MOVAL,TYPE DATA2 ;AL←1 MOVAL,TYPE DATA3 ;AL←4 MOVBL,LENGTHDATA1 ;BL←1 MOVBL,LENGTHDATA2 ;BL←1 MOVBL,LENGTHDATA3 ;BL←100 MOVCL,SIZE DATA1 ;CL←2×1=2 MOVCL,SIZE DATA2 ;CL←1×1=1 MOVCL,SIZE DATA3 ;CL←4×100=40024(3)字節(jié)分離運(yùn)算符HIGH、LOW功能:HIGH:分離一個(gè)字常量或一個(gè)地址表達(dá)式的高字節(jié)LOW:分離一個(gè)字常量或一個(gè)地址表達(dá)式的低字節(jié)例:只能用于常量或結(jié)果為常量的表達(dá)式ADDR1: MOVAL,HIGH1234H ;AL←12H MOVAL,LOWADDR1 ;AL←上一指令 ;地址偏移量的低8位不能用于變量或寄存器MOVBL,HIGHAX256、運(yùn)算符的優(yōu)先級(jí)表達(dá)式計(jì)算順序:先處理優(yōu)先級(jí)別高的運(yùn)算符對(duì)于優(yōu)先級(jí)相等的運(yùn)算符,則按從左至右的順序進(jìn)行處理優(yōu)先級(jí)順序:()、[](優(yōu)先級(jí)最高)LENGTH、SIZEPTR、THIS、SEG、OFFSET、TYPEHIGH、LOW*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT(優(yōu)先級(jí)最低)264.4偽指令一、偽指令(指示性語(yǔ)句)格式([]里的內(nèi)容可選): [名字]偽指令符操作數(shù),操作數(shù),……[;注釋]名字:變量名、段名等,與指令地址無(wú)關(guān),后面不能加冒號(hào)偽指令符:指定匯編程序要完成的具體操作操作數(shù):常量、變量或表達(dá)式等注釋:說(shuō)明、解釋當(dāng)前語(yǔ)句的作用27常用偽指令:處理器選擇偽指令數(shù)據(jù)定義偽指令,包括DB、DW、DD、DF、DQ、DT符號(hào)定義偽指令,包括EQU、“=”段定義偽指令SEGMENT、ENDS假定偽指令A(yù)SSUME地址對(duì)準(zhǔn)偽指令ORG過(guò)程定義偽指令PROC、ENDP源程序結(jié)束偽指令END282、數(shù)據(jù)定義偽指令功能:為變量分配存儲(chǔ)空間格式: [變量名]偽指令符操作數(shù),操作數(shù),……[;注釋]六種數(shù)據(jù)定義偽指令:DB(字節(jié)定義):每個(gè)操作數(shù)占1個(gè)字節(jié)DW(字定義):每個(gè)操作數(shù)占1個(gè)字,即2個(gè)字節(jié)DD(雙字定義):每個(gè)操作數(shù)的長(zhǎng)度為雙字,即4個(gè)字節(jié)DF(6字節(jié)定義):每個(gè)操作數(shù)的長(zhǎng)度為6個(gè)字節(jié)DQ(四字定義):每個(gè)操作數(shù)的長(zhǎng)度為四字,即8個(gè)字節(jié)DT(10字節(jié)定義):每個(gè)操作數(shù)的長(zhǎng)度為10個(gè)字節(jié)29例:可同時(shí)定義多個(gè)數(shù)據(jù):NUMDW12H,-1;定義2個(gè)字STRINGDB‘HELLO’,0DH,0AH;定義字符串省略變量名:BUFDB1,10,100 DB1;省略變量名 ;但該數(shù)據(jù)仍可通過(guò)“BUF+3”訪問(wèn)無(wú)初始化數(shù)據(jù)定義:用問(wèn)號(hào)“?”代替操作數(shù)BUFFERDB2,?,?,?;定義4個(gè)字節(jié) ;其中后3個(gè)字節(jié)不初始化30DUP操作符:格式: 重復(fù)的次數(shù)DUP(重復(fù)的內(nèi)容)例: ARRAY DB 3DUP(1,2) ;等價(jià)于:ARRAYDB1,2,1,2,1,2 BUF_W DW 100DUP(?) ;定義100個(gè)字,但不初始化DUP的嵌套使用: ARRAY2 DB 2DUP(1,3DUP(0)) ;等價(jià)于:ARRAY2DB1,0,0,0,1,0,0,031地址表達(dá)式作為操作數(shù):只能用DW、DD定義DW:變量/標(biāo)號(hào)的偏移量DD:變量/標(biāo)號(hào)的段地址和偏移量例: DATA1 DW ADDR1+1 ;把ADDR1偏移量加1后存放到DATA1對(duì)應(yīng)的存儲(chǔ)單元中 DATA2 DD DATA1 ;把DATA1的偏移量和段地址存放到DATA2對(duì)應(yīng)的存儲(chǔ)單 元中,其中偏移量放低地址,段地址放高地址。32地址計(jì)數(shù)器“$” “$”:表示到目前為止該段已經(jīng)使用的地址空間例1:
設(shè)VAR1地址偏移量為1000H,則:
VAR1 DB 100HDUP(?) 之后,$=1100H,因此: ADDR1 DW $ 等價(jià)于“ADDR1DW1100H”,也等價(jià)于“ADDR1DWADDR1”例2: STRINGDB‘ABC’ LEN DW$-STRING;LEN的值為STRING的長(zhǎng)度
數(shù)據(jù)段中首個(gè)變量的偏移量默認(rèn)為0.33例如:DATASEGMENTADB0,?,3BDW100,1200H,-5CDB‘A’,‘XY’DDW‘XY’EDW3,4466H,2DUP(1,0)DW1123H,0015HFDWCDATAENDS
343、符號(hào)定義偽指令(1)等價(jià)偽指令EQU格式: 符號(hào)名 EQU表達(dá)式功能: 為常量、表達(dá)式及其他各種符號(hào)定義一個(gè)別名例: NUM EQU12 ;給數(shù)值定義符號(hào)名 NUM2 EQUNUM+10 ;給12+10=22定義符號(hào)名 ADDR EQUDS:[BX+SI] ;給尋址表達(dá)式定義符號(hào)名 COUNT EQUCX ;給寄存器CX定義符號(hào)名 CLEAR EQUXORAX,AX ;給指令定義符號(hào)名35(2)解除偽指令PURGE格式: PURGE 符號(hào)名,符號(hào)名,……作用: EQU偽指令不能直接對(duì)一個(gè)符號(hào)名重定義,必須先用PURGE解除例: COUNT EQU CX PURGE COUNT
COUNT EQU CL
36(3)等號(hào)“=”偽指令格式: 符號(hào)名 = 表達(dá)式功能: 為常量、表達(dá)式及其他各種符號(hào)定義一個(gè)等價(jià)的符號(hào)名 允許對(duì)符號(hào)名多次重復(fù)定義,且以最后一次定義的值為準(zhǔn)例: CONST =1 ;給數(shù)值1定義符號(hào)名CONST ADDR =[BP+DI] ;給尋址表達(dá)式定義符號(hào)名ADDR CONST =0 ;重定義CONST374、段定義偽指令SEGMENT、ENDS格式:段名
segment[定位][組合][段字][‘類別’]….
段名ends
段的起始地址PAGEPARA(默認(rèn))WORDBYTE段間關(guān)系NONE(默認(rèn))PUBLICSTACK多個(gè)’類別’連續(xù)存放STACKCODEDATA38385、假定偽指令A(yù)SSUME格式:ASSUME 段寄存器:段名[,段寄存器:段名,……]功能:告訴匯編程序段與段寄存器的對(duì)應(yīng)關(guān)系例:DATA SEGMENTVAR1 DB ?DATA ENDSCODE SEGMENT
ASSUME CS:CODE,DS:DATABEGIN: ……ASSUME指令:假定CS為代碼段,DS為數(shù)據(jù)段39段寄存器的裝入偽指令assumecs:code,ds:data,ss:stack只是將cs、ds、ss和code、data、stack相連,并沒(méi)有給cs、ds、ss賦相應(yīng)的段地址CS的裝入
源程序結(jié)束定義偽指令:END標(biāo)號(hào) 每個(gè)源程序都必須以END偽指令結(jié)束例如:start:…endstartend后面的標(biāo)號(hào)start說(shuō)明了程序的入口,cpu的cs:ip將被設(shè)置指向這個(gè)入口。40段寄存器的裝入DS與ES的裝入①用ASSUME將DS/ES與相應(yīng)的段建立聯(lián)系②用數(shù)據(jù)傳送指令mov裝入段地址
MOV AX,段名
MOV DS/ES,AXSS的裝入(兩種辦法)第⑴種:在定義段時(shí),用組合類型STACK說(shuō)明
STACK1 SEGMENTPARASTACK DW20HDUP(0) STACK1 ENDS CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 ……41段寄存器的裝入第(2)種:SS的裝入(類似于DS/ES的方法) STACK1SEGMENT DW40HDUP(0)
TOP LABELWORD STACK1ENDS …… CODE SEGEMNT ASSUMECS:CODE,SS:STACK1 ……
MOVAX,STACK1 MOVSS,AX
MOVSP,OFFSETTOP ;SP=80H …… 427、地址對(duì)準(zhǔn)偽指令(1)ORG格式:ORG 數(shù)值表達(dá)式功能:用于指定下一個(gè)指令或數(shù)據(jù)在段內(nèi)的起始地址例:LAB1: PUSH AX ORG 2000HLAB2: MOV AL,34則LAB2的地址偏移量為2000H。439、過(guò)程定義偽指令PROC、ENDP功能:定義一個(gè)過(guò)程格式: 過(guò)程名 PROC [過(guò)程屬性] ……
返回指令RET 過(guò)程名 ENDP過(guò)程屬性:NEAR:缺省屬性,表示段內(nèi)調(diào)用/返回FAR:表示段間調(diào)用/返回4444§4-5匯編語(yǔ)言程序設(shè)計(jì)▲一個(gè)好的程序應(yīng)該具備的特點(diǎn):⑴程序結(jié)構(gòu)模塊化,程序易讀,易調(diào)試及維護(hù)。⑵執(zhí)行速度快。⑶占用內(nèi)存空間小。概述4545▲常用四種程序結(jié)構(gòu):順序結(jié)構(gòu),分支結(jié)構(gòu),循環(huán)結(jié)構(gòu),子程序結(jié)構(gòu)?!O(shè)計(jì)匯編語(yǔ)言源程序的基本步驟:⑴分析問(wèn)題:抽象數(shù)學(xué)模型,確定實(shí)現(xiàn)算法。⑵繪制程序流程圖粗框圖
細(xì)框圖。圖例如圖4-1所示。⑶分配存儲(chǔ)空間、工作單元:分配數(shù)據(jù)段、堆棧段、程序段的位置,確定寄存器主要作用。⑷編寫(xiě)程序⑸靜態(tài)檢查,上機(jī)調(diào)試⑹程序運(yùn)行,結(jié)果分析。464.5.1順序程序設(shè)計(jì)順序程序是指程序的結(jié)構(gòu)從開(kāi)始到結(jié)尾一直是順序執(zhí)行,中途沒(méi)有分支。順序程序的流程圖如圖4-4所示。47例4-10試編寫(xiě)程序計(jì)算表達(dá)式Z=(3X+Y-5)/2,設(shè)X、Y的值放在字變量VARX、VARY中,結(jié)果存放在VARZ中。算法分析:乘2n和除2n可以使用算術(shù)左移和右移實(shí)現(xiàn);其它非2n的乘除運(yùn)算可以用移位和加減組合運(yùn)算來(lái)實(shí)現(xiàn),如3X可以分解成2X+X。算法實(shí)現(xiàn):DATASEGMENTVARXDW5VARYDW10VARZDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,VARXSHLAX,1;2*XADDAX,VARX;3*XADDAX,VARY;3X+YSUBAX,5;3*X+Y-5SARAX,1;(3*X+Y-5)/2MOVVARZ,AX;存結(jié)果
MOVAH,4CHINT21HCODEENDSENDSTART484.5.2分支程序設(shè)計(jì)分支程序結(jié)構(gòu)是指程序的執(zhí)行順序?qū)⒏鶕?jù)某些指令的執(zhí)行結(jié)果,選擇某些指令執(zhí)行或不執(zhí)行。分支程序的實(shí)現(xiàn)主要是由轉(zhuǎn)移指令完成。如圖4-5所示,分支程序結(jié)構(gòu)有兩種形式:一種是二分支結(jié)構(gòu);另一種是多分支結(jié)構(gòu)。49(1)用比較/測(cè)試指令+條件轉(zhuǎn)移指令實(shí)現(xiàn)分支算法分析:依次比較相鄰兩數(shù)的大小,將較大的送入AL中;每次比較后,較大數(shù)存放在AL中,相當(dāng)于較大的數(shù)往下傳;比較一共要做7次。比較結(jié)束后,AL中存放的就是最大數(shù)。例4-11數(shù)據(jù)段的ARY數(shù)組中存放有8個(gè)無(wú)符號(hào)數(shù),試找出其中最大者送入MAX單元。50算法實(shí)現(xiàn):DATASEGMENTARYDB18,15,40,0,60,10,30,70MAXDB?DATAENDSSTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETARY;SI指向ARY的第一個(gè)元素
MOVCX,7;CX作次數(shù)計(jì)數(shù)器
MOVAL,[SI];取第一個(gè)元素到ALLOP:INCSI;SI指向后一個(gè)元素
CMPAL,[SI];比較兩個(gè)數(shù)
JAEBIGER;前元素≥后元素轉(zhuǎn)移
MOVAL,[SI];取較大數(shù)到ALBIGER:DECCX;減1計(jì)數(shù)
JNZLOP;未比較完轉(zhuǎn)回去,否則順序執(zhí)行
MOVMAX,AL;存最大數(shù)
MOVAH,4CHINT21HCODEENDSENDSTART514.5.3循環(huán)程序設(shè)計(jì)
在實(shí)際工作中,有時(shí)需要對(duì)某一問(wèn)題進(jìn)行多次重復(fù)處理,該類計(jì)算過(guò)程具有循環(huán)特征,循環(huán)程序設(shè)計(jì)恰是解決這類問(wèn)題行之有效的方法。⑴循環(huán)程序的構(gòu)成循環(huán)程序一般主要包括以下四個(gè)部分:①初始化部分主要用于建立循環(huán)的初始狀態(tài),即循環(huán)次數(shù)計(jì)數(shù)器、地址指針以及其他循環(huán)參數(shù)的初始設(shè)定。②循環(huán)體循環(huán)體是程序中重復(fù)執(zhí)行的程序段,包括工作部分和修改部分。工作部分是完成循環(huán)程序任務(wù)的主要程序段;修改部分則是為循環(huán)的重復(fù)執(zhí)行,完成某些參數(shù)的修改。③循環(huán)控制部分主要判斷循環(huán)條件是否成立。判斷方法主要有兩種:用計(jì)數(shù)控制循環(huán)和用條件控制循環(huán)。④結(jié)束處理部分處理循環(huán)結(jié)束后的結(jié)果,如存儲(chǔ)結(jié)果等。52(2)循環(huán)程序的結(jié)構(gòu)類型依照問(wèn)題的不同,循環(huán)體的結(jié)構(gòu)一般可分為兩類:先執(zhí)行后判斷和先判斷后執(zhí)行,如圖4-8所示。圖4-8(a)先執(zhí)行后判斷圖4-8(b)先判斷后執(zhí)行53⑶控制循環(huán)次數(shù)的方法①用計(jì)數(shù)控制循環(huán)適用于循環(huán)次數(shù)已知的,或是在進(jìn)入循環(huán)前可由某變量確定循環(huán)次數(shù)的情況。常選用CX作計(jì)數(shù)器,可選用LOOP、LOOPE或LOOPNE等循環(huán)控制指令。例4-13把以BUFFER為首址的6個(gè)字節(jié)單元中的二進(jìn)制數(shù)據(jù)累加,求得的和存放到RES字單元中。54DATASEGMENTBUFFERDB1,9,21,12,23,13RESDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;AL清0MOVCX,06H;置計(jì)數(shù)器初值
MOVBX,OFFSETBUFFER;置地址指針L1:ADDAL,[BX];取一個(gè)數(shù)累加到AL上
ADCAH,0INCBX;地址加1LOOPL1;不為0,循環(huán)
MOVRES,AX;傳送結(jié)果
MOVAH,4CHINT21HCODEENDSENDSSTART
55②用條件控制循環(huán)適用于某些循環(huán)次數(shù)未知的,或循環(huán)次數(shù)可變的情況,可以由問(wèn)題給出的條件控制循環(huán)結(jié)束。例4-14調(diào)用單字符輸出的DOS功能,向屏幕輸出以“#”結(jié)束的字符串。a.明確任務(wù),確定算法。設(shè)字符串存放在以D1開(kāi)始的存儲(chǔ)區(qū)中,字符串以“#”結(jié)束。雖然字符串長(zhǎng)度未知,但可利用條件中的已知特征“#”來(lái)結(jié)束循環(huán)。顯然,可以用條件控制法。b.算法思想:初始化:將D1的首地址送入SI。循環(huán):(a)將SI指向的存儲(chǔ)單元數(shù)據(jù)送到DL中;(b)判斷:如果DL中的字符不是“#”,則顯示
該字符,并修改SI的值即讓SI指向下一個(gè)存儲(chǔ)
單元,然后返回(a);否則執(zhí)行(c)。(c)結(jié)束。56c.編寫(xiě)程序DATASEGMENTD1DB‘HOWAREYOU?#’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,D1LP:MOVDL,[SI]
CMPDL,‘#’JZENDOUTMOVAH,2;顯示單個(gè)字符
INT21H
INCSI;指向下一個(gè)數(shù)據(jù)
JMPLPENDOUT:INT20HCODEENDSENDSTART574.5.4子程序設(shè)計(jì)子程序或過(guò)程是匯編語(yǔ)言中多次使用的一個(gè)相對(duì)獨(dú)立的程序段。⑴子程序的定義每一個(gè)子程序在被使用前必須先定義,子程序的定義格式就是過(guò)程的定義格式,完成子程序功能的程序段就包括在過(guò)程定義語(yǔ)句PROC。。。ENDP的中間。(2)子程序的調(diào)用和返回主程序通過(guò)使用CALL指令實(shí)現(xiàn)對(duì)子程序的調(diào)用,子程序通過(guò)使用RET指令實(shí)現(xiàn)返回主程序。如果在子程序中沒(méi)有保護(hù)與恢復(fù)現(xiàn)場(chǎng),則應(yīng)該在主程序調(diào)用子程序之前保護(hù)現(xiàn)場(chǎng)、在子程序返回主程序后恢復(fù)現(xiàn)場(chǎng)。58例4-16已知數(shù)組由50個(gè)字?jǐn)?shù)據(jù)組成,試求出該數(shù)組元素之和。算法分析:假設(shè)數(shù)組已經(jīng)存放在以ARY開(kāi)始的存儲(chǔ)區(qū)中,其各個(gè)元素之和存放在以SUM開(kāi)始的存儲(chǔ)區(qū)中。用子程序結(jié)構(gòu)進(jìn)行編程。DATASEGMENTARYDW50DUP(?)SUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXCALLRADDMOVAH,4CHINT21H60求和子程序RADDPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXLEABX,ARYMOVCX,100MOVAX,0MOVDX,AXCL1:ADDAX,[BX]JNCCL2INCDX61CL2:ADDBX,2LOOPCL1MOVSUM,AXMOVSUM+2,DXPOPDXPOPCXPOPBXPOPAXRETRADDENDPCODEENDSENDSTART624.6DOS及BIOS功能調(diào)用
DOS是磁盤(pán)操作系統(tǒng),它為程序設(shè)計(jì)人員提供了可以直接調(diào)用的功能子程序。DOS功能調(diào)用就是指對(duì)這些子程序的調(diào)用,也稱系統(tǒng)功能調(diào)用。子程序的順序編號(hào)稱為功能調(diào)用號(hào)。IBMPC系列機(jī)在只讀存儲(chǔ)器ROM中固化有一組外部設(shè)備驅(qū)動(dòng)與管理軟件,占用系統(tǒng)板上8K字節(jié)的ROM區(qū),組成PC機(jī)基本輸入輸出系統(tǒng)(BasicI/OSystem),它處于系統(tǒng)軟件的最低層,又稱ROMBIOS。63BIOS/DOS的每個(gè)功能子程序都對(duì)應(yīng)著一個(gè)子程序文件,因此BIOS/DOS功
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 殘疾兒童送教上門學(xué)期的工作總結(jié)
- 新質(zhì)生產(chǎn)力推動(dòng)數(shù)字文娛發(fā)展
- 委托制作節(jié)目光盤(pán)合同范例
- 感恩父母主題班會(huì)策劃方案
- 買賣雙方送貨合同范例
- 公司股購(gòu)買合同模板
- 小孩上學(xué)勞務(wù)合同范例
- 中介合同與個(gè)人合同范例
- 新質(zhì)生產(chǎn)力推動(dòng)綠色能源發(fā)展
- 產(chǎn)品安裝合同范例
- 企業(yè)旗桿維修合同范例
- 《市場(chǎng)營(yíng)銷》教案全套 蔣世軍(第1-12周)認(rèn)識(shí)市場(chǎng)營(yíng)銷 -數(shù)字營(yíng)銷與直播電商
- 2025屆河南省信陽(yáng)第一高級(jí)中學(xué)高二物理第一學(xué)期期末綜合測(cè)試模擬試題含解析
- 排洪渠道清淤施工方案
- 北科大巖石力學(xué)-李長(zhǎng)洪1.2-巖石的力學(xué)性質(zhì)
- 國(guó)開(kāi)(河北)2024年秋《現(xiàn)代產(chǎn)權(quán)法律制度專題》形考作業(yè)1-4答案
- 2024-2030年度假酒店項(xiàng)目融資商業(yè)計(jì)劃書(shū)
- 新商科“專業(yè)-產(chǎn)業(yè)雙鏈融通式”人才培養(yǎng)模式探究
- 2024年重慶新版勞動(dòng)合同范本
- 公務(wù)員2018年國(guó)考《申論》真題卷及答案(副省級(jí))
- 2024年基金從業(yè)資格證(含三個(gè)科目)考前必刷必練題庫(kù)500題(含真題、必會(huì)題)
評(píng)論
0/150
提交評(píng)論