第三章匯編語言程序設(shè)計_第1頁
第三章匯編語言程序設(shè)計_第2頁
第三章匯編語言程序設(shè)計_第3頁
第三章匯編語言程序設(shè)計_第4頁
第三章匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

微機(jī)原理與接口技術(shù)第三章匯編語言程序設(shè)計本章目錄3.1 計算機(jī)語言一、機(jī)器語言二、匯編語言三、高級語言3.2 匯編語言源程序一、匯編語言源程序的結(jié)構(gòu)——分段結(jié)構(gòu)二、匯編語言語句的類型和格式三、數(shù)據(jù)項及表達(dá)式3.3 偽指令一、數(shù)據(jù)定義偽指令二、符號定義偽指令三、段定義偽指令四、設(shè)定段寄存器偽指令五、過程定義偽指令六、模塊定義與連接偽指令(自學(xué))七、宏命令偽指令(自學(xué))3.4 DOS調(diào)用一、概述二、DOS軟中斷和系統(tǒng)功能調(diào)用3.5 匯編語言程序設(shè)計舉例3.1 計算機(jī)語言一、機(jī)器語言用二進(jìn)制表示指令和數(shù)據(jù)優(yōu)點:執(zhí)行速度快,占有內(nèi)存少缺點:不直觀,不易編寫、閱讀和理解,面向硬件,不能移植二、匯編語言用助記符書寫指令,地址和數(shù)據(jù)也可用符號表示優(yōu)點:編寫、閱讀和修改較方便,不易出錯,執(zhí)行速度與機(jī)器語言相近缺點:面向硬件,不能移植匯編:把匯編語言源程序翻譯成機(jī)器語言目標(biāo)程序的過程匯編程序:完成匯編工作的系統(tǒng)軟件。包括:小匯編(ASM):需要64K內(nèi)存支持宏匯編(MASM):需要96K以上的內(nèi)存支持,功能更強(qiáng)三、高級語言包括:BASIC,C,C++,FORTRAN,PASCAL,COBOL等優(yōu)點:通用性強(qiáng),容易理解、學(xué)習(xí)和掌握缺點:占用內(nèi)存和時間多3.2 匯編語言源程序例3.2.1用匯編語言源程序?qū)崿F(xiàn)五字節(jié)十六進(jìn)制數(shù)相加DATA SEGMENT ;定義數(shù)據(jù)段DATA1 DB10H,11H,0A4H,13H,14HDATA2 DB23H,24H,21H,22H,0C2HDATA ENDS ;數(shù)據(jù)段結(jié)束CODE SEGMENT ;定義代碼段ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX ;初始化DSMOVCX,5MOVSI,0CLCLOOPER: MOVAL,DATA2[SI] ADC DATA1[SI],AL INC SI DEC CX JNZ LOOPER HLTCODE ENDS ;代碼段結(jié)束

END START ;源程序結(jié)束返回1返回2一、匯編語言源程序的結(jié)構(gòu)—分段結(jié)構(gòu)NAME1 SEGMENT

(語句體)NAME1 ENDSNAME2 SEGMENT

(語句體)NAME2 ENDS

(語句體)

END <標(biāo)號>二、匯編語言語句的類型和格式類型:指令性語句:由CPU指令組成指示性語句:由偽指令指令組成組成:指令性語句:[標(biāo)號:][前綴]操作碼 [操作數(shù)[,操作數(shù)]][;注釋]指示性語句:[名字]偽操作[操作數(shù)[,操作數(shù),…]][;注釋]指令性語句和指示性語句的區(qū)別標(biāo)號和名字:指令性語句中的“標(biāo)號”和指示性語句中的“名字”在形式上類似,但標(biāo)號表示指令的符號地址,需要加上“:”;名字通常表示變量名,段名,過程名等,其后不加“:”。不同的偽操作對是否有名字有不同的規(guī)定,有些偽操作規(guī)定前面必須有名字,有些則不允許有名字,還用一些可以任選。名字在多數(shù)情況下表示的是變量名,用來表示存儲器中一個數(shù)據(jù)區(qū)的地址。指令性語句中的操作數(shù)最多為雙操作數(shù),也可以沒有操作數(shù),而指示性語句中的操作數(shù)至少要有一個,并可根據(jù)需要有多個,當(dāng)操作數(shù)不只一個時,相互之間用逗號隔開例如:STRAT:MOVAX,DATA;指令性語句DATA1DB11H,22H,33H;指示性語句注釋:在匯編語言程序中,注釋的前面要求加上“;”,注釋可以跟在語句后面,也可以作為一個獨立的行。若注釋有多行,則換行以后前面還要加上分號。三、數(shù)據(jù)項及表達(dá)式(一)常量數(shù)字常量字符串常量:用單引號括起的一個或多個ASCII碼字符,如’aberTY’(二)標(biāo)號標(biāo)號是由程序員確定的,它不能與指令助記符或偽指令重名。也不允許由數(shù)字打頭,字符個數(shù)不超過31。標(biāo)號是某條指令所存放單元的符號地址,是轉(zhuǎn)移或調(diào)用指令的目標(biāo)操作數(shù)。標(biāo)號有三種屬性:段值屬性:段值屬性是標(biāo)號所在段的段基址,它存放在CS寄存器中偏移量屬性:偏移量屬性是標(biāo)號所在段的起始地址到定義該標(biāo)號的地址之間的字節(jié)數(shù)(即偏移地址)。它是16位無符號數(shù)類型:

