匯編語言補(bǔ)充課件_第1頁
匯編語言補(bǔ)充課件_第2頁
匯編語言補(bǔ)充課件_第3頁
匯編語言補(bǔ)充課件_第4頁
匯編語言補(bǔ)充課件_第5頁
已閱讀5頁,還剩183頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1匯編語言程序設(shè)計(jì)1匯編語言程序設(shè)計(jì)2§3.1匯編語言基本元素2§3.1匯編語言基本元素3

由匯編語言編寫的源程序是由許多語句(也可稱為匯編指令)組成的。每個(gè)語句由1~4個(gè)部分組成,其格式是:[標(biāo)識(shí)符]指令助記符[操作數(shù)][;注解]

其中用方括號(hào)括起來的部分,可以有也可以沒有。每部分之間用空格(至少一個(gè))分開,一行最多可有132個(gè)字符。3.1.1匯編語言的語句格式3由匯編語言編寫的源程序是由許多語句(也可稱為匯編4(1)標(biāo)識(shí)符:給指令或某一存儲(chǔ)單元地址所起的名字。標(biāo)識(shí)符由下列字符組成:(以字母或圓點(diǎn)開頭)字母:A~Z,a~z;數(shù)字:0~9;特殊字符:?.@_$數(shù)字不能作標(biāo)識(shí)符的第一個(gè)字符,而.僅能作標(biāo)識(shí)符的第一個(gè)字符,標(biāo)識(shí)符最長為31個(gè)字符。標(biāo)識(shí)符后跟冒號(hào)時(shí)表示標(biāo)號(hào),代表該行指令的起始地址,標(biāo)號(hào)可以被轉(zhuǎn)移、調(diào)用指令直接引用。標(biāo)識(shí)符后不帶冒號(hào)時(shí)表示變量。偽指令前的標(biāo)識(shí)符不加冒號(hào)。

4(1)標(biāo)識(shí)符:給指令或某一存儲(chǔ)單元地址所起的名字。5(2)指令助記符

表示不同操作的指令,可以是8086/8088的指令助記符,也可以是偽指令。

(3)操作數(shù)

是指令執(zhí)行的對(duì)象。依指令的要求,可能有一個(gè)、兩個(gè)、沒有或者多個(gè)。

例如:RET;無操作數(shù)COUNT:INCCX;一個(gè)操作數(shù)

MOVCX,DI;兩個(gè)操作數(shù)ADDAX,[BP十4];第二個(gè)操作數(shù)為表達(dá)式

(4)注釋該項(xiàng)可有可無,是為源程序所加的注解,用于提高程序的可讀性。

5(2)指令助記符(3)操作數(shù)(4)注釋6匯編語言運(yùn)算符:是匯編程序在匯編時(shí)計(jì)算的,與運(yùn)算指令不同,指令是在程序運(yùn)行時(shí)計(jì)算的。1、算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符如:+、-、×、/、AND、OR、LT等MOVAX,[DI+BX]

ADDAX,FIRST+1MOVAX,((choiceLT20)AND5)OR((choiceGE20)AND6)3.1.2匯編語言運(yùn)算符6匯編語言運(yùn)算符:是匯編程序在匯編時(shí)計(jì)算的,與運(yùn)算指令不同,7注意:算術(shù)運(yùn)算符總可以用于數(shù)字操作,其結(jié)果也是數(shù)字的。當(dāng)應(yīng)用于存儲(chǔ)器操作數(shù)時(shí),只有+,-運(yùn)算符有意義;邏輯運(yùn)算符的操作數(shù)也必須是數(shù)字,存儲(chǔ)器操作數(shù)不能進(jìn)行邏輯運(yùn)算;關(guān)系運(yùn)算符連接的兩個(gè)操作數(shù),必須都是數(shù)字的或是在同一段內(nèi)的存儲(chǔ)器地址。7注意:82、取值運(yùn)算符

1)$運(yùn)算符$:當(dāng)前地址偏移量的值BLOCKDB‘HELLO!’NUMEQU$-BLOCK‘H’‘E’‘L’‘L’‘O’‘!’BLOCK$;NUM為682、取值運(yùn)算符BLOCKDB‘HELLO!’‘9SEG和OFFSETSEG:求標(biāo)號(hào)或變量的段地址OFFSET:求標(biāo)號(hào)或變量的偏移地址例如,定義:SLOTDW25則:MOVAX,SLOT;

從SLOT地址中取一個(gè)字送入AXMOVAX,SEGSLOT;

將SLOT的段地址送入AXMOVAX,OFFSETSLOT;

將SLOT的段內(nèi)偏移地址送AX9SEG和OFFSET例如,定義:SLOTDW103)TYPE返回標(biāo)號(hào)或存儲(chǔ)器操作數(shù)的類型值對(duì)存儲(chǔ)器操作數(shù):表示占用的字節(jié)數(shù)對(duì)標(biāo)號(hào):表示過程或指令地址的調(diào)用類型表3-1存儲(chǔ)器操作數(shù)的類型屬性及返回值字節(jié)字雙字NEARFAR124-1-2103)TYPE返回標(biāo)號(hào)或存儲(chǔ)器操作數(shù)的類型值表3-1114)LENGTH和SIZE(對(duì)用DUP定義數(shù)據(jù)的情況下)LENGTH:返回一個(gè)與存儲(chǔ)器操作數(shù)相聯(lián)系的基本數(shù)據(jù)個(gè)數(shù),

SIZE:返回一個(gè)為存儲(chǔ)器操作數(shù)分配的字節(jié)數(shù)關(guān)系:SIZE=LENGTH×TYPE例如:若MULT-WORDDW50DUP(0)則LENGTHMULT-WORD=50SIZEMULT-WORD=100TYPEMULT-WORD=2114)LENGTH和SIZE(對(duì)用DUP定義數(shù)123、屬性運(yùn)算符用來給指令中的操作數(shù)指定一個(gè)臨時(shí)的屬性,而暫時(shí)忽略操作數(shù)定義時(shí)的屬性。1)PTR定義操作數(shù)為新的類型一般格式:類型PTR操作數(shù)功能:建立一個(gè)存儲(chǔ)器操作數(shù),它與其后的存儲(chǔ)器操作數(shù)有相同的段地址和偏移地址,但有不同的類型。

F2DW3456HMOVAL,BYTEPTRF2MOV[BX],3MOVBYTEPTR[BX],3;AL:56H;錯(cuò),類型不明確;字節(jié)傳輸123、屬性運(yùn)算符用來給指令中的操作數(shù)指定一個(gè)臨時(shí)133.1.3表達(dá)式

是由運(yùn)算符和操作數(shù)組成的序列,在匯編時(shí)產(chǎn)生一個(gè)確定的值。這個(gè)值可以僅表示一個(gè)常量,也可以表示一個(gè)存儲(chǔ)單元的偏移地址,相應(yīng)的表達(dá)式稱為常量表達(dá)式和地址表達(dá)式。

133.1.3表達(dá)式是由運(yùn)算符和操作數(shù)組成的序列,141、常數(shù)二進(jìn)制(B),八進(jìn)制(Q),十六進(jìn)制(H),十進(jìn)制(D)(默認(rèn)),十進(jìn)制浮點(diǎn)數(shù),十六進(jìn)制實(shí)數(shù),字符和字符串10001100100B244Q64H‘BD’‘Thisisaclassroom.’141、常數(shù)二進(jìn)制(B),八進(jìn)制(Q),十六進(jìn)制(H),152、常量操作數(shù)

常量操作數(shù)是一個(gè)數(shù)值操作數(shù),一般是常量或者是表示常量的標(biāo)識(shí)符。

