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