NEAR:近標(biāo)號,只能在段內(nèi)被引用,地址指針為2字節(jié)FAR:遠(yuǎn)標(biāo)號,可以在其他段被引用,地址指針4字節(jié)(三)變量變量也有三種屬性:段屬性:變量所在段的段基址,存放在DS或ES寄存器中偏移量屬性:變量所在段的起始地址到變量地址之間的字節(jié)數(shù),它是16位無符號數(shù)類型:BYTE,WORD,DWORD,QWORD,TBYTE變量是存儲器中某個數(shù)據(jù)區(qū)的名字,變量的值可以改變。變量在指令中可以作為存儲器操作數(shù)引用變量名由字母打頭,長度不超過31個字符,使用變量時應(yīng)注意以下兩點:①變量類型與指令的要求相符。如:MOV AX,VAR1 ;要求VAR1必須定義為字類型變量,否則這里的引用就是錯誤的②在定義變量時,變量名對應(yīng)的是數(shù)據(jù)區(qū)的首地址。若數(shù)據(jù)區(qū)中有多個數(shù)據(jù),則在對其它數(shù)據(jù)操作時,需修改地址。如:NUM DB 11H,22H,33H…MOV AL,NUM+2 ;(AL)33H(四)表達(dá)式表達(dá)式不是指令,不能由CPU執(zhí)行。在程序匯編時,匯編程序?qū)Ρ磉_(dá)式進(jìn)行運(yùn)算,得到一個確定的值。所以在CPU執(zhí)行程序時,表達(dá)式本身已經(jīng)是一個有確定值的操作數(shù)。表達(dá)式的常用運(yùn)算符:1、算術(shù)運(yùn)算符+、-:用于數(shù)值表達(dá)式和地址表達(dá)式*、/、MOD:只用于數(shù)值表達(dá)式例如:MOVAL,8+5等價于:MOVAL,132、邏輯運(yùn)算符AND、OR、XOR、NOT:只用于數(shù)值表達(dá)式例如:MOVAL,0ADHAND0CCH等價于:MOVAL,8CH注:邏輯運(yùn)算符和邏輯指令的區(qū)別:

ANDAL,01011010B ;邏輯指令

