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