如:COUNTEQU10NAME=‘J’

可以為數(shù)字常量操作數(shù)或字符串常量操作數(shù)。前者可采用二進(jìn)制、八進(jìn)制、十進(jìn)制或十六進(jìn)制等進(jìn)位計(jì)數(shù)形式;而后者所對(duì)應(yīng)的常量值為相應(yīng)字符的ASCII碼。

152、常量操作數(shù)常量操作數(shù)是一個(gè)數(shù)值操作數(shù),一般是163、存儲(chǔ)器操作數(shù)

存儲(chǔ)器操作數(shù)是一個(gè)地址操作數(shù),代表一個(gè)存儲(chǔ)單元的地址,通常以標(biāo)識(shí)符的形式出現(xiàn)。變量:代表的是某個(gè)數(shù)據(jù)在數(shù)據(jù)段、附加段或堆棧段中的地址。變量所對(duì)應(yīng)的存儲(chǔ)單元內(nèi)容在程序的運(yùn)行過程中是可以改變的。標(biāo)號(hào):代表的是某條指令代碼在代碼段中的地址。標(biāo)號(hào)通常作為轉(zhuǎn)移指令或調(diào)用指令的目標(biāo)操作數(shù),在程序運(yùn)行過程中不能改變。

163、存儲(chǔ)器操作數(shù)存儲(chǔ)器操作數(shù)是一個(gè)地址操作數(shù),代17存儲(chǔ)器操作數(shù)有三個(gè)屬性段屬性(SEG):所對(duì)應(yīng)存儲(chǔ)單元的段地址偏移量屬性(OFFSET):所對(duì)于存儲(chǔ)單元在所在段內(nèi)的偏移地址(距段起點(diǎn)的字節(jié)數(shù))類型屬性(TYPE)變量的類型是占用存儲(chǔ)單元的字節(jié)數(shù),分為:DB(1個(gè)字節(jié))DW(2個(gè)字節(jié))DD(4個(gè)字節(jié))標(biāo)號(hào)的類型則反映了相應(yīng)存儲(chǔ)單元地址在作為轉(zhuǎn)移或調(diào)用指令的目標(biāo)操作數(shù)時(shí)的尋址方式,可有兩種情況,即NEAR和FAR。

17存儲(chǔ)器操作數(shù)有三個(gè)屬性段屬性(SEG):所對(duì)應(yīng)存儲(chǔ)單18DATASEGMENTXDB5,4YDW40HZDD2030HDATAENDS05H04H40H00H30H20H00H00HDS:0000HXYZX,Y,Z分別都有三個(gè)屬性:段地址,偏移地址和類型值,這三個(gè)屬性都有固定的值。18DATASEGMENT05H04H40H00H30194、常量表達(dá)式

由常量操作數(shù)及運(yùn)算符構(gòu)成,在匯編時(shí)產(chǎn)生一個(gè)常量。

如PORT、VAL十1、OFFSETSUM、SEGSUM、TYPECYCLE等。

194、常量表達(dá)式由常量操作數(shù)及運(yùn)算符構(gòu)成,在匯編205、地址表達(dá)式

由存儲(chǔ)器操作數(shù)與運(yùn)算符構(gòu)成,但由存儲(chǔ)器操作數(shù)構(gòu)成地址表達(dá)式時(shí),必須有明確的物理意義。

例如

SUM+2、CYCLE-5表達(dá)式SUM+2、CYCLE-5的值仍然是一個(gè)存儲(chǔ)器操作數(shù),該存儲(chǔ)器操作數(shù)的段地址與類型屬性分別與存儲(chǔ)器操作數(shù)SUM及CYCLE相同,但偏移地址分別比SUM及CYCLE大2或小5。表達(dá)式是在匯編時(shí)計(jì)算的,而變量單元的內(nèi)容在程序的運(yùn)行過程中可以改變。205、地址表達(dá)式由存儲(chǔ)器操作數(shù)與運(yùn)算符構(gòu)成,但由存儲(chǔ)器213.1.4匯編語言程序匯編步驟213.1.4匯編語言程序匯編步驟22.ASM.OBJ.EXE匯編連接宏匯編程序:MASM.EXE連接程序:LINK.EXE編輯程序源程序連接程序匯編程序目標(biāo)程序執(zhí)行程序步驟:1)編寫源程序;2)匯編;3)連接;4)調(diào)試。22.ASM.OBJ.EXE匯編連接宏匯編程序:MASM.23用戶編寫程序,程序在計(jì)算機(jī)中運(yùn)行,計(jì)算機(jī)的控制由操作系統(tǒng)交給用戶程序,運(yùn)行用戶程序,當(dāng)用戶程序運(yùn)行結(jié)束后,應(yīng)再將控制權(quán)交回操作系統(tǒng),所以,在程序中應(yīng)該有返回DOS的操作。在計(jì)算機(jī)中,返回DOS的操作由操作系統(tǒng)中的一個(gè)子程序來實(shí)現(xiàn),用戶使用時(shí)調(diào)用這個(gè)子程序即可。23用戶編寫程序,程序在計(jì)算機(jī)中運(yùn)行,計(jì)算機(jī)的控制由操作系統(tǒng)24每當(dāng)一個(gè)用戶的可執(zhí)行文件.EXE裝入內(nèi)存后,存儲(chǔ)器的分配情況如圖:系統(tǒng)占用程序段前綴用戶數(shù)據(jù)區(qū)用戶堆棧區(qū)用戶代碼段…………系統(tǒng)和ROM占用00000HDS,ES100個(gè)字節(jié)SS用戶程序空間FFFFFHCS24每當(dāng)一個(gè)用戶的可執(zhí)行文件.EXE裝入內(nèi)存后,存儲(chǔ)器的分配25系統(tǒng)占用INT20H

程序段前綴用戶數(shù)據(jù)區(qū)用戶堆棧區(qū)用戶代碼段…………系統(tǒng)和ROM占用無論用戶程序有幾段,也無論這些段的排列順序如何,用戶程序的代碼前一定有100個(gè)字節(jié)的程序段前綴(ProgramSegmentPrefix,簡稱PSP),PSP給出了用戶的可執(zhí)行文件(.EXE)的若干控制信息。其中PSP的開始處(第1,2字節(jié))有一條中斷指令I(lǐng)NT20H的代碼,通過它可以結(jié)束用戶程序,返回操作系統(tǒng)。在用戶程序執(zhí)行完以后,通過執(zhí)行該條指令就可以返回DOS。25系統(tǒng)占用INT20H程序段前綴用戶數(shù)據(jù)區(qū)用戶堆棧區(qū)26如何使用戶程序執(zhí)行完后返回來執(zhí)行這條指令?系統(tǒng)占用INT20H

程序段前綴用戶數(shù)據(jù)區(qū)用戶堆棧區(qū)用戶代碼段……RET系統(tǒng)和ROM占用DS,ESSSCS首先將用戶程序定義為一個(gè)遠(yuǎn)過程,當(dāng)可執(zhí)行文件裝入內(nèi)存后,DS,ES兩個(gè)段寄存器被CPU自動(dòng)設(shè)置為指向PSP的首址,所以一般程序的開始指令為:PUSHDSMOVAX,0PUSHAX即將DS的內(nèi)容和0000H壓入堆棧,程序結(jié)束時(shí)的最后一條語句為RET,就把壓入堆棧的PSP段的段地址和偏移地址0000H彈出并送入CS和IP,轉(zhuǎn)而執(zhí)行返回DOS的指令I(lǐng)NT20H。00H00HPSPLPSPH堆棧情況26如何使用戶程序執(zhí)行完后返回來執(zhí)行這條指令?系統(tǒng)占用INT27返回操作系統(tǒng)的另一個(gè)辦法是通過系統(tǒng)調(diào)用(調(diào)用號(hào)是4CH)。這時(shí),