MOVAL,01011010BAND11110000B;邏輯運(yùn)算符3、關(guān)系運(yùn)算符EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于):參與關(guān)系運(yùn)算的必須是兩個數(shù)值或同一段中的兩個存儲單元地址,運(yùn)算結(jié)果為0(關(guān)系不成立時)或0FFFFH(即-1)(關(guān)系成立時)。例如,MOVAX,4EQ3;關(guān)系不成立,匯編成:MOVAX,0MOVAX,4NE3;關(guān)系成立,匯編成:MOVAX,0FFFFH4、取值運(yùn)算符和屬性運(yùn)算符取值運(yùn)算符分析一個存儲器操作數(shù)的屬性;而屬性運(yùn)算符則可以規(guī)定存儲器操作數(shù)的某個屬性①OFFSET利用OFFSET可以得到一個標(biāo)號或變量的偏移地址例如,MOVSI,OFFSETDATA1②SEG利用SEG可以得到一個標(biāo)號或變量的段基址,例如,下面兩條指令的執(zhí)行結(jié)果是將變量ARRAY的段地址送DS寄存器MOVAX,SEGARRAYMOVDS,AX③PTR:指定位于其后的存儲器操作數(shù)的類型,例如CALLDWORDPTR[BX];說明存儲器操作數(shù)為4字節(jié),即遠(yuǎn)過程調(diào)用修改已定義變量的類型例如,變量VAR被定義為字變量,現(xiàn)在要將VAR當(dāng)做字節(jié)操作數(shù)使用,則:錯誤:MOVAL,VAR正確:MOVAL,BYTEPTRVAR5、其它運(yùn)算符(1)方括號[]:方括號里的內(nèi)容表示操作數(shù)的偏移地址(2)段超越運(yùn)算符冒號:“:”3.3 偽指令偽指令與CPU指令的區(qū)別:CPU指令在程序運(yùn)行時由CPU執(zhí)行,每條指令對應(yīng)CPU的一種特定操作;而偽指令在匯編過程中由匯編程序執(zhí)行經(jīng)過匯編以后,每條CPU指令都被匯編并產(chǎn)生一條與之對應(yīng)的目標(biāo)代碼,而偽操作則不產(chǎn)生任何目標(biāo)代碼。一、數(shù)據(jù)定義偽指令(一)格式:[變量名] 偽指令操作數(shù)[,操作數(shù)…]DB(DefineByte):定義變量為字節(jié)類型,變量中的每個操作數(shù)占有一個字節(jié)。DB偽指令也常用來定義字符串,例如:定義功能偽指令定義VC++定義無符號字節(jié)數(shù)據(jù)DATA1DB254unsignedchardata1=254有符號字節(jié)數(shù)據(jù)DATA4DB-100chardata4=-100字符串SDB‘fsdfsdafs’strings("fsdfsdafs");DW(DefineWord):定義變量為字類型,變量中的每個操作數(shù)占有2個字節(jié)。在內(nèi)存中存放時,低字節(jié)放在低地址,高字節(jié)放在高地址偽指令定義VC++定義無符號字?jǐn)?shù)據(jù)DATA1DW2544unsignedshortdata1=2544有符號字?jǐn)?shù)據(jù)DATA4DW-100shortdata4=-100DD(DefineDoubleWord):定義變量為雙字類型,變量中的每個操作數(shù)占有4個字節(jié)。在內(nèi)存中存放時,低字節(jié)放在低地址,高字節(jié)放在高地址DD用于定義有符號雙字、無符號雙字和浮點數(shù)(單精度實數(shù))偽指令定義VC++定義無符號雙字DATA1DD254400unsignedintdata1=254400有符號雙字DATA4DD-100intdata4=-100浮點數(shù)NUM1DD-23.4floatNum1=-23.4DQ(DefineQuadWord):定義變量為4字類型,變量中的每個操作數(shù)占有8個字節(jié)。在內(nèi)存中存放時,低字節(jié)放在低地址,高字節(jié)放在高地址DQ通常用于存放雙精度實數(shù)。偽指令定義VC++定義雙精度實數(shù)NUM1DQ123.4doubleNum1=123.4DT(Defineten-bytes):定義變量的類型為十字節(jié)(TBYTE)。DT后面的每個操作數(shù)為10個字節(jié)的壓縮BCD碼。偽指令定義VC++定義十字節(jié)數(shù)據(jù)NUM1DT1234567890H無(二)通配符“?”給變量分配內(nèi)存單元,但不賦初值。例如DATA2DW?;為變量分配2個字節(jié)的空間,初值任意(三)重復(fù)操作符DUPBUFDB10DUP(?);為變量BUF分配100個字節(jié)MASKDB 5DUP(‘OK!’);定義一個數(shù)據(jù)區(qū)MASK,其中有5個重復(fù)的字符串’OK!’,共占15個字節(jié)ARRAYDB100DUP(3DUP(8),6);定義一個數(shù)據(jù)區(qū),其中包含重復(fù)100次的內(nèi)容:8,8,8,6例如:畫圖表示下列變量在內(nèi)存中的存放順序VAR1DB11H,‘HELLO!’VAR2DW12H,3344HVAR3DD1234HVAR4DW2DUP(88H)VAR5DB2DUP(56,78)11H48H45H4CH4CH4FH21H12H00H44H33H34H12H00H00H88H00H88H00H38H4EH38H4EHVAR1+0VAR1+1VAR2+0VAR2+1VAR3+0VAR3+1VAR4+0VAR4+1VAR5+0VAR5+1二、符號定義偽指令(一)EQU格式:名字 EQU 表達(dá)式功能:將表達(dá)式的值賦予一個名字。以后可用這個名字代替表達(dá)式。從而使程序簡捷易讀,易修改。其中,表達(dá)式可以是:常數(shù),變量,數(shù)值表達(dá)式,地址表達(dá)式,指令助記符。例如:TENEQU0AH;表示TEN為常數(shù)0AHADREQUES:[BP+DI+5];地址表達(dá)式在程序段中應(yīng)用以上定義:MOVAL,TEN;AL0AHJMPWORDPTRADR;轉(zhuǎn)到以字單元ES:[BP+DI+5]的內(nèi)容為地址的程序段執(zhí)行EQU不允許對同一符號重新定義。(二)等號“=”格式: 名字=表達(dá)式功能與EQU基本相同,區(qū)別在于它可以對同一符號重新定義。例如:FACTOR=10H;FACTOR代表數(shù)值10H…FACTOR=50H;從現(xiàn)在開始,F(xiàn)ACTOR代表數(shù)值50H三、段定義偽指令(一)SEGMENT/ENDS格式:段名 SEGMENT [定位類型][組合類型][‘類別’]

