匯編語言(微機)第三章下.ppt
《匯編語言(微機)第三章下.ppt》由會員分享,可在線閱讀,更多相關(guān)《匯編語言(微機)第三章下.ppt(123頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1,主講教師:范新民,第三章:8086匯編語言程序設(shè)計,2,8086匯編語言程序設(shè)計,3,8086匯編語言程序設(shè)計,3.2.1匯編語言源程序的格式,一、基本概念,1、機器語言、匯編語言和高級語言,機器語言:用0、1代碼表示的機器指令形式,是機器硬件唯一能識別和執(zhí)行的語言。例:機器指令01000000;表示(AX)+1→AX,匯編語言:用符號表示指令的操作碼、操作數(shù)。又稱符號語言。例:INCAX;增1指令,,,4,匯編語言和機器語言都是面向機器的語言,即不同的機器有不同的指令系統(tǒng)。機器指令與機器代碼是一一對應(yīng)的。匯編語言機器語言均屬于低級語言。,高級語言:接近人的自然語言和數(shù)學表達式。用高級語言編寫的程序是脫離機器的、面向過程或面向?qū)ο蟮恼Z言。如:C語言,Java語言等。,,匯編語言源程序的格式,5,2、匯編語言的特點代碼長度短,執(zhí)行速度最快可直接有效的控制機器的運行準確掌握機器運行時間可最有效的利用CPU、內(nèi)存、I/O資源直接控制機器運行的場合匯編語言常用于:需要準確控制運行時間的場合運行速度要求很高的場合,,匯編語言源程序的格式,6,匯編語言源程序的格式,3、語句的類別與結(jié)構(gòu)分段結(jié)構(gòu):最多可由4種段組成:代碼段、數(shù)據(jù)段、堆棧段、附加段。語句類別:,(1)指令語句:由匯編程序匯編成相應(yīng)的能被CPU直接識別并執(zhí)行的目的碼,或稱機器代碼。,(2)宏指令語句:允許用戶為多次重復(fù)使用的程序段命名的一個名字。即將一個程序段定義為一宏指令。,7,第三章:匯編語言程序設(shè)計,(3)偽指令語句:偽指令語句是一種指示性語句,這類語句向匯編程序提供匯編過程要求的一些輔助信息,如給變量分配內(nèi)存單元地址、定義各種符號、實現(xiàn)分段等。,偽指令與指令性語句的區(qū)別:偽指令語句經(jīng)匯編后不產(chǎn)生任何機器代碼,而指令性語句經(jīng)匯編后會產(chǎn)生相應(yīng)的機器代碼;偽指令語句所指示的操作是在程序匯編時就完成了的,而指令性語句的操作必須在程序運行時才能完成。,,8,例3-1:對10個字節(jié)數(shù)據(jù)a1~a10求和。DATASEGMENTAT2000HARRAYDBa1,a2,a3,…,a10COUNTEQU$-ARRAYSUMDW?DATAENDSSTACKSEGMENTPARASTACK‘STACK’STAKDB10DUP(?)TOPEQULENGTHSTAKSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,匯編語言源程序的格式,9,START:MOVAX,DATAMOVDS,AXMOVAX,0MOVDI,OFFSETSUMMOVBX,OFFSETARRAYMOVCX,COUNTLOP:ADDAL,[BX]ADCAH,0INCBXLOOPLOPMOV[DI],AXMOVAH,4CHINT21HCODEENDSENDSTART,匯編語言源程序的格式,10,二、指令性語句,[標號:]操作碼[操作數(shù)][;注釋項],操作碼:指明操作的性質(zhì),說明計算機要執(zhí)行的具體操作。用助記符表示。操作數(shù):指明指令執(zhí)行過程中所需的數(shù)據(jù)??捎?個、1個或者多個表達式組成,并由它提供執(zhí)行指定操作所需要的操作數(shù)或地址。注釋項:必須以分號開頭,主要用來說明程序或重要語句的功能。,匯編語言源程序的格式,11,標號:對應(yīng)的標識符后面必須跟有冒號,標號在匯編以后分配有地址。標號又稱為符號地址,可作為轉(zhuǎn)移指令或子程序調(diào)用的目標地址。,匯編語言源程序的格式,12,,匯編語言源程序的格式,三、指示性語句指示性語句是主要由命令構(gòu)成的語句,用來指示匯編程序進行匯編操作。格式:,[名字/變量]命令參數(shù)[;注釋項],命令:指示匯編程序進行某種匯編操作參數(shù):匯編操作有關(guān)的數(shù)據(jù),13,匯編語言源程序的格式,3.2.2常量、標識符和表達式,1、常量:數(shù)字常量可以是二進制數(shù)、八進制數(shù)、十進制數(shù)或十六進制數(shù)表示。字符常量是用單引號‘’括起來的ASCII字符其值是該字符的ASCII代碼值。例:MOVAX,‘A’;AX=41H符號常量是用符號定義的常量。例:采用符號定義語句PORTAEQU80HMOVAL,PORTA與指令MOVAL,80H等價,14,標識符可用作符號常量、名字、變量和標號等。組成標識符有如下規(guī)定:組成標識符的字符有:大寫字母:A~Z;文小寫字母:a~z;數(shù)字0~9;字符?、@、_、$;字符長度不超過3l個;首字符不能是數(shù)字;?不能單獨作為一個標識符;不能把保留字用作標識符,保留字包括助記符、寄存器名等。,2、標識符,匯編語言源程序的格式,15,3、表達式由常數(shù)、變量、標號通過運算符或操作符連接而成的,可分為數(shù)值表達式和地址表達式。,匯編語言源程序的格式,數(shù)值表達式:由算術(shù)運算符、關(guān)系運算符和邏輯運算符連接常數(shù)組成的有意義的式子,它的運算結(jié)果是數(shù)值常數(shù),只有大小,沒有屬性。地址表達式:由變量、標號、常數(shù)、寄存器(BP、BX、SI、DI)的內(nèi)容和操作符組成的有意義的式子,它的運算結(jié)果不是一個普通的數(shù)值,總是和存儲器地址相聯(lián)系。如各種存儲器尋址方式的匯編表示都屬于簡單的地址表達式,16,,表達式中的運算符:,17,匯編語言源程序的格式,3.2.3指示性語句(5條),程序開始和結(jié)束語句段定義語句過程定義語句數(shù)據(jù)定義語句符號定義語句,18,(1)給程序模塊命名NAME命令格式:NAME名字名字是程序員按標識符規(guī)定所取的程序模塊名。(2)標題命名語句TITLE命令格式:TITLE名字名字作為每頁標題打印出來,標題名字符不大于60個(3)程序結(jié)束END命令格式:END[標號]標號指示程序開始執(zhí)行的起始地址的標號。,1、程序開始和結(jié)束語句,匯編語言源程序的格式,19,說明:如果程序中沒有NAME偽指令,可使用TITLE偽指令。程序中既無NAME也無TITLE偽指令,匯編程序?qū)⒂迷闯绦蛎鳛槟K名。一般情況下使用TITLE偽指令,可在列表文件中能打印出來END偽指令中,如果程序中第一句指令性語句有標號,則END語句的標號應(yīng)與其相同否則可無標號。,匯編語言源程序的格式,20,2、段定義偽指令存儲器的物理地址是由段地址和偏移地址組合而成的,而存儲器又可以為多個段,匯編程序是按段來組織程序和使用存儲器,在把源程序轉(zhuǎn)換為目標程序時,必須確定標號和變量的偏移地址,并且需要把有關(guān)信息通過目標模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起形成一個可執(zhí)行程序。為此,需要用到段定義偽指令。,匯編語言源程序的格式,21,(1)段定義偽指令SEGMENT格式:段名SEGMENT[定位類型][組合類型][‘類別’]…段名ENDS,段名由程序員定義,匯編時由系統(tǒng)為該段分配一個段基值。參數(shù)用來設(shè)定該段在內(nèi)存中的位置和在匯編、連接時,當該段與其它段組合在一起時該段同其它段的連接關(guān)系。,匯編語言源程序的格式,22,一般情況下,定位類型、組合類型和類別說明可以不用。,注意:SEGMENT和ENDS語句必須成對使用。,例:定義一數(shù)據(jù)段DATADATASEGMENTADB1234BDW12HDATAENDS,匯編語言源程序的格式,23,(2)偏移地址定位語句ORG,格式:ORG數(shù)值表達式功能:指定在它之后的程序段或數(shù)據(jù)塊所存放的起始地址的偏移量。,無ORG語句時,段偏移地址從0000H開始。,例1.DATASEGMENTORG100HXDB12HYDW?ZDD1122HDATAENDS,,,,$,$-表示匯編地址計數(shù)器的當前值,匯編語言源程序的格式,24,(3)指定段址偽指令,格式:ASSUME段寄存器:段名[,段寄存器:段名,...]功能:指明段和段寄存儲器的對應(yīng)關(guān)系,且段名必須是由SEGMENT定義的段名。,說明:ASSUME偽指令只是指明段和段寄存器的對應(yīng)關(guān)系,并沒有把段地址裝入段寄存器中。但是,代碼段段寄存器CS的值是由系統(tǒng)負責設(shè)置的。ASSUME指令必須跟在SEGMENT語句之后。,匯編語言源程序的格式,25,例:DATASEGMENTXDB12HDATAENDSSTACKSEGMENTDW100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX┆CODEENDS,匯編語言源程序的格式,26,3.過程定義偽指令,格式為:過程名PROC[NEAR/FAR]…RET過程名ENDP功能:過程定義偽指令用于定義子程序。段內(nèi)調(diào)用使用NEAR屬性,段間調(diào)用使用FAR屬性。省略為NEAR,匯編語言源程序的格式,27,CODESEGMENTCOUNTPROCNEARADDCX,1RETCOUNTENDPSTART:MOVAX,100┊CALLCOUNT┊CALLCOUNT┊HLTCODEENDSENDSTART,COUNTPROCERET,子程序:,,,,,匯編語言源程序的格式,28,4.數(shù)據(jù)定義偽指令格式:[變量名]數(shù)據(jù)定義偽指令操作數(shù)項表功能:定義數(shù)據(jù)存儲區(qū),其類型由偽指令指定。,數(shù)據(jù)定義偽指令常用的有以下五種:[變量名]DB操作數(shù)項表;定義字節(jié)[變量名]DW操作數(shù)項表;定義字[變量名]DD操作數(shù)項表;定義雙字[變量名]DQ操作數(shù)項表;定義8個字節(jié)[變量名]DT操作數(shù)項表;定義10個字節(jié),操作數(shù)項表可以是常數(shù)或表達式、字符串、?和帶DUP的表達式。,匯編語言源程序的格式,29,①給變量賦初值或指定變量類型例:COUNTDB100ARRAYDW-1,1024,匯編語言源程序的格式,30,②定義一個ASCⅡ碼的字符串,為字符串的每個字符分配一個存儲單元,并從左到右將字符的ASCⅡ碼按地址遞增順序存放在內(nèi)存中。,例1:STRDB‘ABCD’例2:STR1DW‘AB’,匯編語言源程序的格式,31,③用?號預(yù)留內(nèi)存單元例:SUB1DB?;預(yù)留一個字節(jié)單元RESUDW?;預(yù)留二個字節(jié)單元,匯編語言源程序的格式,32,④用DUP重復(fù)因子初始化一個數(shù)據(jù)區(qū)格式:NDUP(表達式),,,,例1:DA1DB2DUP(0)DA2DB2DUP(‘AB’)DA3DW2DUP(1),例2:DUP的嵌套使用DATADB10DUP(10DUP(0))定義了100個字節(jié)全部初始化為0。,,重復(fù)次數(shù)重復(fù)裝入的內(nèi)容,?、數(shù)值、數(shù)值表達式字符等,匯編語言源程序的格式,33,匯編語言源程序的格式,5、符號定義語句,(1)EQU——賦值偽指令格式:變量名EQU表達式功能:將右邊表達式的值賦給左邊的變量。表達式可以是常數(shù)、變量、標號、指令助記符、數(shù)值表達式、地址表達式。,例:PORT1EQU100;符號PORT1代表常數(shù)100CONTEQUCX;為CX重新命名ABDREQUPORT1+1ABCEQUDAA注:同一程序中,不能重復(fù)定義,34,(2)=——等號偽指令格式:符號名=表達式功能:與EQU基本相同,兩者的區(qū)別在于“=”偽指令可對同一標識符作重新定義。,例:EMP=12;定義EMP等于12EMP=EMP+1可以對同一個符號名重復(fù)定義。,匯編語言源程序的格式,35,(3)PURGE命令格式:PUREG名字功能:用來撤消已定義的符號常量??赏瑫r撤消幾個己定義的名字例3-10:COUNTEQU20┇MOVAL,COUNT┇PURGECOUNTCOUNTEQU10MOVBL,COUNT,匯編語言源程序的格式,36,(1)名字名字包括文件名、標題名、段名、過程名和符號常量名等,是程序員在編程中按標識符規(guī)定命名的,目的是方便編程和讀程。段命在段定義語句中命名取定,定義后的段名可以作為段基值來使用,用來對段寄存器賦值。例:MOVAX,DATAMOVDS,AX,6、名字與變量,匯編語言源程序的格式,37,過程名在過程定義語句中定義,指向過程中第一條指令所在的內(nèi)存單元的地址(入口地址),有NEAR和FAR之分。符號常量由符號定義語句EQU、=來定義,對符號常量給以賦值。例3-13,匯編語言源程序的格式,38,(2)變量變量的定義和屬性變量由數(shù)據(jù)定義語句DB/DW/DD/DQ/DT來定義變量有三屬性:段屬性、偏移屬性和類型屬性:段屬性表示變量所在段的起始地址。偏移屬性表示變量在段內(nèi)的偏移地址。用16位無符號表示偏移地址。類型屬性表示該變量能存放的數(shù)據(jù)長度。長度為1B的變量,類型為BYTE,長度為2B的變量,類型為WORD等。,匯編語言源程序的格式,39,分析運算符(5個)用于把變量的三個屬性分別取出來作為操作數(shù)。,OFFSET——取偏移地址操作符格式:OFFSET變量或標號功能:返回該變量或標號在其段內(nèi)的偏移地址。,例:MOVSI,OFFSETBUF將BUF在數(shù)據(jù)段內(nèi)的偏移地址作為立即數(shù)送到SI中。,匯編語言源程序的格式,40,SEG——取段址操作符。格式:SEG變量或標號功能:返回變量或標號所在段的段基址。例:MOVAX,SEGBUF,匯編語言源程序的格式,41,TYPE——取類型操作符格式:TYPE變量或標號功能:當TYPE置于變量前面時,返回變量的類型數(shù)字。即DB為1,DW為2,DD為4,DT為10。當TYPE置于標號前面時,返回標號的類型屬性值;當該標號為NEAR屬性時,返回值為-1,標號為FAR屬性時,返回值為-2。,例:數(shù)據(jù)段中有如下定義:DATADW75H,134H。執(zhí)行:ADDSI,TYPEDATA。該語句在匯編后相當于指令A(yù)DDSI,2。,匯編語言源程序的格式,42,取變量所含的數(shù)據(jù)存儲單元個數(shù)操作符LENGTH格式:LENGTH變量功能:只對變量起作用,取值根據(jù)定義該變量時數(shù)據(jù)定義偽指令后面第一個表達式的形式而定。如為重復(fù)子句“nDUP(表達式)”,返回外層重復(fù)因子n,其他形式的表達式,則返回1。,匯編語言源程序的格式,43,MOVAL,LENGTHA1MOVCX,LENGTHA2MOVBX,LENGTHA3MOVDX,LENGTHA4,匯編后相當于指令:MOVAL,1MOVCX,10MOVBX,1MOVDX,5,例:DATASEGMENTA1DB‘ABCD,5DUP(0)A2DW10DUP(1),1234HA3DW10,20DUP(?)A4DW5DUP(3DUP(2),5)DATAENDS,匯編語言源程序的格式,44,取變量所含的數(shù)據(jù)存儲區(qū)大小操作符SIZE格式:SIZE變量功能:匯編程序用該操作符返回的值表示該變量所分配的總字節(jié)數(shù)。例:A2DW10DUP(1),1234HMOVCX,SIZEA2匯編后相當于有指令:MOVCX,14H,匯編語言源程序的格式,SIZE=LENGTHTYPE,45,合成運算符,屬性定義操作符PTR格式:類型PTR地址表達式功能:PTR操作符的作用是將地址表達式的原類型屬性臨時修改成PTR操作符前面所指定的類型。指定的類型可以是BYTE、WORD或DWORD。,可用來指定內(nèi)存操作數(shù)的類型例:MOVBYTEPTR[SI],20H;占一個字節(jié)或MOVWORDPTR[SI],20H;占兩個字節(jié),匯編語言源程序的格式,46,用于臨時改變變量或標號的類型屬性例如:BUFWDW1234H,5678HMOVAX,BUFWMOVAL,BYTEPTRBUFW可用EQU和PTR定義一個新的變量例如:BUFWDW1234H,5678HBUFBEQUBYTEPTRBUFW則MOVAX,BUFW和MOVAL,BUFB都是合法的。,匯編語言源程序的格式,47,格式:[標號:]操作碼[操作數(shù)][,操作數(shù)][;注釋]一、標號標號是一條指令在內(nèi)存中的符號地址。標號一定要用‘:’結(jié)束。標號具有三種屬性:段屬性:表示標號所在段的段基值格式:SEG標號,3.2.4指令型語句,匯編語言源程序的格式,48,匯編語言源程序的格式,偏移量屬性:表示標號所在位置的偏移地址格式:OFFSET標號類型屬性:表示標號所在指令是允許段內(nèi)跳轉(zhuǎn)還是段間跳轉(zhuǎn)格式:TYPE標號當標號的屬性為NEAR屬性時,TYPE=-1。當標號的屬性為FAR屬性時,TYPE=-2。,49,操作數(shù)可以用段名、符號常量、變量、屬性表達式、過程名和標號等。例如:MOVAX,DATA;DATA是段名MOVCX,COUNT;COUNT是符號常量MOVBL,BUFFER;BUFFER是變量MOVSI,OFFSETARRAY;OFFSETARRAY是屬;性表達式CALLSBRT1;SBRT1是過程名JMPDONE;DONE是標號,2、操作數(shù),匯編語言源程序的格式,50,宏定義:格式:宏指令名MACRO[形式參數(shù)表]┆┆ENDM宏調(diào)用:格式:宏指令名[實際參數(shù),…],,宏指令體,宏指令——源程序中一個能多次可重復(fù)使用的具有獨立功能的代碼段。,1、宏指令的定義和使用宏指令的使用過程有宏定義、宏調(diào)用、宏展開。,3.2.5宏指令,匯編語言源程序的格式,51,例:完成AX的內(nèi)容乘以2X的宏定義及宏調(diào)用定義宏:MULXMACROPX形式參數(shù)宏指令名MOVCL,PXSALAX,CLENDM,宏調(diào)用:┆MULX2;┆MULX4;┆MULX5;,,,,,實際參數(shù),AX←(AX)*22,AX←(AX)*24,AX←(AX)*25,匯編語言源程序的格式,52,宏調(diào)用:┆┆MULT120,BL,SAVE┆,,宏展開:在匯編宏指令時,宏匯編程序?qū)⒑曛噶铙w插入到宏指令所在的位置,并用實際參數(shù)代替形式參數(shù)。,例:兩數(shù)相乘,返回積。宏定義:MULTMACROOPR1,OPR2,RESULTMOVAL,OPR1IMULOPR2MOVRESULT,AXENDM,MOVAL,120IMULBLMOVSAVE,AX,,,,匯編語言源程序的格式,53,2、宏指令與子程序(過程)的區(qū)別:宏指令調(diào)用無返回地址,執(zhí)行速度略快。通過形參、實參結(jié)合傳遞函數(shù)宏指令不能壓縮目標代碼長度,占用內(nèi)存較子程大。,匯編語言源程序的格式,54,3.3.1概述3.3.2順序程序3.3.3分支程序3.3.4循環(huán)程序3.3.5子程序3.3.6匯編語言程序舉例3.3.7系統(tǒng)功能調(diào)用,3.3匯編語言程序設(shè)計基礎(chǔ),55,3.3.7常用的DOS與BIOS中斷功能調(diào)用,1.DOS中斷DOS除了給用戶提供了命令行服務(wù)以外,還為匯編語言程序員提供了大量的子程序,這些子程序包含了從基本輸入輸出到內(nèi)存管理、磁盤讀寫、文件系統(tǒng)等各個方面,使用這些子程序,使得匯編語言程序員不必搞清大量的設(shè)備接口、數(shù)據(jù)結(jié)構(gòu)等細節(jié),即可完成所需功能,簡化了匯編語言的編程。由于DOS提供的這些子程序被看作是DOS系統(tǒng)功能的一部分,因而人們把對這些子程序的調(diào)用又稱為DOS功能調(diào)用。,一、DOS中斷與系統(tǒng)功能調(diào)用,56,DOS提供的這些子程序位于DOS的基本系統(tǒng)文件IBMBIO.COM和IBMDOS.COM中,隨著DOS的加載而進入內(nèi)存,即只要能啟動DOS就可以使用。DOS的這些子程序是以中斷的方式向系統(tǒng)及應(yīng)用程序提供服務(wù)的,故必須采用軟中斷指令I(lǐng)NT進行調(diào)用。,隨著DOS的發(fā)展,所提供的功能(子程序)越來越多,不可能每一個子程序都占用一個中斷號,于是采用讓它們共用一個中斷號,即21H號的辦法,進入這一個中斷后,DOS再根據(jù)應(yīng)用戶程序中子程序編號的設(shè)置來確定用戶程序到底想調(diào)用哪一個子功能。,常用的DOS與BIOS中斷功能調(diào)用,57,2.DOS系統(tǒng)功能調(diào)用(1)DOS功能調(diào)用的方法設(shè)置入口參數(shù),如果所調(diào)用的子程序不需參數(shù),則可省略此步。欲調(diào)用的子程序編號→AH。發(fā)中斷調(diào)用指令I(lǐng)NT21H。,常用的DOS與BIOS中斷功能調(diào)用,58,(2)DOS基本I/O功能調(diào)用01功能——鍵盤輸入入口參數(shù):無出口參數(shù):所讀取的字符ASCII碼在AL內(nèi)。,功能:掃描鍵盤,若有按鍵按下,將字符ASCII碼放入AL中,同時在屏幕上顯示這個字符,然后返回。若無鍵按下,該調(diào)用等待直到有鍵按下為止。,例:MOVAH,01INT21H,常用的DOS與BIOS中斷功能調(diào)用,59,08功能——鍵盤輸入。入口參數(shù):無出口參數(shù):所讀取的字符ASCII碼在AL內(nèi)。功能:同01號類似,但是不在屏幕上顯示輸入的字符,在讀取密碼時常用本功能。,例:MOVAH,08INT21H,常用的DOS與BIOS中斷功能調(diào)用,60,10號功能——字符串輸入入口參數(shù):DS:DX指向輸入緩沖區(qū)。輸入緩沖區(qū)具有如下格式:第一個字節(jié):指明準備接收的最大字符數(shù),包括回車符。第二個字節(jié)保留,由DOS在功能調(diào)用結(jié)束后填入實際輸入的字符個數(shù)(不包括最后的回車符)。用戶輸入的字符串從第三個單元開始存放出口參數(shù):用戶實際輸入字符個數(shù)在緩沖區(qū)第二個單元中,常用的DOS與BIOS中斷功能調(diào)用,61,DATASEGMENTBUFDB8;指明最大字符數(shù)DB?;保留,供DOS填入實際字符數(shù)DB8DUP(?);用戶輸入的字符存放區(qū)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,OFFSETBUFMOVAH,10INT21H……;其他操作MOVAH,4CHINT21HCODEEND,常用的DOS與BIOS中斷功能調(diào)用,62,02H功能——顯示字符(一個字符)調(diào)用方法:DL←要顯示的字符或其ASCⅡ代碼AH←02HINT21H注:如果字符是控制符,則實際執(zhí)行相應(yīng)的功能。例:在屏幕上顯示一個換行符(0AH)MOVDL,0AHMOVAH,02INT21H;實際上將光標轉(zhuǎn)到下一行上去。,常用的DOS與BIOS中斷功能調(diào)用,63,09H功能——字符串輸出顯示調(diào)用方法:DX←要顯示的字符串首地址AH←09H(調(diào)用號)INT21H注:預(yù)先將字符串存放于DX表示的首地址區(qū)域,字符串必須以“$”作為結(jié)束符,常用的DOS與BIOS中斷功能調(diào)用,64,4CH功能——終止當前程序并返回操作系統(tǒng)。調(diào)用方法:MOVAH,4CHINT21H,常用的DOS與BIOS中斷功能調(diào)用,65,例:編一段程序先提示用戶輸入一個字符串,然后讀取用戶的輸入,并將用戶輸入的數(shù)據(jù)在下行輸出。程序如下:,DATASEGMENTMESSAGEDB‘PLEASEINPUTASTRING:$’;定義輸入提示BUFDB10,?,10DUP(?)DATAENDS,MOVDX,OFFSETMESSAGEMOVAH,9INT21H;顯示輸入提示信息,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,DOS功能調(diào)用舉例,66,MOVDX,OFFSETBUFMOVAH,10INT21H;接收用戶輸入,MOVAH,4CHINT21HCODEENDSENDSTART,MOVDX,OFFSETBUF+2;用戶實際輸入字符起始處→DXMOVAH,9INT21H;顯示用戶輸入的字符,MOVBL,BUF+1;用戶實際輸入字符數(shù)→BLMOVBH,0;將BX高8位清0,使BX=用戶實際輸入字符數(shù)MOVBYTEPTRBUF+2[BX],$’;在用戶輸入的字符結(jié)束處放置一個“$”,MOVAH,2MOVDL,0AH;0AH為換行符ASCII碼INT21H;屏幕換行,DOS功能調(diào)用舉例,67,3.3.1概述程序:是完成特定功能的一組指令的有序集合一、程序設(shè)計的步驟分析課題確定算法畫流程圖編寫程序上機調(diào)試、修改,二、程序的基本結(jié)構(gòu)順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。,匯編語言程序設(shè)計基礎(chǔ),68,3.3.2順序程序設(shè)計程序有3種基本結(jié)構(gòu),即順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。任何復(fù)雜的程序都是由基本結(jié)構(gòu)組成的。順序程序是最簡單程序設(shè)計。特點:這種程序不使用分支、循環(huán)結(jié)構(gòu),程序按順序執(zhí)行,只能完成相對簡單的操作。硬件支持是IP自動加1,從內(nèi)存取出一個指令字節(jié),IP自動加1。,順序程序設(shè)計,69,例3-17查表求平方值,程序分析:(1)在內(nèi)存中建平方表TABL;在XX單元放置0~15的數(shù);在YY單元預(yù)留存儲平方值的單元。(2)計算表啟始地址的偏移量(3)計算所查數(shù)值在表中的偏移地址,從該地址取出單元的內(nèi)容送YY單元。,70,DATASEGMENTTABLDB0,1,4,9,16,25,36,49,64,81DB100,121,144,169,196,225XXDBX;X為0~15的正整數(shù)YYDB?DATAENDSSTACKSEGMENTPARASTACK’STACK’DB50DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,順序程序設(shè)計舉例,例3-17查表求平方值,71,BEGIN:MOVAX,DATAMOVDS,AXMOVBX,OFFSETTABLMOVAH,0MOVAL,XXADDBX,AXMOVAL,[BX]MOVYY,ALMOVAH,4CHINT21HCODEENDSENDBEGIN,順序程序設(shè)計舉例,72,例31:從鍵盤輸入兩個一位數(shù),在屏幕顯示它們的積。程序分析:(1)從鍵盤上輸入兩個數(shù),調(diào)用DOS01功能。(2)把AL中的ASCII碼轉(zhuǎn)換為數(shù)值。(3)兩數(shù)相乘,把積用ASCII碼表示。(除10)(4)把積顯示在屏幕上,調(diào)用02功能。,順序程序設(shè)計舉例,73,CODESEGMENTASSUMECS:CODEBEGIN:MOVAH,1INT21HMOVBL,ALINT21HSUBAL,30HSUBBL,30HMULBLMOVBL,10DIVBL,順序程序設(shè)計舉例,74,ADDAX,3030HMOVBX,AXMOVDL,BLMOVAH,02HINT21HMOVDL,BHINT21HMOVAH,4CHINT21HCODEENDSENDBEGIN,順序程序設(shè)計舉例,75,例:字節(jié)存儲單元DAT中有2位數(shù)據(jù)為65H,要求將該數(shù)據(jù)顯示到屏幕上。,DATASEGMENTDATDB65HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDL,DATMOVBL,DL;暫存至AL寄存器MOVCL,4SHRDL,CLADDDL,30H;高位十六進制數(shù)據(jù)‘6’轉(zhuǎn)換為ASCII碼MOVAH,02HINT21H;顯示MOVDL,BLANDDL,0FHORDL,30H;低位十六進制數(shù)據(jù)‘5’轉(zhuǎn)換為ASCII碼INT21H;顯示MOVAH,4CHINT21HCODEENDSENDSTART,76,1.分支程序二要素(1)判斷:運算結(jié)果的狀態(tài)標志CF,PF,ZF,SF,OF;(2)轉(zhuǎn)移:主要是條件轉(zhuǎn)移指令Jcc單標志位判斷……JC,JZ,JO,JP,JS,JAE等;多標志位判斷……JA,JG,JGE等。,3.3.3分支結(jié)構(gòu)程序,分支結(jié)構(gòu)程序,77,分支結(jié)構(gòu)程序,2.采用比較指令和轉(zhuǎn)移指令實現(xiàn)分支CMPDest,src;Dest-srcJcc標號,78,,例:在字節(jié)存儲單元X、Y中各有一個無符號數(shù)。根據(jù)這兩個無符號數(shù)的大小,在屏幕顯示X≥Y或X<Y。,分析:用CMP指令比較兩個無符號數(shù)大小,根據(jù)其對標志位的影響用無符號條件轉(zhuǎn)移指令實現(xiàn)轉(zhuǎn)移。1、比大?。篨→AL,比較AL與Y的大小。2、調(diào)用02功能顯示比較結(jié)果。,分支結(jié)構(gòu)程序舉例,79,DATASEGMENTXDB98HYDB0A0HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XCMPY,AL;比較JAYGX;Y大于X則轉(zhuǎn)YGEXMOVAL,≥JMPDISP,分支結(jié)構(gòu)程序舉例,80,YGX:MOVAL,<DISP:MOVDL,X;顯示比較結(jié)果MOVAH,2INT21HMOVDL,ALINT21HMOVDL,YINT21HMOVAH,4CHINT21HCODEENDSENDSTART,分支結(jié)構(gòu)程序舉例,81,例3-20:數(shù)據(jù)塊傳送程序,程序分析:(1)用字符串傳送指令MOVSB實現(xiàn)數(shù)據(jù)塊傳送。目的串偏移地址送DI,源串偏移地址送SI。(2)如何判斷源數(shù)據(jù)塊與目的數(shù)據(jù)塊是否有交疊:兩數(shù)據(jù)塊不交疊的條件是:源數(shù)據(jù)塊末地址<目的數(shù)據(jù)塊首地址不重疊DF置0,重疊從末地址開始傳送DF置1,分支結(jié)構(gòu)程序舉例,82,DATASEGMENTSTRGDB1000DUP(?)STG1EQUSTRG+7STG2EQUSTRG+25STRSEEQU50DATAENDSSTACKSEGMENTPARASTACK‘STACK’STARNDB100DUP(?)STACKENDS,例3-20:數(shù)據(jù)塊傳送程序,分支結(jié)構(gòu)程序舉例,83,COSEGSEGMENTASSUMECS:COSEG,DS:DATA,ES:DATA,SS:STACKMOVAX,DATAMOVDS,AXMOVES,AXMOVCX,STRSEMOVSI,OFFSETSTG1MOVDI,OFFSETSTG2CLDPUSHSIADDSI,STRSE-1,分支結(jié)構(gòu)程序舉例,84,CMPSI,DIPOPSIJBOKSTD;減量方式傳送ADDDI,STRSE-1;指向數(shù)據(jù)塊底部ADDSI,STRSE-1OK:REPMOVSB;重復(fù)傳送50個數(shù)據(jù)MOVAH,4CHINT21HCODEENDSENDBEGIN,分支結(jié)構(gòu)程序舉例,85,在內(nèi)存中連續(xù)存放的一系列跳轉(zhuǎn)地址、跳轉(zhuǎn)指令或關(guān)鍵字組成一個決定程序分支的跳轉(zhuǎn)表。主要問題是計算表地址表地址=表基地址+偏移量,3、利用跳轉(zhuǎn)表實現(xiàn)分支,分支結(jié)構(gòu)程序舉例,86,例3-21:某工廠有8種產(chǎn)品的加工程序R0~R7,分別放在以SBR0、SBR1…SBR7為首地址的內(nèi)存區(qū)域中,8個地址的偏移地址放在以BASE為首地址的跳轉(zhuǎn)表內(nèi)。,跳轉(zhuǎn)地址組成的跳轉(zhuǎn)表:,分支結(jié)構(gòu)程序舉例,87,DATASEGMENTBASEDWSBR0,SBR1,SBR2,SBR3DWSBR4,SBR5,SBR6,SBR7BNDBX;X為0~7之間的正整數(shù)DATAENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATAMOVAX,DATAMOVDS,AXMOVAL,BN,分支結(jié)構(gòu)程序舉例,88,MOVAH,0ADDAL,ALMOVBX,OFFSETBASEADDBX,AXMOVAX,[BX]JMPAXMOVAL,4CHINT21HCODEGENDSENDBEGIN,分支結(jié)構(gòu)程序舉例,89,3.3.4循環(huán)結(jié)構(gòu)程序,在進行程序設(shè)計時,會出現(xiàn)某段程序反復(fù)多次執(zhí)行的情況,則可用循環(huán)程序結(jié)構(gòu)來實現(xiàn)。采用循環(huán)程序結(jié)構(gòu)不僅使程序變得簡潔清晰,而且減少程序?qū)?nèi)存的占用。,1、循環(huán)程序的結(jié)構(gòu)循環(huán)程序一般由4部分構(gòu)成:,循環(huán)結(jié)構(gòu)程序,90,(1)初始化部分為循環(huán)程序作準備工作,如置循環(huán)次數(shù)、地址指針或關(guān)鍵字,寄存器置初值及標志位設(shè)置等。(2)循環(huán)工作部分是循環(huán)結(jié)構(gòu)的主體。,(3)參數(shù)調(diào)整部分地址指針或循環(huán)次數(shù)的修改等,以便繼續(xù)循環(huán)。,(4)循環(huán)控制部分循環(huán)條件的檢查,以判斷是否繼續(xù)循環(huán)。,循環(huán)結(jié)構(gòu)程序,91,(a)先工作后判斷循環(huán)條件,(b)先判斷循環(huán)條件后工作,循環(huán)結(jié)構(gòu)程序,2、循環(huán)程序結(jié)構(gòu),92,DATASEGMENTTABLEDWa1,a2,a3,a4,a5,a6,a7,a8,a9,a10DWa11,a21,……………………..a20…….DWa91,a92,……………………a100YYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AX,3、循環(huán)程序舉例,i=1,2,…,100,例3-23計算Y=,循環(huán)結(jié)構(gòu)程序,93,MOVAX,0MOVBX,OFFSETTABLMOVCX,100LOP:ADDAX,[BX]INCBXINCBXDECCXJNZLOPMOVYY,AXMOVAH,4CHINT21HCODEDEGMENTENDBEGIN,循環(huán)結(jié)構(gòu)程序,94,例3-4統(tǒng)計數(shù)組中負元素的個數(shù)分析:(1)在數(shù)據(jù)段中放入若干個帶符號數(shù),并計算個數(shù)。(2)設(shè)計一個計數(shù)器(2)從數(shù)據(jù)段中取數(shù)并判斷是否負數(shù),若是計數(shù)器加1。設(shè)計成循環(huán)程序。初始化:計數(shù)器清0,用OFFSET取偏移地址,置循環(huán)次數(shù)。與0相比,用帶符號跳轉(zhuǎn)指令JGE判正負,滿足條件,計數(shù)器加1,修改參數(shù)。否則直接修改參數(shù)。,循環(huán)結(jié)構(gòu)程序,95,數(shù)據(jù)塊的定義如下:DATASEGMENTD1DB-1,-3,5,6,-9;定義數(shù)組COUNTEQU$-D1RSDW?;存放負數(shù)個數(shù)DATAENDS,循環(huán)結(jié)構(gòu)程序,96,代碼段程序為:CODESEGMENTASSUMECS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVBX,OFFSETD1;建立數(shù)據(jù)指針MOVCX,COUNT;設(shè)置計數(shù)器初值MOVDX,0;設(shè)置結(jié)果初值,循環(huán)結(jié)構(gòu)程序,97,LOP1:MOVAL,[BX]CMPAL,0JGEJUSINCDXJUS:INCBXDECCXJNZLOP1;或LOOPLOP1MOVRS,DXMOVAH,4CHINT21HCODESEGMENTENDBEGIN,98,MOVCX,0LOP:ANDAX,AXJZSTPSALAX,1JNCLOPINCCXJMPLOPSTP:HLT這是一個”先判斷后執(zhí)行“的結(jié)構(gòu)。,例3-25統(tǒng)計寄存器AX中‘1’的個數(shù),循環(huán)結(jié)構(gòu)程序,99,3.3.5子程序定義及結(jié)構(gòu)一、概述1、子程序結(jié)構(gòu)(1)結(jié)構(gòu):子程序的第一條語句前有過程名——入口地址的符號表示出口是返回指令RET。(2)調(diào)用與返回:主程序用CALL指令調(diào)用子程序,子程序用RET指令返回主程序(3)子程序文件:子程序說明與子程序清單。,子程序定義及結(jié)構(gòu),100,子程序說明:①功能描述:包括子程序名稱、功能以及性能指標(如執(zhí)行時間)等;②所用寄存器和存儲單元;③子程序的入口、出口參數(shù);④子程序中又調(diào)用的其它子程序;⑤調(diào)用實例(可無)。,子程序定義及結(jié)構(gòu),101,主程序與子程序的連接寄存器和工作單元中內(nèi)容的保護,即保護現(xiàn)場,用PUSH指令和POP指令,可以安排在子程序中,也可以安排在主程序中。通常安排在子程序中。參數(shù)的傳遞,即主程序如何把入口參數(shù)帶入子程序,子程序又如何把出口參數(shù)帶回主程序。,子程序應(yīng)用中應(yīng)注意的問題:,子程序定義及結(jié)構(gòu),102,主程序名為MAIN,子程序名為SUM。采用堆棧傳遞參數(shù),即主程序把參數(shù)壓入棧,子程序出棧。(1)在存儲器中開辟一個20個字的堆棧段,并計算棧頂偏移地址:STACKSEGMENTPARASTACKSPAEDW20DUP(?)TOPEQULENGTHSPAESTACKENDS,例3-28求數(shù)組之和,子程序定義及結(jié)構(gòu),103,DATASEGMENTARY1DB100DUP(?)SUM1DW?ARY2DB150DUP(?)SUM2DW?COUNT1EQUSUM1-ARY1COUNT2EQUSUM2-ARY2DATAENDS,(2)在內(nèi)存數(shù)據(jù)段中放置兩個數(shù)組ARY1,ARY2,預(yù)留求和單元并計算數(shù)組的長度。,子程序定義及結(jié)構(gòu),104,定義代碼段:MAINSEGMENTASSUMECS:MAIN,DS:DATA,SS:STACKMOVAX,DATAMOVDS,AX傳遞參數(shù)調(diào)用子程序:MOVAX,SIZEARY1PUSHAXMOVAX,OFFSETARY1PUSHAXCALLSUM,(3)數(shù)據(jù)求和主程序,子程序定義及結(jié)構(gòu),105,MOVAX,SIZEARY2PUSHAXMOVAX,OFFSETARY2PUSHAXCALLSUMHLTMAINENDSENDSTR,子程序定義及結(jié)構(gòu),106,求數(shù)組之和,定義子程序代碼段并保護現(xiàn)場:PROCESEGMENTASSUMECS:PROCE,DS:DATA,SS:STACKSUMPROCFARPUSHAXPUSHBXPUSHCXPUSHBPPUSHFMOVBP,SP,(4)求和子程序,子程序定義及結(jié)構(gòu),107,通過堆棧傳遞數(shù)組的個數(shù)和偏移地址:MOVCX,[BP+16]MOVBX,[BP+14]數(shù)組求和:MOVAX,0ADN:ADDAL,[BX]INCBXADCAH,0LOOPANDMOV[BX],AX,子程序定義及結(jié)構(gòu),108,恢復(fù)現(xiàn)場返回主程序:POPFPOPBPPOPCXPOPBXPOPAXRETSUMENDPRPOCEENDS,子程序定義及結(jié)構(gòu),109,匯編語言程序舉例,3.2.6匯編語言程序舉例,例3-30將ASCII碼表示的兩位十進制數(shù)轉(zhuǎn)換成一字節(jié)二進制數(shù)。(37H,39H),分析:39H是個位,用減法指令SUB減30即可得。37H是十位,70=7X(23+2)可得。把所得的十位和個位數(shù)相加即可。,110,DATASEGMENTASDECDB37H,39HBINDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,(1)定義數(shù)據(jù)段和代碼段:,匯編語言程序舉例,111,MOVSI,OFFSETASDECMOVAL,[SI];取第一個數(shù)(十位數(shù))SUBAL,30H;十進制數(shù)←ASCIISALAL,1;乘2MOVBL,AL;BL=7X2MOVCL,2SALAL,CL;7X23ADDBL,AL;7X2+7X23=70,(2)取第一個數(shù)并轉(zhuǎn)為2進制數(shù)方法:37H→07H→70=7X(23+2)+(39H→09H),匯編語言程序舉例,112,INCSIMOVAL,[SI];取第二個數(shù)(個位數(shù))SUBAL,30H;二進制數(shù)←ASCADDAL,BL;十位數(shù)+個位數(shù)MOVBIN,AL;存入BINMOVAH,4CHINT21HCODEENDSENDSTART,(3)取第二個數(shù),ASCII→二進制數(shù),兩數(shù)相加。,匯編語言程序舉例,113,算法:二進制→十進制→ASCII。二進制→十進制:二進制數(shù)反復(fù)減100,夠減計數(shù)器加1,直到不夠減為止。計數(shù)器中的數(shù)就是100的個數(shù),即百位數(shù)。十位數(shù)相同。最后一次的結(jié)果(差)為負,要加10以恢復(fù)原值,這就是個位數(shù)。然后將這三個數(shù)(百、十、個)轉(zhuǎn)換成ASCII碼。,例3-32將一字節(jié)二進制數(shù)轉(zhuǎn)換成三位ASCII碼表示的十進制數(shù)。,匯編語言程序舉例,114,CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX,(1)定義數(shù)據(jù)段,把需轉(zhuǎn)換的數(shù)放入內(nèi)存BIN單元,DATASEGMENTBINDB01111111BASDECDB3DUP(?)DATAENDS,(2)、定義代碼段,并初始化,匯編語言程序舉例,115,MOVDI,OFFSETASDECMOVAL,BIN,(3)取需轉(zhuǎn)換的數(shù)送AL中,(4)求二進制數(shù)所含十進制數(shù)百位數(shù)的個數(shù),MOVBL,0AGAIN1:SUBAL,100JBNEXT1INCBLJMPAGAIN1NEXT1:ADDAL,100,匯編語言程序舉例,116,MOVAH,0AGAIN2:SUBAL,10JBNEXTINCAHJMPAGAIN2NEXT:ADDAL,10,(4)求十位數(shù)的個數(shù),(5)把百、十、個位數(shù)轉(zhuǎn)換為ASCII碼,ADDBL,30HADDAH,30HADDAL,30H,匯編語言程序舉例,117,MOV[DI],BLINCDIMOV[DI],AHINCDIMOV[DI],AL,(6)把轉(zhuǎn)換好的ASCII碼送存儲器中,MOVAH,4CHINT21HCODEENDSENDSTART,(7)程序結(jié)束,匯編語言程序舉例,118,有一個若干個字節(jié)的數(shù)據(jù)表,存放在數(shù)據(jù)段中,首地址為TAB,表內(nèi)各數(shù)已按升序排列好。今給定一關(guān)鍵字,試編程從表內(nèi)查找該關(guān)鍵字,若有,則結(jié)束;若無,將該關(guān)鍵字順序插入表中,并修改表長(表長在LTH中)。算法:將給定關(guān)鍵字依次同數(shù)據(jù)表中的數(shù)據(jù)比較,若大于表中的數(shù)據(jù),則繼續(xù)同下一個數(shù)據(jù)比較,若小于表中數(shù)據(jù),則先將從該數(shù)據(jù)開始的數(shù)據(jù)全部下移一個地址,然后將關(guān)鍵字插入表中空格,并將表長數(shù)加1。,例3-36查找,匯編語言程序舉例,119,(1)在數(shù)據(jù)段中放置數(shù)據(jù)表及需查找的數(shù)據(jù)并計算表長,DATASEGMENTTABDB0FH,12H,14H,…TEMDB57HLTHEQUTEM-TABDATAENDS,(2)定義代碼段并初始化,CODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AX,匯編語言程序舉例,120,(3)循環(huán)初始化(取偏移地址、次數(shù),取需查找的字),MOVBX,OFFSETTABMOVCX,LTHMOVAL,TEM,(4)用循環(huán)程序?qū)崿F(xiàn)查找關(guān)鍵字,LOP:CMPAL,[BX]JESOPJLINSTINCBXLOOPLOPJMPJUST,匯編語言程序舉例,121,(4)把關(guān)鍵字插入表中(插入位置后的數(shù)據(jù)依次后移),INST:MOVDI,OFFSETTABSTDADDDI,LTHMOVSI,DIDECSIREPMOVSB,(5)把關(guān)鍵字按順序插入數(shù)據(jù)表中并修改表長,JUST:MOV[BX],ALINCLTH,(6)程序結(jié)束,SOP:MOVAH,4CHINT21HCODEENDSENDSTART,匯編語言程序舉例,122,匯編語言程序舉例,123,ThankYou!,,- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編語言 微機 第三
鏈接地址:http://m.italysoccerbets.com/p-3257165.html