在用戶程序結(jié)束時(shí),用下面兩條指令:

MOVAH,4CHINT21H即可實(shí)現(xiàn)返回DOS。27返回操作系統(tǒng)的另一個(gè)辦法是通過系統(tǒng)調(diào)用(調(diào)用號(hào)是4CH)28§3.2偽指令28§3.2偽指令29偽指令:偽指令不是CPU運(yùn)行的指令,而是程序員給匯編程序下達(dá)的命令。是在匯編源程序期間由匯編程序執(zhí)行的命令。偽指令用來對(duì)匯編程序進(jìn)行控制,對(duì)程序中的數(shù)據(jù)進(jìn)行存儲(chǔ)空間分配、實(shí)現(xiàn)條件匯編、列表等處理,其格式和匯編指令一樣,但不產(chǎn)生目標(biāo)代碼,即不直接命令CPU去執(zhí)行什么操作。29偽指令:偽指令不是CPU運(yùn)行的指令,而是程序員給匯編程序303.2.1數(shù)據(jù)定義偽指令DB:定義字節(jié),其后的每個(gè)操作數(shù)占有一個(gè)存儲(chǔ)單元,連續(xù)存放;BUFFERDB2,3STRINGDB‘NO’‘O’‘N’03H02HBUFFERDW:定義字,其后的每個(gè)操作數(shù)占有兩個(gè)字節(jié);BUFDW2,3,505H00H00H03H00H02HBUFSTRINGDD:定義雙字,其后每個(gè)操作數(shù)占4個(gè)字節(jié);還有DQ(4個(gè)字長)、DT(10個(gè)字節(jié)長)303.2.1數(shù)據(jù)定義偽指令DB:定義字節(jié),其后的每個(gè)操作31若僅保留單元,不初始化,用?代替初值;若數(shù)據(jù)重復(fù),用nDUP()代替,n為重復(fù)次數(shù)。ARRAYDB100DUP(?)保留100個(gè)字節(jié),首地址為ARRAY,不初始化,即100個(gè)字節(jié)內(nèi)均為隨機(jī)值DATA1DB100DUP(‘AB’)初始化200個(gè)字節(jié),內(nèi)有100個(gè)41H,42H(即41H42H41H42H

41H42H……)31若僅保留單元,不初始化,用?代替初值;ARRAYDB32例:有如下數(shù)據(jù)定義偽指令:VALDB1,4DUP(5,2DUP(FFH,0))則在VAL存儲(chǔ)區(qū)前10個(gè)字節(jié)單元的數(shù)據(jù)是:1,5,FFH,0,FFH,0,5,FFH,0,FFH若定義DW1,2,5DUP(‘YES’,2DUP(3)),則在存儲(chǔ)區(qū)的數(shù)據(jù)是什么?32例:有如下數(shù)據(jù)定義偽指令:1,5,FFH,0,FFH,0333.2.2符號(hào)定義偽指令標(biāo)識(shí)符EQU表達(dá)式標(biāo)識(shí)符=表達(dá)式給標(biāo)識(shí)符定義一個(gè)值或其他符號(hào)名或一條可執(zhí)行語句,匯編時(shí),凡是出現(xiàn)該標(biāo)識(shí)符的地方就用定義的數(shù)據(jù)替代。注意:用EQU賦值的名字不能重新賦值,需用PURGE釋放后重新定義。如:PURGETIMESTIMESEQU100TIMESEQU50BUFDBTIMESDUP(?)等效于:BUFDB50DUP(?)BETA=TIMES-2BETA=TIMES+5;重新賦值333.2.2符號(hào)定義偽指令標(biāo)識(shí)符EQU34DATASEGMENTADW3BDW4LEQUB-ADATAENDS03H00H04H00HDS:0000H數(shù)據(jù)段L為常量,不占空間,值為234DATASEGMENT03H00H04H00H353.2.3段定義偽指令SEGMENT和ENDS一般的源程序分為4個(gè)段:代碼段Code、數(shù)據(jù)段Data、堆棧段Stack、附加段Extra。各個(gè)段從段定義語句開始,到段結(jié)束語句ENDS結(jié)束。段名

SEGMENT[定位類型][組合類型][類別]……段體……段名

ENDS用戶指定可任選定義353.2.3段定義偽指令SEGMENT和ENDS一般361)段名必須是合法的標(biāo)識(shí)符。2)定位類型:表示本段起始地址位于何處內(nèi)存可以看成是一本書,將其分成頁,段,字,和字節(jié)。每256個(gè)地址為一頁(PAGE),每頁的起始地址為二進(jìn)制:************0000000016進(jìn)制:***00H第一頁(256個(gè)地址)第二頁(256個(gè)地址)00000H000FFH00100H00200H001FFH361)段名必須是合法的標(biāo)識(shí)符。2)定位類型:內(nèi)存可以看成是37每16個(gè)地址為一段(PARA),每段的起始地址為二進(jìn)制:****************000016進(jìn)制:****0H第一段(16個(gè)地址)第二段(16個(gè)地址)***00H***0FH***10H***1FH***20H段(節(jié))是默認(rèn)的定位類型。37每16個(gè)地址為一段(PARA),第一段(1638每2個(gè)地址為一個(gè)字(WORD),每個(gè)字的起始地址為偶數(shù);最基本的類型是字節(jié)(BYTE),每個(gè)字節(jié)只包含一個(gè)地址,可以是內(nèi)存的任何空間。定位類型表示所定義的段存放在內(nèi)存空間時(shí),段首地址對(duì)內(nèi)存空間的要求,即段起始點(diǎn)是放在一頁的起點(diǎn)上(PAGE)還是一段的起點(diǎn)上(PARA)等,如果不定義定位類型,編譯程序?qū)⒛J(rèn)其為段類型,即將段首地址放在從****0H開始的內(nèi)存空間。BYTE:

表示本段起始單元可以從任一地址開始;WORD:

表示本段起始單元從一個(gè)偶地址開始;PARA:

表示本段起始單元從一個(gè)段的邊界開始(默認(rèn));PAGE:

表示本段起始單元從一個(gè)頁的邊界開始。38每2個(gè)地址為一個(gè)字(WORD),每個(gè)字的起始地址為偶數(shù);393)組合類型告訴匯編程序,所定義的段與其他段的關(guān)系,即將該段存放內(nèi)存時(shí),是否將該段與其他段在物理上或邏輯上放在一起。NONE:

表示本段與其他段不發(fā)生任何關(guān)系,該段有自己的段基址,是默認(rèn)的組合關(guān)系。PUBLIC:在滿足定位類型的前提下與其他模塊的同名段連接在一起,形成一個(gè)新的邏輯段,共用一個(gè)段基址。393)組合類型告訴匯編程序,所定義的段與其他段的關(guān)系,即將40COMMON:

表示產(chǎn)生一個(gè)覆蓋段。連接時(shí),把本段與其他也用COMMON說明的同名段置成相同的起始地址,重疊在一起,共享相同的存儲(chǔ)區(qū),其段長度由最長的段確定。STACK:

在每個(gè)匯編程序中,只能必須有一個(gè)堆棧段,連接時(shí),將本段與其他也用STACK說明的同名段連接成一個(gè)連續(xù)的STACK段,編譯程序自動(dòng)初始化SS和SP寄存器,使SS的內(nèi)容為該連續(xù)段的段基址,SP指向堆棧底部加1的存儲(chǔ)單元。40COMMON:表示產(chǎn)生一個(gè)覆蓋段。連接時(shí),把本段與其41MEMORY:

表示本段在存儲(chǔ)器中應(yīng)定位在所有其他段的最高地址。AT<表達(dá)式>:表示本段從表達(dá)式指定的地址處開始裝入,這樣,在程序中用戶就可以直接定義段地址,這種方式不適用于代碼段。41MEMORY:表示本段在存儲(chǔ)器中應(yīng)定位在所有其他段的424)類別是用單引號(hào)括起來的字符串,以表明該段的類別,如代碼段(CODE)、數(shù)據(jù)段(DATA)、堆棧段(STACK)等。當(dāng)然也允許用戶在類別中用其他的名,這樣進(jìn)行連接時(shí),連接程序便將同類別的段(但不一定同名)放在連續(xù)的存儲(chǔ)區(qū)內(nèi)。424)類別是用單引號(hào)括起來的字符串,以表明該段的433.2.4設(shè)定段寄存器偽指令A(yù)SSUME一般格式:ASSUME

段寄存器:段名[,段寄存器:段名,…]功能:通知匯編程序,哪一個(gè)段寄存器是該段的段寄存器,以便對(duì)使用變量或標(biāo)號(hào)的指令匯編出正確的目的代碼。

例如,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK

433.2.4設(shè)定段寄存器偽指令A(yù)SSUME一般格式:功能44注意:

當(dāng)程序運(yùn)行時(shí),由于DOS的裝入程序負(fù)責(zé)把CS初始化成正確的代碼段地址,SS初始化為正確的堆棧段地址,因此用戶在程序中就不必設(shè)置。但是,在裝入程序中DS寄存器由于被用作其它用途,因此,在用戶程序中必須用兩條指令對(duì)DS進(jìn)行初始化,以裝入用戶的數(shù)據(jù)段段地址。當(dāng)使用附加段時(shí),也要用MOV指令給ES賦段地址。

例如,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATA;DATA段值送AX

MOV

DS,AX;AX內(nèi)容送DS,DS才有實(shí)際段值CODEENDS44注意:當(dāng)程序運(yùn)行時(shí),由于DOS的裝入程序負(fù)責(zé)把C453.2.5過程定義偽指令PROC和ENDP

在程序設(shè)計(jì)中,可將具有一定功能的程序段看成為一個(gè)過程(相當(dāng)于一個(gè)子程序),它可以被別的程序調(diào)用。要求先定義后使用。

一個(gè)過程由偽指令PROC和ENDP來定義,其格式為:過程名PROC[類型]過程體

RET過程名

ENDP注意:PROC和ENDP要成對(duì)出現(xiàn)。過程名是為過程所起的名稱,不能省略

類型由FAR(遠(yuǎn)過程,為段間調(diào)用)和NEAR(近過程,為段內(nèi)調(diào)用)來確定,如果缺省類型,則該過程就默認(rèn)為近過程。過程體內(nèi)至少有一條RET指令453.2.5過程定義偽指令PROC和ENDP在程46一個(gè)碼段中可以包含一個(gè)或許多過程。過程可以嵌套調(diào)用,可以遞歸調(diào)用,但不可以嵌套定義。MYCODESEGMENTASSUMECS:MYCODESUB1PROCFAR……RETSUB1

ENDPSUB2PROCNEAR……RETSUB2ENDP……CALLSUB2MYCODE

ENDSFAR:

該過程為遠(yuǎn)過程,調(diào)用該過程時(shí)為段間調(diào)用,即CS和IP均要重新賦值;NEAR:

該過程為近過程,調(diào)用該過程時(shí)為段內(nèi)調(diào)用,只修改IP。(默認(rèn))CALL:

調(diào)用過程SUB2,到此處才真正去執(zhí)行子程序。46一個(gè)碼段中可以包含一個(gè)或許多過程。過程可以嵌套調(diào)用,可以47例:延時(shí)100ms的子程序,編程定義如下:DELAYPROC

MOVBL,10AGAIN:MOVCX,2801HWAIT1:LOOPWAIT1DECBLJNZAGAINRETDELAYENDP任何一個(gè)過程都要求先定義,后調(diào)用。調(diào)用時(shí)才真正執(zhí)行該過程。一個(gè)過程產(chǎn)生一段目標(biāo)代碼。47例:延時(shí)100ms的子程序,編程定義如下:DELAY48在匯編語言書寫的源程序中,有的程序段要多次使用,為了簡化書寫,該程序段可以用一條特殊的指令來代替,這個(gè)特殊的指令就是宏指令。宏指令只是為了方便書寫,當(dāng)匯編程序匯編生成目標(biāo)代碼時(shí),在引用宏指令處仍會(huì)產(chǎn)生原來程序段應(yīng)生成的目標(biāo)代碼,引用一次生成一次。3.2.6宏指令48在匯編語言書寫的源程序中,有的程序段要多次使用,為了簡化491)宏指令定義格式:宏指令名MACRO<形參列表>匯編程序段(宏體)ENDMMACRO與ENDM必須成對(duì)出現(xiàn),先定義后引用SHIFTMACROMOVCL,4SALAL,CLENDM宏名程序段:將AL左移4位(乘16)INAL,5FHSHIFTOUT5FH,AL在程序中引用宏指令如下:491)宏指令定義格式:宏指令名MACRO<形參列50宏指令也可以接收參數(shù),如對(duì)X左移Y位。SHIFTMACROX,YMOVCL,YSALX,CLENDM形參列表MOVBX,WORDPTRBUFSHIFT

BX,4MOVWORDPTRBUF,BX在程序中引用宏指令如下:功能:BX的值左移4位。BXX4Y實(shí)參形參一一對(duì)應(yīng)50宏指令也可以接收參數(shù),如對(duì)X左移Y位。SHIFTMA513.2.7定位偽指令格式:ORG表達(dá)式功能:指定在其后的指令或數(shù)據(jù)存放的偏移地址。CODESEGMENTORG0100HMOVAX,0CODEENDS指定MOV指令放在代碼段中偏移地址為0100H開始的位置。DATASEGMENTORG2000HNUMDB0,5DATAENDS指定NUM指向數(shù)據(jù)段中偏移地址為2000H開始的位置。513.2.7定位偽指令格式:ORG表達(dá)式功能:523.2.8匯編結(jié)束偽指令END匯編程序在匯編時(shí)遇到END,便知源程序已經(jīng)結(jié)束。一般格式:END表達(dá)式表達(dá)式為可執(zhí)行程序運(yùn)行的起始位置。一般是一個(gè)標(biāo)號(hào)。523.2.8匯編結(jié)束偽指令END匯編程序在匯編時(shí)遇53完整結(jié)構(gòu)1DATASEGMENTXDB3YDB5DATAENDSSTACKSEGMENTSTACK‘STACK’DB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK

BEGIN:MOVAX,DATAMOVDS,AX……………………

MOVAH,4CHINT21HCODEENDSENDBEGIN設(shè)置DS段寄存器內(nèi)容源程序結(jié)束,第一條指令的地址分配段寄存器首指令位置數(shù)據(jù)段堆棧段(可略)返回DOS53完整結(jié)構(gòu)1DATASEGMENT設(shè)置DS段寄54完整結(jié)構(gòu)2DATASEGMENTXDB3YDB5DATAENDSSTACKSEGMENTSTACK‘STACK’DB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK

BEGINPROCFAR

PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX…………