(語句體)段名 ENDS功能:定義一個邏輯段,三個任選項是給匯編和連接程序的命令。段名不能與指令助記符或偽指令等保留字重名1、定位類型(Align):告訴匯編程序如何確定邏輯段的邊界在存儲器中的位置2、組合類型(Combine)功能:主要用于具有多個模塊的程序中。它告訴匯編程序,當(dāng)一個邏輯段裝入存儲器時它與其他段段如何組合。組合類型有6種:(1)NONE(缺省方式):表示本段與其他段不組合,即對不同程序中的邏輯段,即使段名相同,也分別作為不同的邏輯段裝入內(nèi)存而不進(jìn)行組合。(2)PUBLIC:對不同程序模塊中用PUBLIC說明的同名邏輯段,匯編時將它們組合在一起,構(gòu)成一個大的邏輯段裝入內(nèi)存。(3)STACK:與PUBLIC基本相同,但僅限于堆棧區(qū)的邏輯段使用。即在匯編時將不同程序模塊中用STACK說明的同名邏輯段集中為一個大的堆棧段,由各模塊共享。SP指向這個大的堆棧區(qū)的棧頂(4)COMMON:對不同程序模塊中用COMMON說明的同名邏輯段,連接時從同一地址開始裝入,此時,各邏輯段將發(fā)生重疊。最后,連接后的長度等于原來最長邏輯段的長度,重疊部分的內(nèi)容為最后一個邏輯段的內(nèi)容(5)MEMORY:當(dāng)幾個邏輯段連接時,本邏輯段定位在最高地址空間。若被連接的邏輯段中有多個段的組合類型是MEMORY,則匯編程序只將首先遇到的段作MEMORY,其它為COMMON段(6)AT表達(dá)式 根據(jù)表達(dá)式的結(jié)果給段定位。例如AT8A00H表示本段從物理地址A8000H開始裝入。3、’類別’(’class’)功能:在連接時決定各邏輯段的裝入順序。當(dāng)幾個程序模塊進(jìn)行連接時,其中具有相同類別名的邏輯段被裝入連續(xù)的內(nèi)存區(qū)定位類型,組合類型和‘類別’這3個可選項主要用于多個程序模塊的連接。若程序只有一個模塊,即只包含代碼段,數(shù)據(jù)段,附加段和堆棧段時,除堆棧段建議用STACK類型外,其他段的組合類型及類別均可省略。定位類型一般采用默認(rèn)值PARA四、設(shè)定段寄存器偽指令功能:ASSUME告訴匯編程序,源程序中的邏輯段和物理段之間的關(guān)系。當(dāng)匯編程序匯編一個邏輯段時,即可利用相應(yīng)的段寄存器尋址該邏輯段中的指令或數(shù)據(jù)格式:ASSUME段寄存器名:段名,[段寄存器名:段名[,…]]注意:①ASSUME應(yīng)放在可執(zhí)行程序開始位置的前面②ASSUME只通知匯編程序有關(guān)段寄存器和邏輯段的關(guān)系,并沒有給段寄存器賦實際的初值,后一項工作必須通過CPU指令(MOV)完成(代碼段例外)(見例3.2.1)五、過程定義偽指令(一)PROC/ENDP格式:過程名PROC[NEAR/FAR]…RET過程名ENDP過程(即子程序)可以是近過程(與調(diào)用程序在同一個代碼段內(nèi)),此時類型為NEAR(缺?。?;過程也可以是遠(yuǎn)過程(與調(diào)用程序不在同一個代碼段內(nèi)),此時類型為FAR。過程的定義和調(diào)用均可嵌套,例如:NAME1PROC FAR

… CALLNAME2

… RETNAME2PROC

… RETNAME2ENDPNAME1ENDP過程N(yùn)AME2嵌入在過程N(yùn)AME1中例如:編寫10ms延時子程序DELAYPROC;定義一個近過程 PUSHBX;保護(hù)BX原來的內(nèi)容 PUSHCX;保護(hù)CX原來的內(nèi)容 MOVBL,2;外循環(huán)次數(shù)=2NEXT:MOVCX,4167;內(nèi)循環(huán)次數(shù),實現(xiàn)延時5msW10MS:LOOPW10MS;CX0則循環(huán) DECBL;修改外循環(huán)計數(shù)值 JNZNEXT;BX0則進(jìn)行第2輪循環(huán) POPCX;恢復(fù)CX原來的內(nèi)容 POPBX;恢復(fù)BX原來的內(nèi)容 RET ;過程返回DELAYENDP ;過程結(jié)束六、宏命令偽指令宏調(diào)用和子程序調(diào)用的區(qū)別:宏調(diào)用由MASM在匯編過程中處理,在每個宏調(diào)用處,將相應(yīng)的宏定義體插入;子程序調(diào)用是用CALL和RET指令完成宏調(diào)用占用內(nèi)存較多宏調(diào)用執(zhí)行速度較快格式:宏指令名 MACRO [<形參表>]

…(宏定義體) ENDM使用宏的過程:宏定義→宏調(diào)用→宏擴(kuò)展。其中,宏擴(kuò)展是指匯編時,MASM對每個宏指令名,自動用相應(yīng)宏定義體中的程序段代替。形參與實參:①形參可以沒有②若實參多于形參,多余的實參被忽略;若實參少于形參,多余的形參為空例

有如下宏定義和宏調(diào)用STRMOVMACRO SOUR,DEST,COUNT,LEN MOV SI,OFFSETSOUR MOV DI,OFFSETDEST MOV CX,COUNT CLD REP MOVS&LEN ENDM ... STRMOV BUFFER1,BUFFER2,100,B ...則宏擴(kuò)展后為:

STRMOV BUFFER1,BUFFER2,100,B

+ MOV SI,OFFSETBUFFER1 + MOV DI,OFFSETBUFFER2 + MOV CX,COUNT + CLD + REP MOVSB注:宏定義允許嵌套七、模塊定義與連接偽指令在編寫較大的匯編語言程序時,通常將其劃分為幾個獨立的源程序(或稱模塊),然后將各個模塊分別進(jìn)行匯編,生成各自的目標(biāo)程序,最后將它們連接成為一個完整的可執(zhí)行程序。在每一個模塊的開始,常用偽指令NAME或TITLE為該模塊定義一個名字,而在模塊的結(jié)尾處要加結(jié)束偽指令END,以使匯編程序結(jié)束匯編。(一)NAME格式: NAME模塊名功能:給匯編后得到的目標(biāo)程序指定一個名字,以便連接時使用,NAME前不允許加標(biāo)號。(二)TITLE格式:TITLE標(biāo)題名功能:為程序清單的每一頁指定打印的標(biāo)題。標(biāo)題名最多允許60個字符若程序中沒有NAME偽指令,則匯編程序?qū)ITLE偽指令后面的標(biāo)題名中的前六個字符作為模塊名。若源程序中既沒有使用NAME,又沒有使用TITLE偽指令,則匯編程序?qū)⒃闯绦虻奈募鳛槟繕?biāo)程序的模塊名。(三)END格式: END [標(biāo)號] 功能:源程序結(jié)束。其中,標(biāo)號表示程序執(zhí)行的開始地址。是任選項。若有多個模塊連接在一起,則只有主模塊的END語句使用標(biāo)號見例3.2.13.4 DOS調(diào)用微機(jī)的系統(tǒng)軟件提供了很多可供用戶調(diào)用的功能子程序。包括控制臺輸入/輸出,基本硬件操作、文件管理、進(jìn)程管理等。用戶可在自己的程序中直接調(diào)用這些功能,而無需在自行編寫。系統(tǒng)軟件中提供的功能調(diào)用有兩種:BIOS(BasicInputandOutputSystem)功能調(diào)用(也叫低級調(diào)用)、DOS(DiskOperationSystem)功能調(diào)用(也稱高級調(diào)用)BIOS:固化在主板上FlashROM中一組程序,在IBMPC的存儲器系統(tǒng)中,BIOS存放在從地址0FE00H開始的8KBROM存儲區(qū)中,其功能包括系統(tǒng)測試程序、初始化引導(dǎo)程序、部分矢量裝入程序及外設(shè)的服務(wù)程序。DOS負(fù)責(zé)管理系統(tǒng)的所有資源、協(xié)調(diào)微機(jī)操作。DOS功能調(diào)用不依賴于具體的硬件系統(tǒng)。二、DOS系統(tǒng)功能調(diào)用DOS系統(tǒng)功能調(diào)用的步驟:Step1:AH置功能號Step2:在指定寄存器中放置入口參數(shù)Step3:執(zhí)行INT21H指令Step4:分析出口參數(shù)1、鍵盤輸入鍵盤上的按鍵分為3種類型:字符鍵,如字母、數(shù)字等功能鍵,如Del,Enter等組合鍵,如Shift,Alt等DOS系統(tǒng)功能通過調(diào)用字符輸入子功能,可以接收從鍵盤上輸入的字符,輸入的字符將以對應(yīng)的ASCII碼形式存放。例如:若在鍵盤上按下數(shù)據(jù)鍵“9”,則鍵盤輸入功能將返回一個字符9的ASCII碼39H。若程序要求的是其他類型的值,則應(yīng)自行編程進(jìn)行轉(zhuǎn)換。(1)單字符輸入功能號為1,7和8。其中7號和8號功能無回顯,1號功能有回顯。(回顯是指鍵盤輸入的內(nèi)容同時也顯示在顯示器上)編程時,可根據(jù)輸入的信息是否需要自動顯示來選擇三者之一例如,按鍵‘Y’按下使程序轉(zhuǎn)向Yes分支,按鍵‘N’按下使程序轉(zhuǎn)向Not分支,按下其它鍵,繼續(xù)等待輸入字符KEY: MOV AH,1 INT 21H CMP AL,'Y‘ JE YES CMP AL,'N' JE NOT JMP KEY ...YES: ...NOT:

…(2)字符串輸入(0AH)該功能要求用戶指定一個輸入緩沖區(qū)來存放輸入的字符串。緩沖器一般定義在數(shù)據(jù)段,結(jié)構(gòu)如圖:緩沖區(qū)長度n實際讀入的字符數(shù)(不含回車符)n個字節(jié)的預(yù)留內(nèi)存區(qū)(DOS從鍵盤讀入的字符放在此處)n+2個字節(jié)的輸入緩沖區(qū)123n+2若輸入的字符數(shù)(包括回車符)大于此值,則喇叭會發(fā)出嘟嘟聲,且光標(biāo)不再右移直到輸入回車符為止由0AH號功能自動填入在調(diào)用此功能前,應(yīng)把輸入緩沖區(qū)的起始偏移地址預(yù)置入DX寄存器。例如,從鍵盤上輸入一個長度不超過10的字符串,DATASEGMENTSTRINGDB10,0,10DUP(?)DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEADX,STRING MOVAH,0AH INT21H MOVAH,4CH INT21HCODEENDS ENDSTART2、顯示器輸出在顯示器上顯示的內(nèi)容都是字符形式,如果是數(shù)字,則一定是其對應(yīng)的ASCII碼。例如,若要顯示5,需要先將它轉(zhuǎn)換為5的ASCII碼35H(1)單字符顯示(2、6號功能)使用功能2顯示:…MOVDL,<要顯示的字符>MOVAH,2INT21H…使用功能6顯示:…MOVDL,<要顯示的字符>MOVAH,6INT21H…例如:在屏幕上依次顯示”1”,“2”,“3”,”A”,“B”,“C”6個字符DATASEGMENTSTRDB‘123ABC’DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEABX,STR MOVCX,6LPP: MOVAH,2 MOVDL,[BX] INCBX INT21H LOOPLPP MOVAH,4CH INT21HCODEENDS ENDSTART(2)字符串顯示(9號功能)該功能要求被顯示的字符串必須以“$”字符作為結(jié)束符。顯示事如果希望光標(biāo)能自動換行,則應(yīng)該在字符串結(jié)束前回車及換行的ASCII碼0DH和0AHDATASEGMENTSTRDB‘Hello,World!’,0DH,0AH,‘$’DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEADX,STR MOVAH,9 INT21H MOVAH,4CH INT21HCODEENDS ENDSTART例如:在屏幕上顯示字符串”Hello,World!”3.返回到DOS(4CH號功能)一個實際可運(yùn)行的用戶程序在執(zhí)行完后,應(yīng)該返回DOS,簡單地使用HLT指令使CPU停止運(yùn)行將無法把控制權(quán)交還給DOS。而4CH號功能可以完成這一任務(wù)。方法:MOVAH,4CHINT21H例題:從鍵盤輸入一串字符,在字符串尾插入’$’,并顯示該字符串。DATASEGMENTBUFSIZEDB50ACTLENDB?CHARSDB50DUP(20H)DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEADX,BUFSIZE MOVAH,0AH INT21H XORCX,CX MOVCL,ACTLEN LEADX,CHARS

