![微機(jī)接口原理第4章_第1頁](http://file4.renrendoc.com/view/1b57c8f2a2ebff0c3a32a7b96e8b6cb4/1b57c8f2a2ebff0c3a32a7b96e8b6cb41.gif)
![微機(jī)接口原理第4章_第2頁](http://file4.renrendoc.com/view/1b57c8f2a2ebff0c3a32a7b96e8b6cb4/1b57c8f2a2ebff0c3a32a7b96e8b6cb42.gif)
![微機(jī)接口原理第4章_第3頁](http://file4.renrendoc.com/view/1b57c8f2a2ebff0c3a32a7b96e8b6cb4/1b57c8f2a2ebff0c3a32a7b96e8b6cb43.gif)
![微機(jī)接口原理第4章_第4頁](http://file4.renrendoc.com/view/1b57c8f2a2ebff0c3a32a7b96e8b6cb4/1b57c8f2a2ebff0c3a32a7b96e8b6cb44.gif)
![微機(jī)接口原理第4章_第5頁](http://file4.renrendoc.com/view/1b57c8f2a2ebff0c3a32a7b96e8b6cb4/1b57c8f2a2ebff0c3a32a7b96e8b6cb45.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1微型計(jì)算機(jī)原理
與接口技術(shù)第四章第4章匯編語言及其程序設(shè)計(jì)2
4.1匯編語言源程序4.2偽
指
令4.3DOS系統(tǒng)功能調(diào)用教學(xué)目的了解匯編語言源程序的結(jié)構(gòu)掌握偽指令系統(tǒng)理解DOS功能調(diào)用掌握匯編語言源程序的設(shè)計(jì)方法4.4匯編語言程序設(shè)計(jì)基礎(chǔ)34.1.1匯編語言源程序結(jié)構(gòu)
匯編語言源程序結(jié)構(gòu)是指語句的格式和程序的組成部分。源程序結(jié)構(gòu)取決于匯編程序,不同的匯編程序要求的源程序結(jié)構(gòu)不同,不同CPU的匯編程序也不相同。不過功能大致相同的匯編語言其源程序結(jié)構(gòu)也大致相同。本章以80X86CPU所常用的MASM宏匯編程序?yàn)楸尘敖榻B匯編語言源程序結(jié)構(gòu)。4.1匯編語言源程序用匯編語言編寫的程序稱為匯編語言源程序,將匯編語言源程序翻譯成機(jī)器語言的系統(tǒng)程序稱為匯編程序(assembler),翻譯的過程叫做匯編(assemble)。41.匯編語言源程序的組成部分:數(shù)據(jù)段名SEGMENT ……數(shù)據(jù)段名ENDS附加數(shù)據(jù)段名SEGMENT ……附加數(shù)據(jù)段名ENDS堆棧段名SEGMENT ……堆棧段名ENDS代碼段名SEGMENT ……代碼段名ENDS END每段以SEGMENT語句開始整個(gè)程序以END語句結(jié)束以ENDS語句結(jié)束51.匯編語言源程序的組成部分先觀察下面的程序:【例題4-1】將STRING1中100個(gè)字節(jié)傳送到STRING2中。DATA SEGMENT;定義數(shù)據(jù)段STRING1 DB100DUP(55H)DATA ENDS;數(shù)據(jù)段結(jié)束EDATA SEGMENT;定義附加段STRING2 DB100DUP(?)EDATA ENDS;附加段結(jié)束STACK SEGMENT;定義堆棧段
DW 256DUP(?)STACKENDS ;堆棧段結(jié)束CODESEGMENT;定義代碼段
ASSUMECS:CODE,DS:DATA,ES:EDATA,SS:STACKSTART: MOVAX,DATA MOVDS,AX;初始化DS MOVAX,EDATA
MOVES,AX;初始化ES MOVAX,STACK MOVSS,AX MOVSI,OFFSETSTRING1;初始化源串指針
MOVDI,OFFSETSTRING2;初始化目的指針
MOVCX,100 ;初始化計(jì)數(shù)器
CLD ;設(shè)置DF=0,使SI和DI按增量變化,增量為1
REPMOVSB MOVAH,4CH INT21H CODEENDS;代碼段結(jié)束
ENDSTART6匯編語言源程序由若干段組成:數(shù)據(jù)段、附件數(shù)據(jù)段、堆棧段和代碼段等,段與段之間的順序可以隨意排列,每一段由SEGMENT開始,以ENDS結(jié)束,每段的開始和結(jié)束都附有相同的名字。一個(gè)程序一般定義三個(gè)段:數(shù)據(jù)段、堆棧段和代碼段,必要時(shí)增加定義附加數(shù)據(jù)段,能獨(dú)立運(yùn)行的程序至少包含一個(gè)代碼段。如果沒有堆棧段,程序在執(zhí)行時(shí)自動(dòng)使用操作系統(tǒng)提供的堆棧,因此匯編源程序時(shí)的警告信息“NOSTACKSEGMENT”可以忽略。72.匯編語言的語句格式匯編語言源程序中一行只能寫一個(gè)語句。每個(gè)語句可以有4部分:
標(biāo)號(名字)、操作碼助記符、操作數(shù)助記符和注釋。例如:BEGAIN:MOVAX,BX ;BX數(shù)據(jù)傳送給AX標(biāo)號是某條指令的地址,是用符號表示的地址,所以也叫符號地址。標(biāo)號后加冒號“:”。名字是變量、段或子程序的名字。例如【例題4-1】中的DATA、EDATA、STACK和CODE。名字后面沒有冒號“:”,與操作碼之間用空格分隔。操作碼和操作數(shù)之間用空格分隔,操作數(shù)之間用逗號分隔。分號表示注釋,用來說明程序或語句的功能,常跟在語句的后面,分號為注釋的開始。如果一行的第一個(gè)字符是“;”說明整行都是注釋,用來說明下面程序段的功能。匯編語言語句類型:指令性語句、指示性語句81.指示性語句
又稱為偽操作語句,它不是8088/8086CPU的指令,它與匯編程序(assembler)有關(guān)。指示性語句的功能主要是變量定義、為數(shù)據(jù)分配存儲(chǔ)空間、告訴匯編程序如何對源程序匯編等。源程序匯編后指示性語句不生成目標(biāo)代碼,所以常被稱為偽指令。指示性語句的一般格式:名字偽操作碼助記符操作數(shù),操作數(shù)…;注釋例如:DATA SEGMENT ;定義數(shù)據(jù)段STRING1 DB100DUP(55H)DATA ENDS;數(shù)據(jù)段結(jié)束名字與偽操作助記符之間用空格分隔,名字由程序員設(shè)置。9指令性語句指令性語句是可執(zhí)行語句,是8088/8086CPU的指令。源程序匯編后指令性語句生成目標(biāo)代碼。第3章中介紹的所有指令都是指令性語句的主體,其操作數(shù)最多只能有兩個(gè)。指令性語句的一般格式:標(biāo)號:操作碼助記符操作數(shù)助記符,操作數(shù)助記符;注釋例如:【例題4-1】中語句“START:MOVAX,DATA”和語句“INT21H”之間的所有語句都是指令性語句。START是標(biāo)號,可根據(jù)需要由程序員設(shè)置。標(biāo)號表示指令的符號地址,可以作為轉(zhuǎn)移指令、循環(huán)指令和調(diào)用指令的操作數(shù),標(biāo)號后面要加冒號。10指令性語句和指示性語句在格式上的區(qū)別:1.標(biāo)號和名字指令性語句的標(biāo)號是指令的符號地址,后邊通常加上’:’
名字通常表示變量名、段名和過程名,后邊不加’:’2.操作數(shù)指令性語句的操作數(shù)最多有2個(gè),可以沒有指示性語句中的操作數(shù)至少要有1個(gè),可以有多個(gè),相互之間用逗號分開114.1.2匯編語言源程序的處理過程CPU只能執(zhí)行機(jī)器語言程序,匯編語言畢竟不是機(jī)器語言,匯編語言程序必須通過具有“翻譯”功能的系統(tǒng)程序的處理。匯編程序(Assembler)就是處理匯編語言源程序的系統(tǒng)程序,處理的過程稱為匯編。源程序經(jīng)過匯編生成機(jī)器語言目標(biāo)程序,簡稱目標(biāo)程序。目標(biāo)程序經(jīng)過連接程序連接,就得到可執(zhí)行文件。匯編語言源程序Good.asm匯編MASM連接Link可執(zhí)行文件Good.exe機(jī)器語言目標(biāo)程序
Good.obj圖4-1匯編語言源程序的處理過程124.1.3匯編語言中的操作數(shù)匯編語言語句中的操作數(shù)可以是寄存器、存儲(chǔ)器單元、常量、變量、名字、標(biāo)號和表達(dá)式。1.常量常量也稱常數(shù),有數(shù)值常量和字符常量兩種。數(shù)值常量可以是二進(jìn)制數(shù)、十進(jìn)制數(shù)和十六進(jìn)制數(shù)。十六進(jìn)制數(shù)若是以字母(A~F)開始,需在前面加一個(gè)數(shù)字0,用以說明這是數(shù)值常量,不是字符串。例如:
MOVAX,0D3A9H 字符常量是用單引號括起來的字符或字符串,源程序匯編之后它們轉(zhuǎn)換為相應(yīng)的ASCII碼。例如:MOV AL,‘A’ ;AL=41HVAR DB‘Hello’ ;相當(dāng)于VARDB48H,65H,6CH,6CH,6FH 132.變量變量是指存儲(chǔ)單元中的數(shù)據(jù),這些數(shù)據(jù)在程序運(yùn)行中可以修改變化,因此稱其為變量。每個(gè)變量可以有一個(gè)名字(變量名),也可以沒有。一個(gè)變量名可以表示一個(gè)數(shù)據(jù)或一組類型相同的數(shù)據(jù),即一個(gè)變量名可以是一個(gè)數(shù)據(jù)的符號地址,也可以是一組數(shù)據(jù)的符號首地址。變量名可以作為存儲(chǔ)器操作數(shù)使用。例如: STR DB'STRING' NUM DW0AAH,23H LAB0 DQ01A4578H14變量在除了代碼段之外的其他段中定義,有段、偏移量和類型三種屬性。段屬性:變量所在的段。偏移量屬性:變量的偏移地址。類型屬性:變量所存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)類型,有:BYTE、WORD、DWORD、DQ(8個(gè)字節(jié))、DT(10個(gè)字節(jié))。
153.標(biāo)號與名字標(biāo)號在代碼段中定義,后面跟冒號,是指令的符號地址。標(biāo)號經(jīng)常作為轉(zhuǎn)移指令、循環(huán)指令和調(diào)用指令的操作數(shù)。標(biāo)號有三種屬性:段、偏移量和類型。段屬性:標(biāo)號所在的段。偏移量屬性:標(biāo)號的偏移地址。類型屬性:標(biāo)號是在本段內(nèi)還是在其他段內(nèi),在本段內(nèi)稱為近地址屬性(NEAR),在其他段內(nèi)稱為遠(yuǎn)地址屬性(FAR),近地址屬性NEAR可以省略。16例如:
… LEA SI,VAR MOV CX,100 XOR AX,AX COUNT: ADD SI,2 ADD AX,[SI]
LOOPCOUNT MOV SUM,AX …;COUNT的屬性為近地址屬性NEAR17名字通常指的是段名、變量名和子程序名,其后不跟冒號。標(biāo)號與名字的用法作用不同,但設(shè)置方法卻一樣。可以使用:大小寫英文字母數(shù)字0~9特殊字符??@#$標(biāo)號或名字中的第一個(gè)字符必須是英文字母或圓點(diǎn)?,整體最長不能超過31個(gè)字符,不能使用指令助記符、寄存器名及匯編語言指令系統(tǒng)中的保留字。標(biāo)號和名字由程序員確定。184.表達(dá)式表達(dá)式由常量、變量和標(biāo)號通過運(yùn)算符結(jié)合而成。表達(dá)式中的運(yùn)算在匯編時(shí)完成,運(yùn)算結(jié)果可以是操作數(shù)也可以是操作數(shù)地址。例如下面指令中的源操作數(shù):
MOV AX,SEGVAR MOVBX,5MOD3 ADD AL,LAB*5+DATA19表達(dá)式中的常用運(yùn)算符(1)算術(shù)運(yùn)算符:
+、-、*、/、MODMOD是指除法運(yùn)算的余數(shù),如15MOD7結(jié)果為1。MOVAX,15MOD7 ;匯編之后為MOVAX,1MOVDX,ARRAY+(7-1)*2(2)邏輯運(yùn)算符:AND、OR、NOT、XOR邏輯運(yùn)算符只能用于數(shù)字表達(dá)式,不能用于地址表達(dá)式中。CMP AL,04HAND75H ;匯編之后為CMPAL,0420(3)關(guān)系運(yùn)算符:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)關(guān)系運(yùn)算符對兩個(gè)性質(zhì)相同的數(shù)據(jù)進(jìn)行運(yùn)算,可以構(gòu)成數(shù)字表達(dá)式或地址表達(dá)式,運(yùn)算的結(jié)果應(yīng)為邏輯值:關(guān)系成立結(jié)果為真,輸出為全1;關(guān)系不成立結(jié)果為假,輸出為0。例如:DATA和NUM為常量,DATA=5AHNUM=35HMOVBX,DATAGTNUM ;匯編之后為MOVBX,0FFFFHMOVBX,DATAEQNUM ;匯編之后為MOVBX,021(4)取值運(yùn)算符:TYPE、SIZE、OFFSET、SEGTYPEVariable或label取變量或標(biāo)號的類型。變量的類型值:DB為1、DW為2、DD為4、DQ為8、DT為10,標(biāo)號的類型值:NEAR為-1;FAR為-2例如: NUMDW0375H,982AH,793EH;定義變量
ADDSI,TYPENUM ;匯編之后為ADDSI,222
SIZEVariable取變量的所有操作數(shù)的字節(jié)數(shù),也稱為大小運(yùn)算符。例如: LAB0 DB34,65,28LAB1 DW100DUP(3755H) MOV CX,SIZELAB0 ;匯編之后為MOVCX,3 MOV AX,SIZELAB1 ;匯編之后為MOVCX,200OFFSETVariable或label取變量或標(biāo)號的偏移地址。例如:
MOVBX,OFFSETNUM ;與LEABX,NUM指令等價(jià)23SEGVariable或label取變量或標(biāo)號的段基址。例如:
MOVBX,SEGNUM ;取NUM所在段的段基址(5)修改屬性運(yùn)算符:PTR修改操作數(shù)的類型,操作僅限于本條指令。例如:MOVBX,WORDPTRLAB0段超越前綴“:”用來表示一個(gè)標(biāo)號、變量或地址表達(dá)式的段屬性。例如:MOVAX,ES:[BX+SI]24注意:在計(jì)算表達(dá)式值時(shí),括號內(nèi)的表達(dá)式優(yōu)先計(jì)算,然后按運(yùn)算符的優(yōu)先順序計(jì)算,對優(yōu)先級相同的運(yùn)算符按從左到右的順序進(jìn)行計(jì)算。運(yùn)算符的優(yōu)先級別從高到低的排列次序如下:在圓括號中的項(xiàng),方括號中的項(xiàng)PTR、OFFSET、SEG、TYPE*、/、MOD、SHL、SHR+、-EQ、NE、LT、LE、GT、GE
NOT,AND,然后是OR和XOR254.2偽指令匯編語言中的指示性語句也稱為偽指令。偽指令由匯編程序處理,不生成目標(biāo)代碼,不參與程序的執(zhí)行。宏匯編程序MASM設(shè)置了幾十種偽指令,下面簡單介紹一些常用的偽指令:設(shè)定段寄存器偽指令數(shù)據(jù)定義偽指令符號定義偽指令過程定義偽指令宏命令偽指令模塊定義與連接偽指令264.2.1段定義偽指令段定義偽指令SEGMENT和ENDS格式:段名 SEGMENT[定位類型][組合類型][類別]…
段名 ENDS例如:
DATASEGMENTBUFFERDB100DUP(?)COUNTDW100DATAENDS272.ASSUME偽指令格式:ASSUME段寄存器名:段名[,段寄存器名:段名],…ASSUME偽指令說明段名和段基址寄存器之間的關(guān)系,但它不能給段寄存器賦值,段寄存器的值需要在代碼段中由指令性語句賦值。例如:ASSUMECS:CSEG,DS:DSEG,SS:SSEG,ES:EDSEG
說明CSEG段是代碼段,DSEG段是數(shù)據(jù)段,SSEG段是堆棧段,EDSEG段是附加數(shù)據(jù)段。28【例題4-2】測試內(nèi)存TAB單元內(nèi)的數(shù)為奇數(shù)還是偶數(shù),如是奇數(shù)則BX置成0FFFFH;如是偶數(shù)BX置成0。DSEG SEGMENT;默認(rèn)定位類型PARA,默認(rèn)組合類型NONETAB DB?DSEG ENDSSSEG SEGMENTSTACK ;默認(rèn)定位類型PARA,組合類型為STACK DW 256DUP(0)SSEGENDS CSEGSEGMENT;默認(rèn)定位類型PARA,默認(rèn)組合類型NONEASSUMECS:CSEG,DS:DSEG,SS:SSEG START:MOVAX,DSEG MOVDS,AX;給DS段寄存器賦值
MOVAX,SSEG MOVSS,AX ;給SS段寄存器賦值
MOVAL,TAB TEST AL,01H ;測試BX中最低位的邏輯值
JZ EVEN1 ;ZF=1,AL為偶數(shù)轉(zhuǎn)移至EVEN處執(zhí)行 MOV BX,0FFFFH ;AL為奇數(shù),設(shè)置奇數(shù)標(biāo)志 JMP CONEVEN1:MOV BX,0 ;設(shè)置偶數(shù)標(biāo)志CON: MOV AH,4CH INT 21H CSEGENDS;代碼段結(jié)束
ENDSTART294.2.2數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令也稱為變量定義偽指令,或存儲(chǔ)單元分配偽指令。它用來定義變量、確定變量的類型、給變量賦初值、為變量分配存儲(chǔ)空間等。格式:[變量名]偽操作助記符[操作數(shù)1][,操作數(shù)2]…
DATASEGMENT STR DB'STRING' NUM DW0AAH,23H LAB0 DQ01A4578H DATAENDS30數(shù)據(jù)變量有5種定義命令,如下:DB:定義變量為字節(jié)類型,其后的每個(gè)操作數(shù)都占一個(gè)字節(jié)。DW:定義變量為字類型,其后的每個(gè)操作數(shù)都占兩個(gè)字節(jié)。DD:定義變量為雙字類型,其后的每個(gè)操作數(shù)都占二個(gè)字,即四個(gè)字節(jié)。DQ:定義變量為四個(gè)字類型,其后的每個(gè)操作數(shù)都占四個(gè)字,即八個(gè)字節(jié)。DT:定義變量為十個(gè)字節(jié),其后的每個(gè)操作數(shù)都占十個(gè)字節(jié)。31例如:
VAR DB67H,4FH,7AH;定義VAR為字節(jié)類型變量,3個(gè)字節(jié)類型的操作數(shù)順序存儲(chǔ)在以VAR為首地址的連續(xù)內(nèi)存單元中,每個(gè)操作數(shù)占一個(gè)內(nèi)存單元。注意:使用變量時(shí),變量的類型必須與指令的要求相符。例如:MOVAL,VAR;AL=67H67H4FH7AHVAR137A0H137A1H137A2H137A3H137A4H137A5H32DELAY DW98A3H,17D9H;定義DELAY為字類型變量,2個(gè)字類型的操作數(shù)順序存儲(chǔ)在以DELAY為首地址的連續(xù)內(nèi)存單元中,每個(gè)操作數(shù)占2個(gè)內(nèi)存單元。例如:MOVBX,DELAY+2;BX=17D9HA3H98HD9H17H200A0H200A1H200A2H200A3H200A4H200A5HDELAY33NUM DD0AAH,3EF6AC23H ;定義NUM為雙字類型變量,2個(gè)雙字類型的操作數(shù)順序存儲(chǔ)在以NUM為首地址的連續(xù)內(nèi)存單元中,每個(gè)操作數(shù)占4個(gè)內(nèi)存單元。237A0H237A1H237A2H237A3H237A4H237A5HAAH00H00H00H23HACHF6H3EHNUM34從NUM中取一個(gè)字,應(yīng)使用如下方法:例如:MOVSI,OFFSETNUM MOVCX,[SI]下列用法錯(cuò):
MOVCX,NUM ;指令錯(cuò)誤
LAB0 DQ01A4578H ;定義LAB0為4字類型變量,操作數(shù)存儲(chǔ)在以LAB0為首地址的連續(xù)8個(gè)內(nèi)存單元中。LAB1DT3958235434H ;定義LAB1為10個(gè)字節(jié)類型變量,操作數(shù)存儲(chǔ)在以LAB1為首地址的連續(xù)10個(gè)內(nèi)存單元中。注意:多字節(jié)數(shù)據(jù)在內(nèi)存中存放時(shí)遵守“低位存于低地址中,高位存于高地址中”的原則。35【例題4-3】數(shù)據(jù)段中變量的內(nèi)存分配。DATA SEGMENTSTR DB'STRING'NUM DW0AAH,23H LAB0 DQ01A4578HENDSAAH0023H0078H45H1AH0000000000’S’‘T’‘R’‘I’’N’’G’DS:0HDS:1HDS:2HDS:3HDS:4HDS:5H...DS:0FHDS:10HDS:11HSTRNUMLAB036數(shù)據(jù)定義偽指令中的操作數(shù)可以是數(shù)值型常量、字符串常量,也可以是常量表達(dá)式,還可以是問號?,問號表示預(yù)留相應(yīng)數(shù)量的存儲(chǔ)單元,但不存入數(shù)據(jù)。例如:DATA1 DW16*9,55*3 DATA2DB?,? 變量DATA2有2個(gè)字節(jié)類型的操作數(shù),為每個(gè)操作數(shù)預(yù)留2個(gè)存儲(chǔ)單元,不進(jìn)行初始化。90H00HA5H00H--DATA1137A0H137A1H137A2H137A3H137A4H137A5HDATA237如果操作數(shù)很多而且相同,可以使用重復(fù)數(shù)據(jù)操作符DUP定義變量。例如:DATA3DB6DUP(AAH) DATA4 DB3DUP(?,55H,?)變量DATA3有6個(gè)操作數(shù),初始化為AAH;變量DATA4有3組操作數(shù),每組為3個(gè),共9個(gè)字節(jié)類型的操作數(shù)。-55H--55H--55H-AAHAAHAAHAAHAAHAAH20000H20001H20002H20003H20004H20005H20006H20007H20008H20009H2000AH2000BH2000CH2000DH2000EH2000FHDATA3DATA4384.2.3符號定義偽指令符號定義偽指令也稱為賦值偽指令。在程序中有時(shí)會(huì)多次出現(xiàn)同一個(gè)數(shù)值或表達(dá)式,通常可以用賦值偽指令將其賦給一個(gè)符號,程序中凡是用到該數(shù)值或表達(dá)式的地方都用這個(gè)符號代替,這樣既提高了程序的可讀性又使程序易于修改。有2條符號定義偽指令:
EQU和=
391.EQU偽指令格式:符號名EQU表達(dá)式例如:
CONSEQU10 ;常數(shù)賦給符號CONSALPHAEQUCONS×9-32;常數(shù)賦給符號ALPHAADDREQUALPHA[SI]+8;地址表達(dá)式賦給符ADDRLOADEQUMOV ;助記符賦給符號注意:表達(dá)式中如果有變量或符號,則應(yīng)該在該語句之前定義它們。在同一個(gè)程序中,一個(gè)符號不能定義兩次。用法: MOVAL,ALPHA CMPAL,CONS JMPWORDPTRADDR40=偽指令格式:符號名=表達(dá)式說明:功能與EQU一樣,給符號賦值,唯一的區(qū)別是可以對一個(gè)符號名重復(fù)定義。例如:
NUM=8 NUM=NUM+6這兩條偽指令匯編之后,NUM=14,一般等號偽指令定義數(shù)值常量。414.2.4過程定義偽指令過程定義偽指令也稱為子程序定義偽指令。在程序中常常有一些功能相對獨(dú)立的程序段重復(fù)出現(xiàn),通常將它定義為過程或稱為子程序,在程序中需要這種功能時(shí)只要使用調(diào)用命令CALL調(diào)用它就可以了。過程定義偽指令的格式: 過程名PROC[屬性] …
過程名ENDP說明:過程名(procedurename)為標(biāo)識符,由程序員設(shè)置。過程名是子程序入口的符號地址,即是子程序的第一條指令性語句的符號地址。過程的屬性可以是NEAR或FAR,過程與調(diào)用命令在同一個(gè)代碼段,過程的屬性可以設(shè)置為NEAR類型;過程與調(diào)用命令不在同一個(gè)代碼段,過程的屬性應(yīng)該設(shè)置為FAR類型。NEAR為缺省屬性。42DELAY PROCNEAR PUSH AX PUSH CX MOV AX,0FFFFHNEXT: MOV CX,AXNEXT1: LOOPNEXT1 DEC AX JNZ NEXT POP CX POP AX RETDELAY ENDP43可以使用CALL指令調(diào)用DELAY,也可以用JMP指令跳轉(zhuǎn)到DELAY例如:CSEGSEGMENTASSUMECS:CSEG,DS:DSEG START:MOVAX,DSEG
MOVDS,AX MOVAX,ARRAY … CALL DELAY …MOV AH,4CH INT 21H CSEGENDSENDSTART44一個(gè)過程可以調(diào)用其他的過程,這稱為過程嵌套。例如:MAIN PROC FAR … CALL SUB …RETMAIN ENDP SUB PROC NEAR … RETSUB ENDP過程也可以調(diào)用自己,稱為遞歸調(diào)用。454.2.5程序結(jié)束偽指令程序結(jié)束偽指令告訴匯編程序MASM源程序到此結(jié)束,并附帶說明程序從哪開始執(zhí)行。格式:END[標(biāo)號]
END為偽操作符,標(biāo)號為程序開始執(zhí)行的指令的符號地址。如果程序包含多個(gè)模塊,只有主程序模塊的結(jié)束偽指令END后可以加標(biāo)號,其他程序模塊的END后不能指定標(biāo)號。464.2.6其他較常見偽指令簡介1.程序開始偽指令NAME格式:NAME模塊名功能:定義本程序模塊的名字,告訴匯編程序MASM:源程序從這開始。2.標(biāo)題定義偽指令TITLE格式:TITLE標(biāo)題字符串功能:打印源程序清單時(shí),標(biāo)題字符串作為每一頁的標(biāo)題。標(biāo)題字符串對程序模塊的功能有說明作用,最多可有60個(gè)字符。如程序中沒有NAME偽指令,則匯編程序?qū)?biāo)題字符串中的前6個(gè)字符作為模塊名。如果程序中既無NAME也無TITLE偽指令,源程序文件名就作為模塊名。473.ORG偽指令格式:ORG表達(dá)式功能:指定后面的指令或數(shù)據(jù)從表達(dá)式指出的地址(偏移地址)開始存放。484.3DOS系統(tǒng)功能調(diào)用DOS操作系統(tǒng)為用戶提供的系統(tǒng)功能調(diào)用有兩種,一種稱為BIOS功能調(diào)用,也叫低級調(diào)用,調(diào)用它們可以驅(qū)動(dòng)磁盤、控制顯示器輸出、驅(qū)動(dòng)打印機(jī)和管理時(shí)鐘;另一種稱為DOS功能調(diào)用,也叫高級調(diào)用,調(diào)用它們可以管理內(nèi)存、管理設(shè)備、管理文件和目錄。8088/8086微機(jī)系統(tǒng)中21H號中斷被稱為DOS系統(tǒng)功能調(diào)用,它的內(nèi)部提供了八十多個(gè)功能子程序,可以實(shí)現(xiàn)字符輸入、字符顯示和打印、磁盤讀寫、文件建立打開關(guān)閉、文件讀寫等功能,基本上滿足了普通程序員的編程需要。為了調(diào)用方便,系統(tǒng)對這些功能子程序順序編號,稱為功能號。調(diào)用的步驟如下:①把要調(diào)用的功能號送AH寄存器②根據(jù)調(diào)用要求設(shè)置入口參數(shù)③INT21H491.輸入單個(gè)字符從鍵盤輸入單個(gè)字符可以使用1、7、8號功能。1號功能接收鍵盤輸入的字符保存在AL中并顯示在屏幕上。7、8號功能接收鍵盤輸入的字符保存在AL中但不顯示。它們都不需要入口參數(shù)。例如:
MOV AH,1 INT 21H這兩條指令執(zhí)行后,光標(biāo)在屏幕上閃動(dòng),等待鍵盤按鍵。一旦有鍵按下,其ASCII碼存入AL中,字符顯示在屏幕上。502.輸入字符串(0AH)從鍵盤輸入字符串存入指定的內(nèi)存區(qū)域。入口參數(shù)為DS:DX,即指定的內(nèi)存區(qū)域應(yīng)該在DS段,首地址應(yīng)該存入DX寄存器。使用0AH號功能前首先要定義一個(gè)數(shù)據(jù)區(qū),要求數(shù)據(jù)區(qū)的的第一個(gè)字節(jié)含有允許輸入的最大字符個(gè)數(shù)(包括回車符),第二個(gè)字節(jié)用于存放實(shí)際輸入的字符個(gè)數(shù),從第三個(gè)字節(jié)開始作為字符串存儲(chǔ)空間。如果計(jì)劃最多輸入10個(gè)字符,數(shù)據(jù)區(qū)的定義方法如下:
BUFF DB10,0,10DUP(?)51BUFF數(shù)據(jù)區(qū)允許輸入的最大字符個(gè)數(shù)為10個(gè),若實(shí)際輸入的字符個(gè)數(shù)(包括回車符)超過10個(gè),則后面的字符由于沒有存儲(chǔ)空間而被丟棄,且喇叭會(huì)發(fā)出嘟嘟聲報(bào)警,直到鍵入回車符。BUFF數(shù)據(jù)區(qū)的第二個(gè)字節(jié)初始化為0,0A號功能執(zhí)行時(shí)會(huì)把實(shí)際鍵入的字符數(shù)(不包括回車符)置入其中。如果實(shí)際鍵入的字符數(shù)不足10個(gè),字符存儲(chǔ)空間還有空余,空余的空間置0。一般在定義數(shù)據(jù)區(qū)時(shí),會(huì)比計(jì)劃輸入的字符數(shù)多一些。調(diào)用0A號功能的方法如下:MOVDX,OFFSETBUFFMOVAH,0AHINT 21H52【例4-4】從鍵盤上輸入字符串‘WELCOME’DATASEGMENT BUFF DB10,0,10DUP(?);定義數(shù)據(jù)區(qū)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVDX,OFFSETBUFF MOV AH,0AH;功能號送AH INT21H; 功能調(diào)用
MOV AH,4CH INT21HCODE ENDSENDSTART0AH07H‘W’‘E’’L’’C’’O’’M’’E’0DH--DS:0HDS:1HDS:2HDS:3HDS:4HDS:5H...BUFF圖4-6字符串輸入533.顯示單個(gè)字符(02H)入口參數(shù):DL,將待顯示字符的ASCII碼送DL寄存器。例如在屏幕上顯示大寫字母B,可以用下面的3條指令實(shí)現(xiàn):
MOVDL,'B' ;待顯示字符的ASCII碼送DL MOVAH,2 ;功能號送AH INT21H ;功能調(diào)用4.顯示字符串(09H)將字符串顯示在屏幕上。入口參數(shù):DS:DX,字符串必須以‘$’結(jié)尾?!纠?-5】在屏幕上顯示字符串。54DATA SEGMENT STRINGDB'WELCOMETOJILINUNIVERSITY','$'DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSETSTRING ;設(shè)置入口參數(shù)
MOV AH,09H ;功能號送AH INT 21H ;功能調(diào)用
MOV AH,4CH INT 21HCODE ENDS ENDSTART
注意:9號功能要求字符串在數(shù)據(jù)段DS中,調(diào)用之前應(yīng)將字符串首地址送至DX。555.返回操作系統(tǒng)4CH號功能調(diào)用使程序正常結(jié)束并返回操作系統(tǒng),調(diào)用方法如下:
MOV AH,4CH INT21H21H號中斷內(nèi)包含有豐富的系統(tǒng)功能調(diào)用,如果想查看更多的系統(tǒng)功能調(diào)用,可以參考附錄。564.4.1匯編語言程序設(shè)計(jì)步驟(1)分析問題確定算法對應(yīng)用問題及其環(huán)境的分析是編程的第一步,追蹤問題中的數(shù)據(jù)流向及條件,將問題模塊化。明確程序運(yùn)行要求和數(shù)據(jù)輸入輸出形式的要求,找出合理的算法,建立恰當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)。(2)畫出程序流程圖根據(jù)算法和數(shù)據(jù)結(jié)構(gòu),畫出程序流程圖。(3)編寫程序分配數(shù)據(jù)存儲(chǔ)空間、設(shè)計(jì)參數(shù)傳遞方法、確定各寄存器的功能,繼而用指令和偽指令實(shí)現(xiàn)程序流程圖中指定的功能,形成匯編語言源程序。(4)上機(jī)調(diào)試程序
將源程序匯編,剔除語法錯(cuò)誤,生成目標(biāo)代碼文件;將目標(biāo)代碼文件鏈接生成可執(zhí)行文件,利用調(diào)試工具(如DEBUG等)對可執(zhí)行文件進(jìn)行調(diào)試,經(jīng)過調(diào)試確定程序的正確性。4.4匯編語言程序設(shè)計(jì)基礎(chǔ)574.4.2順序程序設(shè)計(jì)【例4-6】編寫計(jì)算S=A*B-C的程序,A、B、C是無符號字節(jié)變量,S是字變量。DATASEGMENTA DB38;定義數(shù)據(jù)
B DB54 C DB16S DW?;為運(yùn)算結(jié)果保留存儲(chǔ)空間DATAENDSCODE SEGMENTASSUMECS
:CODE,DS
:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,AMOVBL,B MULBL ;A*B,結(jié)果存在AX中
MOVBL,CMOVBH,0 SUBAX,BX ;AX-C,結(jié)果在AX中
MOVS,AX;保存計(jì)算結(jié)果
MOVAH,4CHINT21H;返回操作系統(tǒng)CODEENDSENDSTART
58【例4-7】在內(nèi)存中從TABLE單元開始的連續(xù)16個(gè)單元中,存放著0~15的平方
值(平方表),查表求任意數(shù)X(0≤X≤15)的平方值,將結(jié)果保存在RESULT中DATASEGMENTTABLEDB0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225XDB11RESULTDB?;定義結(jié)果存放單元DATAENDSSTACKSEGMENTSTACK'STACK'DW100DUP(?);定義堆??臻gSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOVAX,DATA ;初始化數(shù)據(jù)段
MOVDS,AX MOVAX,STACK ;初始化堆棧
MOVSS,AX LEABX,TABLE ;設(shè)置平方表的基地址 MOVAH,0 MOVAL,X ;取待查數(shù)
ADDBX,AX ;計(jì)算在表中具體地址
MOVAL,[BX] MOVRESULT,AL ;X的平方數(shù)存入RESULT
MOVAH,4CH INT21HCODEENDS ENDSTART19H24H31H40H51H64H79H90HA9HC4HE1H0H1H4H9H10HDS:0HDS:1HDS:2HDS:3HDS:4HDS:5HDS:6HDS:7HDS:8HDS:9HDS:AHDS:BHDS:CHDS:DHDS:EHDS:FHTABLE圖4-7變量的內(nèi)存分配594.4.3分支程序設(shè)計(jì)分支程序結(jié)構(gòu)分為簡單分支結(jié)構(gòu)和多分支結(jié)構(gòu)兩種形式簡單分支程序設(shè)計(jì)一般用條件轉(zhuǎn)移指令實(shí)現(xiàn)簡單分支程序設(shè)計(jì)。條件成立就轉(zhuǎn)移到程序段1執(zhí)行,否則按原順序執(zhí)行指令。比較或測試指令條件?順序執(zhí)行程序段1成立不成立圖4.8簡單分支程序結(jié)構(gòu)60【例4-8】在數(shù)據(jù)段中DATA單元和DATA+1單元各存有一個(gè)無符號數(shù),比較兩數(shù)的大小,大的存入DATA單元,小的存入DATA+1單元。程序段如下: MOV AL,DATA CMP AL,DATA+1 ;比較
JNC CHANGE;DATA≥DATA+1,轉(zhuǎn)移到CHANGE MOV BL,DATA+1 ;條件不成立順序執(zhí)行
MOV DATA,BL ;交換
MOV DATA+1,ALCHANGE: ...612.多分支程序設(shè)計(jì)匯編語言語句功能簡單,多分支程序是簡單分支的嵌套。比較或測試指令順序執(zhí)行圖4.9多分支程序結(jié)構(gòu)條件1?成立不成立程序段1條件2?成立不成立程序段2條件3?成立不成立程序段362【例4-9】在提示信息‘PLEASEINPUTCHARACTER:’后從鍵盤輸入字符,如果輸入的是ESC鍵,則結(jié)束程序;如果輸入的是小寫字母則顯示;如果是大寫字母,則轉(zhuǎn)換為小寫字母顯示。DATA SEGMENTMESSAGEDB0DH,0AH,'PLEASEINPUTCHARACTER:',0DH,0AH,'$'DATA ENDSSTACK SEGMENTSTACK'STACK' DW100DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOVAX,DATA MOV DS,AX
MOV AX,STACK MOV SS,AXMAS: MOV DX,OFFSETMESSAGE MOV AH,9 INT 21H63AGAIN: MOV AH,1 INT 21H CMP AL,1BH JE EXIT ;是ESC,轉(zhuǎn)移到EXIT CMP AL,61H JC LOW0 ;是大寫字母,轉(zhuǎn)移到LOW0 CMP AL,7BH JC LOW1 ;是小寫字母,轉(zhuǎn)移到LOW1 JMP MASLOW0: ADD AL,20H ;加上20H轉(zhuǎn)換為小寫字母的ASCIILOW1: MOV DL,AL MOV AH,2 INT 21H JMP AGAINEXIT: MOV AH,4CH INT 21HCODE ENDS END START644.4.4循環(huán)程序設(shè)計(jì)循環(huán)程序結(jié)構(gòu)由循環(huán)初始化、循環(huán)體和循環(huán)控制三部分組成。循環(huán)程序結(jié)構(gòu)有兩種:先執(zhí)行后判斷和先判斷后執(zhí)行。設(shè)置循環(huán)初值設(shè)置循環(huán)初值滿足循環(huán)控制條件嗎?嗎?循環(huán)體循環(huán)體滿足循環(huán)控制條件嗎?嗎?是是否否圖4-10循環(huán)控制程序結(jié)構(gòu)65①循環(huán)初始化,用來設(shè)置循環(huán)初始值,如設(shè)置循環(huán)計(jì)數(shù)器初值、設(shè)置地址指針首地址和初始數(shù)據(jù)等。②循環(huán)體,是循環(huán)的主體,包括循環(huán)要完成的具體操作和修改循環(huán)參數(shù),如地址指針修改、計(jì)數(shù)值的修改。③循環(huán)控制,測試循環(huán)條件,判斷是否繼續(xù)循環(huán),使循環(huán)能在有限的次數(shù)后結(jié)束。在循環(huán)次數(shù)確定的情況下,可用循環(huán)次數(shù)作為控制條件,這時(shí)常用LOOP指令實(shí)現(xiàn)控制循環(huán)。循環(huán)控制的方法有很多,如標(biāo)記控制循環(huán),開關(guān)量控制循環(huán),邏輯尺控制循環(huán)等,在不同的場合使用不同的方法。66DATASEGMENTBUFFDB100DUP(?);定義100個(gè)數(shù)據(jù)
MAXDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,99;設(shè)置循環(huán)次數(shù)
LEASI,BUFF;數(shù)據(jù)首地址送SIMOVAL,[SI];取第一個(gè)數(shù)
INCSICON:CMPAL,[SI];與第二個(gè)數(shù)比較大小
JNCNEXT;若AL≥[SI],則跳轉(zhuǎn)NEXT處
MOVAL,[SI];AL<[SI],替換ALNEXT:INCSI;修改地址指針
LOOPCON;測試循環(huán)條件CX=0?
MOVMAX,ALMOVAH,4CHINT21H CODEENDSENDSTART【例4-10】在數(shù)據(jù)段中從BUFF單元開始存放100個(gè)字節(jié)類型的無符號數(shù),編寫程序找出其中最大的數(shù)并存入MAX單元中。67【例4-11】在數(shù)據(jù)段中從BUFF單元開始存放100個(gè)字節(jié)類型的無符號數(shù),將它們按從大到小的順序排序。排序有多種算法,這里使用起泡法。從第一個(gè)數(shù)開始依次對相鄰的兩個(gè)數(shù)進(jìn)行比較,100個(gè)數(shù)需要比較99次,所以程序需要設(shè)計(jì)一個(gè)99次的循環(huán)。在這個(gè)循環(huán)里每次比較時(shí)如果前邊的數(shù)小于后面的數(shù),這兩個(gè)數(shù)交換位置。這99次的循環(huán)結(jié)束后,最小的數(shù)已經(jīng)交換到了最后,還剩99個(gè)數(shù)要用同樣的比較方法找到最小的數(shù)并放到最后,這只要再設(shè)計(jì)一個(gè)98次的循環(huán)就可以了。以此類推這個(gè)過程需要99輪。用起泡算法排序需要設(shè)計(jì)兩重循環(huán),內(nèi)循環(huán)完成數(shù)的比較和交換,初始內(nèi)循環(huán)計(jì)數(shù)值為N-1次,之后每次進(jìn)入內(nèi)循環(huán)計(jì)數(shù)值減1;外循環(huán)需要N-1次,從外循環(huán)進(jìn)入內(nèi)循環(huán)時(shí)注意地址指針初始化和內(nèi)循環(huán)次數(shù)的設(shè)置。下面的程序在內(nèi)循環(huán)中設(shè)置了交換標(biāo)志,從外循環(huán)進(jìn)入內(nèi)循環(huán)時(shí)檢查交換標(biāo)志,如果標(biāo)志不為0說明前一個(gè)內(nèi)循環(huán)里至少有兩數(shù)據(jù)的順序不合要求,需要再執(zhí)行一次內(nèi)循環(huán);如果標(biāo)志為0,說明所有數(shù)據(jù)的排序結(jié)束。
68LENEQU100DATASEGMENT BUFFDB100(?) ;定義100個(gè)數(shù)據(jù)
CHANGEDB0 ;設(shè)置交換標(biāo)志DATA ENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX LEABX,BUFF ;BX作數(shù)據(jù)的地址指針
LEADI,CHANGE ;DI作交換標(biāo)志MOVDX,LEN-1 ;DX保存循環(huán)次數(shù)SORT: MOVSI,BX ;內(nèi)循環(huán)初始化,設(shè)置地址指針
MOVCX,DX ;設(shè)置計(jì)數(shù)值,等于參加比較的數(shù)據(jù)數(shù)量
MOVBYTEPTR[DI],0 ;設(shè)定交換的標(biāo)志69GOON:MOVAL,[SI] ;內(nèi)循環(huán)開始
INCSICMPAL,[SI];前一個(gè)數(shù)和后一個(gè)數(shù)比較
JNCNEXT;前大后小,轉(zhuǎn)NEXT不交換
MOVBYTEPTR[DI],1;前小后大,置交換標(biāo)志
MOVAH,[SI]MOV[SI],AL ;交換
MOV[SI-1],AHNEXT:LOOPGOON ;內(nèi)循環(huán)結(jié)束DECDXJZNEXT1 ;外循環(huán)計(jì)數(shù)值為0,程序結(jié)束
CMPBYTEPTR[DI],0 ;如果內(nèi)循環(huán)中沒有交換,程序結(jié)束
JNZSORT ;開始下一輪內(nèi)循環(huán)NEXT1: MOVAH,4CH INT 21HCODEENDSENDSTART循環(huán)可以有多重結(jié)構(gòu),多重循環(huán)要注意各重循環(huán)的控制條件,并且每次從外循環(huán)進(jìn)入內(nèi)循環(huán)時(shí),內(nèi)循環(huán)的初始條件要重新設(shè)置。704.4.5過程設(shè)計(jì)過程又稱為子程序。子程序使程序結(jié)構(gòu)模塊化,程序更加清晰、易讀易懂。如果在一個(gè)程序的多個(gè)地方或多個(gè)程序中都用到相同功能的程序段,這時(shí)常采用子程序設(shè)計(jì)方法。(1)過程定義過程定義就是子程序定義,由偽指令完成。
例如計(jì)算S=12+22+…+N2的子程序:71GO PROCFAR ;過程定義
MOV DX,0 MOV BL,1 ;BL表示自然數(shù)
MOV AL,BLCC: MUL BL ;AL*BL結(jié)果存在AX中
ADD DX,AX ;當(dāng)N≤50時(shí),不會(huì)產(chǎn)生進(jìn)位
INC BL MOV AL,BL LOOP CC ;CX為計(jì)數(shù)器
RET ;過程返回GO ENDP ;過程定義結(jié)束這個(gè)子程序可以稱為平方和子程序,CX是入口參數(shù),調(diào)用之前應(yīng)該預(yù)置CX=N。DX為出口參數(shù),N個(gè)數(shù)的平方和存在DX中。72(2)過程調(diào)用和返回過程調(diào)用通過CALL指令實(shí)現(xiàn),調(diào)用時(shí)注意子程序的屬性,NEAR屬性的子程序必須和調(diào)用程序在同一個(gè)段;FAR屬性的子程序可以隨意。CALL指令執(zhí)行時(shí)將當(dāng)前IP或CS和IP壓入棧堆中,然后將子程序的首地址賦給IP或CS和IP,CPU開始執(zhí)行子程序。RET指令執(zhí)行時(shí)彈出棧中的數(shù)據(jù),修改IP或CS和IP的內(nèi)容,從而實(shí)現(xiàn)返回調(diào)用程序的目的。為保證正確返回調(diào)用程序,應(yīng)注意子程序運(yùn)行期間的堆棧狀態(tài),使RET指令準(zhǔn)確彈出斷點(diǎn)地址。在子程序中對堆棧的使用應(yīng)該特別小心。
73例如調(diào)用平方和子程序求20個(gè)數(shù)的平方和:DATA SEGMENT CON EQU20 SUM DW?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,CON ;設(shè)置子程序的入口參數(shù)CX CALL GO ;調(diào)用子程序
MOV SUM,DX ;保存出口參數(shù)
MOV AX,4C00H INT 21HCODE ENDS ENDSTART
74(3)保護(hù)與恢復(fù)現(xiàn)場如果一個(gè)子程序被多次調(diào)用,保護(hù)與恢復(fù)(主程序)現(xiàn)場就非常重要。主程序每次調(diào)用子程序時(shí),主程序的現(xiàn)場不會(huì)相同,直接保護(hù)主程序的現(xiàn)場就非常不易。保護(hù)與恢復(fù)現(xiàn)場的工作只能在子程序中進(jìn)行。子程序中用到了什么就保護(hù)什么,即子程序破壞了什么就保護(hù)什么。原則上,在子程序中,首先把子程序中要用到的寄存器、存儲(chǔ)單元、狀態(tài)標(biāo)志等壓入堆?;虼嫒胩囟臻g中,然后子程序才可以使用它們,使用完后再從堆?;驈奶囟臻g中取出原來的內(nèi)容,恢復(fù)它們原來的值,即恢復(fù)主程序現(xiàn)場。保護(hù)和恢復(fù)現(xiàn)場常使用PUSH和POP指令。例如平方和子程序應(yīng)該進(jìn)一步完善如下:75GO PROCFAR PUSHDX PUSHBX PUSHAX MOVDX,0 MOVBL,1 MOVAL,BLCC: MULBL ADDDX,AX INCBL MOVAL,BL LOOPCC POPAX POPBX POPDX RET GO ENDP 76【例4-12】編寫一個(gè)多字節(jié)數(shù)減法子程序。CALSUB PROC NEAR PUSH AX ;保護(hù)主程序現(xiàn)場AX,BX,CX,SI,DI,FLAGS PUSH BX PUSH CX PUSH SI PUSH DI PUSHF CLC ;清0進(jìn)位標(biāo)志CFCAL1: MOV AX,[DI] ;取被減數(shù)
SBB AX,[SI] ;減法
MOV [BX],AX ;存結(jié)果
INC SI ;調(diào)整指針I(yè)NCSI
INC DIINCDI INC BXINCBX LOOP CAL1 ;處理高位字
POPF ;恢復(fù)主程序現(xiàn)場FLAGS,DI,SI,CX,BX,AX POP DI
POP SI POP CX POP BX POP AX RETCALSUBENDP77編制子程序文件時(shí),應(yīng)該認(rèn)真書寫子程序說明書,方便并保證正確調(diào)用子程序。以上面子程序?yàn)槔?,說明書的基本樣式如下:;子程序名:CALSUB;子程序功能:多字節(jié)二進(jìn)制數(shù)減法;入口參數(shù):CX為數(shù)的長度(按字計(jì)算),DS:[DI]為第一個(gè)數(shù)的首地址DS:[SI]為第二個(gè)數(shù)的首地址;DS:[BX]為結(jié)果的首地址。;出口參數(shù):無。說明書可以放在子程序的開始處,以注釋的形式出現(xiàn)。78(4)參數(shù)傳送主程序在調(diào)用子程序時(shí),要為子程序預(yù)置數(shù)據(jù),在子程序返回時(shí)給出數(shù)據(jù)處理的結(jié)果,這稱為數(shù)據(jù)傳送或變量傳送。方法主要有以下幾種:①寄存器傳送。②地址表傳送,需要傳送的參數(shù)較多時(shí)可以利用存儲(chǔ)單元傳送。在調(diào)用子程序前,把所有參數(shù)依次送入地址表,然后將地址
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)合同范例粉水
- 2025年公共藝術(shù)設(shè)計(jì)市場調(diào)研報(bào)告
- 公路護(hù)欄工程合同范例
- 學(xué)校保安聘任合同范本
- 出售魚苗批發(fā)合同范本
- 公司賣舊車合同范例
- 2025年度燃?xì)庠O(shè)施建設(shè)與運(yùn)營管理合同范本
- 2025年度建筑施工單位臨時(shí)用工勞務(wù)派遣與職業(yè)健康合同
- 餐飲服務(wù)合同范本
- 船舶設(shè)備零部件行業(yè)深度研究報(bào)告
- 低空飛行旅游觀光項(xiàng)目可行性實(shí)施報(bào)告
- 2024年版:煤礦用壓力罐設(shè)計(jì)與安裝合同
- 2024年貴州云巖區(qū)總工會(huì)招聘工會(huì)社會(huì)工作者筆試真題
- 《算法定價(jià)壟斷屬性問題研究的國內(nèi)外文獻(xiàn)綜述》4200字
- 2024年04月浙江義烏農(nóng)商銀行春季招考筆試歷年參考題庫附帶答案詳解
- 涉密計(jì)算機(jī)保密培訓(xùn)
- 掛靠免責(zé)協(xié)議書范本
- 2024年浙江省五校聯(lián)盟高考地理聯(lián)考試卷(3月份)
- 在線心理健康咨詢行業(yè)現(xiàn)狀分析及未來三至五年行業(yè)發(fā)展報(bào)告
- 電動(dòng)三輪車購銷合同
- 淋巴瘤的免疫靶向治療
評論
0/150
提交評論