RETBEGINENDPCODEENDSENDBEGIN將PSP首址壓棧,以便返回DOS。設(shè)置DS段寄存器內(nèi)容源程序結(jié)束,第一條指令的地址分配段寄存器主過程名數(shù)據(jù)段堆棧段(可略)返回DOS54完整結(jié)構(gòu)2DATASEGMENT將PSP首址55§3.3匯編程序設(shè)計(jì)55§3.3匯編程序設(shè)計(jì)56匯編語言編寫的程序也跟高級(jí)語言類似,程序結(jié)構(gòu)分三種:順序、分支、循環(huán);較復(fù)雜的程序也應(yīng)該是由眾多子程序組成的,每個(gè)子程序是一個(gè)過程,在程序中被顯式地調(diào)用。變量等數(shù)據(jù)部分被定義在數(shù)據(jù)段,所有程序都要顯式地定義堆棧段。匯編程序的每一條指令都與機(jī)器語言一一對(duì)應(yīng),因此,匯編生成的可執(zhí)行文件代碼少,適合于實(shí)時(shí)控制,但由于語法成分很少,不適合于復(fù)雜的算法、運(yùn)算。匯編程序主要的調(diào)試環(huán)境是DOS系統(tǒng)下的DEBUG程序。56匯編語言編寫的程序也跟高級(jí)語言類似,程序結(jié)構(gòu)分三種:順序57一、順序程序設(shè)計(jì)順序程序設(shè)計(jì)是沒有分支,沒有循環(huán)的直線運(yùn)行程序,程序執(zhí)行按照IP內(nèi)容自動(dòng)增加的順序進(jìn)行。57一、順序程序設(shè)計(jì)58例1利用查表法計(jì)算平方值。已知0~9的平方值連續(xù)存在以SQTAB開始的存儲(chǔ)區(qū)域中,求SUR單元內(nèi)容X的平方值,并放在DIS單元中。假定0≤X≤9且為整數(shù)。

分析:解這個(gè)問題,關(guān)鍵在兩方面,一是了解平方表的存放位置;二是根據(jù)X的值,找到X對(duì)應(yīng)X2在表中位置,在這里為表的首地址加上X單元的內(nèi)容。也可以用查表指令。

58例1利用查表法計(jì)算平方值。已知0~9的平方值連續(xù)存59例2已知

Z=(X+Y)-(W+Z),其中X,Y,Z,W均為用壓縮BCD碼表示的數(shù),寫出程序段。

分析:注意是壓縮BCD碼相加減,因此正常運(yùn)算完要進(jìn)行相應(yīng)的十進(jìn)制調(diào)整。59例2已知Z=(X+Y)-(W+Z),其中X,Y,Z60二、分支程序設(shè)計(jì)分支程序的基本思想是根據(jù)邏輯判斷的結(jié)果來形成程序的分支,如圖,若條件A成立,則執(zhí)行P1;否則執(zhí)行P2。一般情況下,兩個(gè)分支僅選其一執(zhí)行。

60二、分支程序設(shè)計(jì)61例1試編寫完整程序,實(shí)現(xiàn)符號(hào)函

數(shù)。變量X的符號(hào)函數(shù)可表示為:

1X>0

Y=0X=0

-1X<0

分析:解這個(gè)問題,要注意對(duì)X的值的判別。這時(shí),根據(jù)判別的結(jié)果要出現(xiàn)三個(gè)分支,因此,需要進(jìn)行兩次判別。61例1試編寫完整程序,實(shí)現(xiàn)符號(hào)函

數(shù)。62例2將內(nèi)存數(shù)據(jù)區(qū)中從STR1開始的數(shù)據(jù)

塊傳送到STR2指示的另一區(qū)域中,

數(shù)據(jù)塊長度由STRCOUNT指示。

分析:采用串操作實(shí)現(xiàn)。首先判斷源數(shù)據(jù)塊和目的數(shù)據(jù)塊之間是否有重疊,若無則直接傳;若有則要判別:源地址+數(shù)據(jù)塊長度目的地址是則地址增量修改,反之地址減量修改。

62例2將內(nèi)存數(shù)據(jù)區(qū)中從STR1開始的數(shù)據(jù)

63三、循環(huán)程序設(shè)計(jì)

循環(huán)程序是經(jīng)常遇到的程序結(jié)構(gòu),一個(gè)循環(huán)結(jié)構(gòu)通常由以下幾個(gè)部分組成。

1.循環(huán)初始化部分。一般要進(jìn)行地址指針、循環(huán)次數(shù)的設(shè)置,相關(guān)寄存器的清零等操作。只有正確地進(jìn)行了初始化設(shè)置,循環(huán)程序才能正確運(yùn)行,及時(shí)停止。2.循環(huán)體。是要求重復(fù)執(zhí)行的程序段部分。3.循環(huán)控制部分。由該部分修改并判斷控制循環(huán)的條件是否滿足,以決定是否繼續(xù)循環(huán)。4.循環(huán)結(jié)束部分。如保存循環(huán)運(yùn)行結(jié)果等。

63三、循環(huán)程序設(shè)計(jì)1.循環(huán)初始化部分。一般要進(jìn)行地64例1

將數(shù)據(jù)段中TABLE開始的連續(xù)100個(gè)

單元寫入0AAH,然后逐個(gè)讀出進(jìn)行

檢查,若發(fā)現(xiàn)有錯(cuò),則置FLAG=1,

反之,置FLAG=0。試編寫完整程序。分析:通過循環(huán),往指定存區(qū)寫入0AAH,然后逐個(gè)讀出,與0AAH相比較,全部相同時(shí),0

Flag

如有不相同時(shí),1Flag設(shè)置BX為地址指針,初值指向TABLE,

循環(huán)控制變量初值為100。64例1將數(shù)據(jù)段中TABLE開始的連續(xù)100個(gè)

65例2

設(shè)內(nèi)存BUFF開始的單元中依次存放

著30個(gè)8位無符號(hào)數(shù),求它們的和并

放在SUM單元中,試編寫完整程序。

分析:這是一個(gè)求累加的程序。設(shè)置工作單元存放累加和,初始值送0。然后逐個(gè)

讀出數(shù)據(jù),做累加和+數(shù)據(jù)累加和,循環(huán)進(jìn)行N次。設(shè)置SI為地址指針,初值指向BUFF,

循環(huán)控制變量初值為30。65例2設(shè)內(nèi)存BUFF開始的單元中依次存放

66例3

在ARRAY開始的存區(qū)中存放著一組字

數(shù)據(jù),個(gè)數(shù)由COUNT指示。試編寫程序

段尋找其中的最大數(shù),放在MAX中。

分析:設(shè)置工作單元,先把第一個(gè)數(shù)放入,

然后逐個(gè)讀出數(shù)據(jù)與其相比較,如讀出的數(shù)據(jù)大時(shí),則數(shù)據(jù)工作單元

如工作單元中的數(shù)據(jù)大時(shí),則不送。循環(huán)進(jìn)行N-1次。設(shè)置BX為地址指針,初值指向ARRAY,

循環(huán)控制變量初值為COUNT-1。66例3在ARRAY開始的存區(qū)中存放著一組字

67例4在給定的16位數(shù)組中,找出大于零、等于零和小于零的數(shù)據(jù)個(gè)數(shù),并緊跟著原數(shù)組存放。已知數(shù)據(jù)段定義如下:

DATA SEGMENT

BUFFDWX1,X2,X3,……,Xn

COUNTEQU$-BUFF;此時(shí),COUNT的

值為BUFF所占的字節(jié)數(shù)

PLUSDB?

ZERODB?

MINUS DB?

DATA ENDS