MOVBX,DX ADDBX,CX MOVBYTEPTR[BX],’$’ MOVAH,09H INT21H MOVAH,4CH INT21HCODEENDS ENDSTART例1將BCD數(shù)轉(zhuǎn)換為ASCII碼以BCDBUFF為首址的內(nèi)存區(qū)有18個字節(jié)的組合BCD數(shù),要求轉(zhuǎn)換為相應(yīng)的36個ASCII碼,并依次輸出到CRT顯示。BCD數(shù)存放時,低位在前,高位在后。若該十進(jìn)制數(shù)有若干個前導(dǎo)“0”,不顯示前導(dǎo)“0”,若該數(shù)字全部為0,則要求顯示一個“0”3.5 匯編語言程序設(shè)計舉例例1流程圖DATA SEGMENTBCDBUFDB56H,34H,12H,90H,78H,56H,34H,12H,90H,78H DB56H,34H,12H,90H,78H,56H,34H,12HDATA ENDSSTACK SEGMENTSTACK DB 100DUP(?)STACK ENDSCODE SEGMENT ASSUME:CS:CODE,DS:DATA,SS:STACKTRANS PROC FARATART: PUSH DS MOV AX,0 PUSH AX;使程序返回DOS MOV AX,DATA MOV DS,AX MOV CX,18;(CX)<-字節(jié)數(shù) LEA SI,BCDBUF ADDSI,17;(SI)<-BCD緩沖區(qū)末址