67例4在給定的16位數(shù)組中,找出大于零、等于零和小于零68分析:這是一個(gè)統(tǒng)計(jì)問題,須設(shè)定三個(gè)計(jì)數(shù)器分別統(tǒng)計(jì)三種情況下的結(jié)果。計(jì)數(shù)器的初始值送0。

然后逐個(gè)讀出數(shù)據(jù)進(jìn)行判別,滿足哪個(gè)條件,就在哪個(gè)計(jì)數(shù)器中做統(tǒng)計(jì)即計(jì)數(shù)器+1計(jì)數(shù)器,循環(huán)進(jìn)行N次。設(shè)置BX為地址指針,初值指向BUFF,DH、DL、AH為計(jì)數(shù)器,分別存放=0、>0、<0的數(shù)據(jù)個(gè)數(shù)。

循環(huán)控制變量初值為原始數(shù)據(jù)個(gè)數(shù)。68分析:這是一個(gè)統(tǒng)計(jì)問題,須設(shè)定三個(gè)計(jì)數(shù)器分別69例5

要求從0FFH端口輸入一組100個(gè)字符,若

該字符是數(shù)字,則轉(zhuǎn)換成數(shù)值后以非壓縮

BCD碼的形式存放在以DATA開始的存區(qū),

并統(tǒng)計(jì)輸入的數(shù)字的個(gè)數(shù),存放在NUM

單元中。分析:如何確定輸入的是數(shù)字?判別:‘0’

≤X≤‘9’

如何將數(shù)字的ASCII碼轉(zhuǎn)換成非壓縮BCD碼?

XAND0FHX或X-30HX即可

設(shè)置BX為地址指針,初值指向DATA,DH為計(jì)數(shù)器進(jìn)行統(tǒng)計(jì)。循環(huán)進(jìn)行N次。

循環(huán)控制變量初值為100。69例5要求從0FFH端口輸入一組100個(gè)字符,若

70思考:

1、若題目沒有明確告知輸入的字符個(gè)數(shù),僅以‘$’表示輸入結(jié)束,程序如何修改?

2、若題目要求以壓縮BCD碼形式存放,程序又該如何修改?70思考:

1、若題目沒有明確告知輸入的字符個(gè)數(shù),僅以‘$71DATASEGMENTORG1000HADDRDW?COUNTDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORCX,CXMOVAX,ADDRREPEAT:TESTAX,0FFFFHJZEXITSHRAX,1JNCNEXTINCCXNEXT:JMPREPEAT

EXIT:MOVCOUNT,CXMOVAX,4C00HINT21HCODEENDSENDSTART例6閱讀此程序,指出該程序完成了什么工作?統(tǒng)計(jì)在數(shù)據(jù)段1000H單元(ADDR)開始存放的16位數(shù)據(jù)中1的個(gè)數(shù),并將統(tǒng)計(jì)結(jié)果存放在COUNT單元中。71DATASEGMENTEXIT:MOV72例7在當(dāng)前數(shù)據(jù)段從偏移地址BUFFER開始

順序存放著100個(gè)無符號(hào)16位數(shù),現(xiàn)要編

寫程序?qū)⑦@100個(gè)字?jǐn)?shù)據(jù)從大到小排序。分析:排序的方法有很多,我們采用冒泡法實(shí)現(xiàn)。

這時(shí),需要兩重循環(huán)。外循環(huán)控制變量BL的初值為99,每次減1,而內(nèi)循環(huán)控制變量CL每次的初值等于當(dāng)時(shí)BL的值。設(shè)置DI為基本地址指針,初值指向BUFFER,另一個(gè)地址指針SI的初值每次總同DI的值,也就是說,內(nèi)循環(huán)總是從第一個(gè)數(shù)據(jù)開始。72例7在當(dāng)前數(shù)據(jù)段從偏移地址BUFFER開始73DS_SEGSEGMENTCOUNTDB4BLK1DB96H,74H,32H,16HBLK2DB65H,94H,87H,29HBLK3DB4DUP(?)DS_SEGENDSCS_SEGSEGMENTASSUMECS:CS_SEG,DS:DS_SEGMAINPROCFARSTART:PUSHDS

XORAX,AXPUSHAXMOVAX,DS_SEGMOVDS,AXMOVSI,OFFSETBLK1MOVDI,OFFSETBLK2MOVBX,OFFSETBLK3MOVCL,COUNTMOVCH,0CLCNEXT:MOVAL,[SI]INCSIADCAL,[DI]INCDIDAAMOV[BX],ALINCBXLOOPNEXTRETMAINENDPCS_SEGENDSENDSTART4H96H74H32H16H65H94H87H29HCOUNTBLK1BLK2BLK3SIDIBXBCD碼加法16327496298794654620696161H69H20H46H73DS_SEGSEGMENTNEXT:MOVA74DATASEGMENTTABLEDW1020H,2030H,3040H,4050H,5060HTEMPDW5DUP(0)COUNTDW5DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVCX,COUNTLEASITABLELEADI,TEMPCLDREPMOVSWLEASI,TEMPMOVCX,COUNTMOVDI,OFFSETTABLEMOVBX,CXSHLBX,1LOP1:DECBXDECBXMOVAX,[SI+BX]MOV[DI],AXADDDI,2LOOPLOP1MOVAX,4C00HINT21HRETMAINENDPCODEENDSENDSTARTREPMOVSW在指令中的功能是:循環(huán)程序段LOP1的功能是:程序運(yùn)行結(jié)束時(shí)TEMP+2,TEMP+0字單元的內(nèi)容程序運(yùn)行結(jié)束時(shí),DI的值為:復(fù)制數(shù)據(jù)塊TABLE到TEMP將原數(shù)據(jù)塊倒排2030H5060HTEMP或TABLE+1074DATASEGMENT75DATASEGMENTTABLEDW1020H,2030H,3040H,4050H,5060HTEMPDW5DUP(0)COUNTDW5DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVCX,COUNTLEASITABLELEADI,TEMP

CLDREPMOVSWLEASI,TEMPMOVCX,COUNTMOVDI,OFFSETTABLEMOVBX,CXSHLBX,1LOP1:DECBXDECBXMOVAX,[SI+BX]MOV[DI],AXADDDI,2LOOPLOP1MOVAX,4C00HINT21HRETMAINENDPCODEENDSENDSTART若將CLD改為STD,則程序運(yùn)行結(jié)束時(shí),TEMP+8字單元,TEMP字單元的內(nèi)容分別是:1020H1020H75DATASEGMENT76四、子程序設(shè)計(jì)對(duì)于一個(gè)子程序,應(yīng)該注意它的入口參數(shù)和出口參數(shù)。入口參數(shù)是由主程序傳給子程序的參數(shù),而出口參數(shù)是子程序運(yùn)算完傳給主程序的結(jié)果。另外,子程序所使用的寄存器和存儲(chǔ)單元往往需要保護(hù),以免影響返回后主程序的運(yùn)行。76四、子程序設(shè)計(jì)對(duì)于一個(gè)子程序,應(yīng)該注意它的入口參數(shù)和77參數(shù)傳遞一般有三種方法實(shí)現(xiàn)。(1)利用寄存器。這是一種最常見方法,把所需傳遞的參數(shù)直接放在主程序的寄存器中傳遞給子程序。(2)利用存儲(chǔ)單元。把所需傳遞的參數(shù)直接放在子程序調(diào)用指令之后或通過數(shù)據(jù)區(qū)傳遞。(3)利用堆棧。這種方法將參數(shù)壓入堆棧,在子程序運(yùn)行時(shí)從堆棧中取參數(shù)。

77參數(shù)傳遞一般有三種方法實(shí)現(xiàn)。78例1用子程序的方法實(shí)現(xiàn)兩個(gè)六字節(jié)數(shù)相

加。原始數(shù)據(jù)分別存放在ADD1和

ADD2開始的存區(qū),結(jié)果存放在SUM

單元。分析:子程序功能:完成一個(gè)字節(jié)數(shù)的加法。要求:入口參數(shù)SI、DI分別指向源操作數(shù),BX指向存放結(jié)果單元。主程序調(diào)用六次子程序。

78例1用子程序的方法實(shí)現(xiàn)兩個(gè)六字節(jié)數(shù)相

加79例2把數(shù)據(jù)段中的字變量NUMBER的值,轉(zhuǎn)換為4個(gè)用ASCII碼表示的十六進(jìn)制數(shù)碼串,存放在STRING開始的存區(qū)。分析:設(shè)計(jì)一個(gè)子程序,完成將AL中的16進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼,結(jié)果仍在AL中。轉(zhuǎn)換公式是:如果AL中的數(shù)字是小于10的,則AL+‘0’即可;對(duì)于大于10的數(shù),要轉(zhuǎn)換成字母。如果轉(zhuǎn)換成小寫字母僅需AL-10+‘a(chǎn)’。如果要轉(zhuǎn)換成大寫字母,可以是AL-10+‘A’。本題轉(zhuǎn)換成小寫字母。主程序只要從低位開始每次取出一位16進(jìn)制數(shù),調(diào)用子程序完成轉(zhuǎn)換后按次序保存結(jié)果即可。

79例2把數(shù)據(jù)段中的字變量NUMBER的值,轉(zhuǎn)換為4個(gè)80DATA SEGMENT

NUMBER DW 25AFH;定義原始數(shù)據(jù)

STRINGDB 4DUP(?);保存轉(zhuǎn)換后的ASCII碼

DATAENDS

CODESEGMENT

ASSUME CS:CODE,DS:DATA

HEXD PROC;定義過程

CMP AL,10

JB ADDZ;<10,轉(zhuǎn)移

ADD AL,‘a(chǎn)’-10;≥10,轉(zhuǎn)換成小寫字母

JMPHUI

ADDZ: ADD AL,‘0’;轉(zhuǎn)換成0~9的ASCII碼

HUI: RET

HEXD ENDP

80DATA SEGMENT

NUMBER DW 25AF81五、DOS功能調(diào)用81五、DOS功能調(diào)用82操作系統(tǒng)管理計(jì)算機(jī),為用戶提供與CPU對(duì)話的接口,也就是提供使用鍵盤和顯示器的通道,這樣,用戶不需要具體掌握這些接口的地址和輸入輸出數(shù)據(jù)的格式,直接執(zhí)行操作系統(tǒng)提供的命令就可以了。但是,在運(yùn)行用戶程序時(shí),DOS將操作權(quán)交給了用戶程序,這時(shí),用戶程序需要與鍵盤、顯示器等系統(tǒng)資源打交道該怎么辦?82操作系統(tǒng)管理計(jì)算機(jī),為用戶提供與CPU對(duì)話的接口,也就是83在高級(jí)語言中,可以通過調(diào)用編譯系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)。(這時(shí),編譯系統(tǒng)已把輸入輸出等操作功能做成函數(shù)的形式,用戶只要依據(jù)函數(shù)的格式進(jìn)行調(diào)用即可。)在匯編程序中,如果用戶程序要與輸入輸出設(shè)備打交道,就要調(diào)用現(xiàn)成的程序,這些程序是DOS系統(tǒng)的一部分,隨著DOS系統(tǒng)駐留內(nèi)存,DOS提供規(guī)定的接口格式供用戶調(diào)用。83在高級(jí)語言中,可以通過調(diào)用編譯系統(tǒng)提供的庫函數(shù)來實(shí)現(xiàn)。(84DOS系統(tǒng)功能調(diào)用的步驟:1)送入口參數(shù)(選用)2)調(diào)用號(hào)送AH3)執(zhí)行INT21H4)保護(hù)出口參數(shù)(選用)

84DOS系統(tǒng)功能調(diào)用的步驟:851)在顯示器上顯示單個(gè)字符(2號(hào)功能)功能:在屏幕的光標(biāo)處顯示單個(gè)字符入口參數(shù):要顯示字符的ASCII碼放在DL中出口參數(shù):無MOVDL,‘A’MOVAH,2INT21H;提供調(diào)用功能號(hào);系統(tǒng)功能調(diào)用;在屏幕光標(biāo)處顯示字符A運(yùn)行至此,屏幕上當(dāng)前光標(biāo)處顯示字符A851)在顯示器上顯示單個(gè)字符(2號(hào)功能)功能:在屏幕的光862)在屏幕上顯示字符串(9號(hào)功能)功能:在屏幕上當(dāng)前光標(biāo)處輸出存儲(chǔ)在內(nèi)存數(shù)據(jù)段的一串字符串,該字符串以‘$’結(jié)束。入口參數(shù):DS:DX指向欲顯示字符串的首址出口參數(shù):無DATASEGMENTSTRINGDB‘Iamastudent.$’DATAENDS……MOVDX,OFFSETSTRINGMOVAH,9INT21H;指向字符串首址;提供調(diào)用功能號(hào);系統(tǒng)功能調(diào)用運(yùn)行至此,屏幕上當(dāng)前光標(biāo)處顯示Iamastudent862)在屏幕上顯示字符串(9號(hào)功能)功能:在屏幕上當(dāng)前873)帶顯示的鍵盤輸入(1號(hào)功能)功能:等待鍵盤輸入,直到按下一個(gè)鍵。入口參數(shù):無出口參數(shù):鍵入鍵的ASCII碼放在AL中,并在屏幕上顯示該鍵。MOVAH,1INT21HMOV[2000H],AL……;提供調(diào)用功能號(hào);系統(tǒng)功能調(diào)用程序運(yùn)行到此停下,等待用戶鍵盤輸入用戶從鍵盤鍵入的鍵的ASCII碼進(jìn)入AL中873)帶顯示的鍵盤輸入(1號(hào)功能)功能:等待鍵盤輸入,884)不帶顯示的鍵盤輸入(7號(hào)功能)功能:等待鍵盤輸入,直到按下一個(gè)鍵。入口參數(shù):無出口參數(shù):鍵入鍵的ASCII碼放在AL中,但在屏幕上沒有顯示,常用于輸入密碼。MOVAH,7INT21HMOV[2000H],AL……;提供調(diào)用功能號(hào);系統(tǒng)功能調(diào)用程序運(yùn)行到此停下,等待用戶鍵盤輸入用戶從鍵盤鍵入的鍵的ASCII碼進(jìn)入AL中該功能與1號(hào)功能類似,只是輸入的字符不在屏幕上顯示。884)不帶顯示的鍵盤輸入(7號(hào)功能)功能:等待鍵盤輸入895)字符串輸入(10號(hào)功能)功能:等待從鍵盤輸入一串字符到存儲(chǔ)區(qū)的數(shù)據(jù)段,直到按下回車結(jié)束輸入。入口參數(shù):DS:DX指向接收字符串的內(nèi)存地址的首址,該地址的第一個(gè)字節(jié)是由用戶設(shè)置的可輸入字符串的最大字符數(shù)(含回車)出口參數(shù):存放輸入字符串存儲(chǔ)區(qū)的第二個(gè)字節(jié)是實(shí)際輸入的字符數(shù)(不含回車),實(shí)際輸入的字符串從該存儲(chǔ)區(qū)的第三個(gè)字節(jié)處開始存放。895)字符串輸入(10號(hào)功能)功能:等待從鍵盤輸入一串90DATASEGMENTBUFDB20,21DUP(?)DATAENDS……LEADX,BUFMOVAH,0AHINT21H14H程序運(yùn)行到此停下,等待用戶鍵盤輸入若輸入ABCD<CR>后BUFDX04H41H42H43H44H實(shí)際字符個(gè)數(shù)開始存放90DATASEGMENT14H程序運(yùn)行到此停下,等待用916)程序結(jié)束,返回DOS(4C號(hào)功能)功能:將控制權(quán)移交DOS。入口參數(shù):無出口參數(shù):無MOVAH,4CHINT21H916)程序結(jié)束,返回DOS(4C號(hào)功能)功能:將控92例1在屏幕上顯示W(wǎng)hat’syourname?,用戶輸入自己的名字###后顯示:Welcome###。