MOVDH,0;設(shè)置前導(dǎo)為‘0’標(biāo)志LOAD: PUSHCX MOVAL,[SI];取一個字節(jié)BCD數(shù)

DEC SI MOVBL,AL;暫存BL MOVCL,4 ROLAL,CL ANDAL,0FH;取高4位BCD ORDH,AL;是否為前導(dǎo)‘0’ JZLAST;是,不顯示

ADDAL,30H;不是,轉(zhuǎn)換,顯示

MOVDL,AL MOVAH,2 INT 21HLAST: POPCX;恢復(fù)CX中的循環(huán)次數(shù)

CMPCX,1;最后一個字節(jié)?

JNZBCDL;不是,轉(zhuǎn)移到BCDL MOVDH,OFFH;是,設(shè)置標(biāo)志BCDL: MOVAL,BLANDAL,0FH ORDH,AL JZGOON ADDAL,30H MOVDL,AL MOV AH,2 INT 21H GOON: LOOP LOAD RETTRANSENDPCODE ENDS END START例2字符串查找假設(shè)內(nèi)存中已經(jīng)存有一張表,從鍵盤上輸入一個字符串,要求在表中查找該字符串,如有,則在屏幕上顯示“OK!”,若沒有,則顯示“No!”;若輸入字符串的長度大于表的長度,則顯示“Wrong!Thelengthofthestringistoolong!”(本例中假設(shè)內(nèi)存中已經(jīng)存有一張包括26個英文大寫字母的表),例2流程圖DATA SEGMENTTABLE DB 'ABCDEFGHIGKLMNOPQRSTUVWXYZ'STR1 DB 'Pleaseenterastring:',ODH,OAH,'$'STR2 DB 'Wrong!Thestringistoolo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論