分析:首先采用9號(hào)調(diào)用輸出提示信息,然后采用10號(hào)調(diào)用接收用戶輸入。最后顯示歡迎字樣。92例1在屏幕上顯示W(wǎng)hat’syourname?93DATASEGMENTMEGDB‘What’syourname?’,10,13,’$’MEG1DB'Welcome$'BUFDB30,?,30DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADX,MEGMOVAH,9INT21HLEADX,BUFMOVAH,10INT21HLEADX,MEG1MOVAH,9INT21HXORBH,BHMOVBL,BUF+1MOV[BX+BUF+2],‘$’LEADX,BUF+2MOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDSTART;輸出字符串;接收姓名;輸出Welcome;輸出姓名;返回DOS在輸入姓名的結(jié)尾加‘$’顯示字符串后回車換行93DATASEGMENTLEA94例2要求從鍵盤重復(fù)接收字符(最多128個(gè))送BUFF緩沖區(qū),直到接收到回車符0DH為止。補(bǔ)充完善程序。DATASEGMENTBUFFDB128DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX_______________LOP:_______________INT21HMOV[SI],AL___________________________JNELOPMOVAH,4CHINT21HCODEENDSENDSTARTLEASI,BUFFMOVAH,1INCSICMPAL,0DH94例2要求從鍵盤重復(fù)接收字符(最多128個(gè))送BUFF95匯編語言程序設(shè)計(jì)1匯編語言程序設(shè)計(jì)96§3.1匯編語言基本元素2§3.1匯編語言基本元素97

由匯編語言編寫的源程序是由許多語句(也可稱為匯編指令)組成的。每個(gè)語句由1~4個(gè)部分組成,其格式是:[標(biāo)識(shí)符]指令助記符[操作數(shù)][;注解]

其中用方括號(hào)括起來的部分,可以有也可以沒有。每部分之間用空格(至少一個(gè))分開,一行最多可有132個(gè)字符。3.1.1匯編語言的語句格式3由匯編語言編寫的源程序是由許多語句(也可稱為匯編98(1)標(biāo)識(shí)符:給指令或某一存儲(chǔ)單元地址所起的名字。標(biāo)識(shí)符由下列字符組成:(以字母或圓點(diǎn)開頭)字母:A~Z,a~z;數(shù)字:0~9;特殊字符:?.@_$數(shù)字不能作標(biāo)識(shí)符的第一個(gè)字符,而.僅能作標(biāo)識(shí)符的第一個(gè)字符,標(biāo)識(shí)符最長為31個(gè)字符。標(biāo)識(shí)符后跟冒號(hào)時(shí)表示標(biāo)號(hào),代表該行指令的起始地址,標(biāo)號(hào)可以被轉(zhuǎn)移、調(diào)用指令直接引用。標(biāo)識(shí)符后不帶冒號(hào)時(shí)表示變量。偽指令前的標(biāo)識(shí)符不加冒號(hào)。

4(1)標(biāo)識(shí)符:給指令或某一存儲(chǔ)單元地址所起的名字。99(2)指令助記符

表示不同操作的指令,可以是8086/8088的指令助記符,也可以是偽指令。

(3)操作數(shù)

是指令執(zhí)行的對(duì)象。依指令的要求,可能有一個(gè)、兩個(gè)、沒有或者多個(gè)。

例如:RET;無操作數(shù)COUNT:INCCX;一個(gè)操作數(shù)

MOVCX,DI;兩個(gè)操作數(shù)ADDAX,[BP十4];第二個(gè)操作數(shù)為表達(dá)式

(4)注釋該項(xiàng)可有可無,是為源程序所加的注解,用于提高程序的可讀性。

5(2)指令助記符(3)操作數(shù)(4)注釋100匯編語言運(yùn)算符:是匯編程序在匯編時(shí)計(jì)算的,與運(yùn)算指令不同,指令是在程序運(yùn)行時(shí)計(jì)算的。1、算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符如:+、-、×、/、AND、OR、LT等MOVAX,[DI+BX]

ADDAX,FIRST+1MOVAX,((choiceLT20)AND5)OR((choiceGE20)AND6)3.1.2匯編語言運(yùn)算符6匯編語言運(yùn)算符:是匯編程序在匯編時(shí)計(jì)算的,與運(yùn)算指令不同,101注意:算術(shù)運(yùn)算符總可以用于數(shù)字操作,其結(jié)果也是數(shù)字的。當(dāng)應(yīng)用于存儲(chǔ)器操作數(shù)時(shí),只有+,-運(yùn)算符有意義;邏輯運(yùn)算符的操作數(shù)也必須是數(shù)字,存儲(chǔ)器操作數(shù)不能進(jìn)行邏輯運(yùn)算;關(guān)系運(yùn)算符連接的兩個(gè)操作數(shù),必須都是數(shù)字的或是在同一段內(nèi)的存儲(chǔ)器地址。7注意:1022、取值運(yùn)算符

1)$運(yùn)算符$:當(dāng)前地址偏移量的值BLOCKDB‘HELLO!’NUMEQU$-BLOCK‘H’‘E’‘L’‘L’‘O’‘!’BLOCK$;NUM為682、取值運(yùn)算符BLOCKDB‘HELLO!’‘103SEG和OFFSETSEG:求標(biāo)號(hào)或變量的段地址OFFSET:求標(biāo)號(hào)或變量的偏移地址例如,定義:SLOTDW25則:MOVAX,SLOT;

從SLOT地址中取一個(gè)字送入AXMOVAX,SEGSLOT;

將SLOT的段地址送入AXMOVAX,OFFSETSLOT;

將SLOT的段內(nèi)偏移地址送AX9SEG和OFFSET例如,定義:SLOTDW1043)TYPE返回標(biāo)號(hào)或存儲(chǔ)器操作數(shù)的類型值對(duì)存儲(chǔ)器操作數(shù):表示占用的字節(jié)數(shù)對(duì)標(biāo)號(hào):表示過程或指令地址的調(diào)用類型表3-1存儲(chǔ)器操作數(shù)的類型屬性及返回值字節(jié)字雙字NEARFAR124-1-2103)TYPE返回標(biāo)號(hào)或存儲(chǔ)器操作數(shù)的類型值表3-11054)LENGTH和SIZE(對(duì)用DUP定義數(shù)據(jù)的情況下)LENGTH:返回一個(gè)與存儲(chǔ)器操作數(shù)相聯(lián)系的基本數(shù)據(jù)個(gè)數(shù),

SIZE:返回一個(gè)為存儲(chǔ)器操作數(shù)分配的字節(jié)數(shù)關(guān)系:SIZE=LENGTH×TYPE例如:若MULT-WORDDW50DUP(0)則LENGTHMULT-WORD=50

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論