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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

微機原理與接口技術第三章匯編語言程序設計本章目錄3.1 計算機語言一、機器語言二、匯編語言三、高級語言3.2 匯編語言源程序一、匯編語言源程序的結構——分段結構二、匯編語言語句的類型和格式三、數據項及表達式3.3 偽指令一、數據定義偽指令二、符號定義偽指令三、段定義偽指令四、設定段寄存器偽指令五、過程定義偽指令六、模塊定義與連接偽指令(自學)七、宏命令偽指令(自學)3.4 DOS調用一、概述二、DOS軟中斷和系統(tǒng)功能調用3.5 匯編語言程序設計舉例3.1 計算機語言一、機器語言用二進制表示指令和數據優(yōu)點:執(zhí)行速度快,占有內存少缺點:不直觀,不易編寫、閱讀和理解,面向硬件,不能移植二、匯編語言用助記符書寫指令,地址和數據也可用符號表示優(yōu)點:編寫、閱讀和修改較方便,不易出錯,執(zhí)行速度與機器語言相近缺點:面向硬件,不能移植匯編:把匯編語言源程序翻譯成機器語言目標程序的過程匯編程序:完成匯編工作的系統(tǒng)軟件。包括:小匯編(ASM):需要64K內存支持宏匯編(MASM):需要96K以上的內存支持,功能更強三、高級語言包括:BASIC,C,C++,FORTRAN,PASCAL,COBOL等優(yōu)點:通用性強,容易理解、學習和掌握缺點:占用內存和時間多3.2 匯編語言源程序例3.2.1用匯編語言源程序實現(xiàn)五字節(jié)十六進制數相加DATA SEGMENT ;定義數據段DATA1 DB10H,11H,0A4H,13H,14HDATA2 DB23H,24H,21H,22H,0C2HDATA ENDS ;數據段結束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 ;代碼段結束

END START ;源程序結束返回1返回2一、匯編語言源程序的結構—分段結構NAME1 SEGMENT

(語句體)NAME1 ENDSNAME2 SEGMENT

(語句體)NAME2 ENDS

(語句體)

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

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

ANDAL,01011010B ;邏輯指令

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

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

… CALLNAME2

… RETNAME2PROC

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

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

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

STRMOV BUFFER1,BUFFER2,100,B

+ MOV SI,OFFSETBUFFER1 + MOV DI,OFFSETBUFFER2 + MOV CX,COUNT + CLD + REP MOVSB注:宏定義允許嵌套七、模塊定義與連接偽指令在編寫較大的匯編語言程序時,通常將其劃分為幾個獨立的源程序(或稱模塊),然后將各個模塊分別進行匯編,生成各自的目標程序,最后將它們連接成為一個完整的可執(zhí)行程序。在每一個模塊的開始,常用偽指令NAME或TITLE為該模塊定義一個名字,而在模塊的結尾處要加結束偽指令END,以使匯編程序結束匯編。(一)NAME格式: NAME模塊名功能:給匯編后得到的目標程序指定一個名字,以便連接時使用,NAME前不允許加標號。(二)TITLE格式:TITLE標題名功能:為程序清單的每一頁指定打印的標題。標題名最多允許60個字符若程序中沒有NAME偽指令,則匯編程序將TITLE偽指令后面的標題名中的前六個字符作為模塊名。若源程序中既沒有使用NAME,又沒有使用TITLE偽指令,則匯編程序將源程序的文件名作為目標程序的模塊名。(三)END格式: END [標號] 功能:源程序結束。其中,標號表示程序執(zhí)行的開始地址。是任選項。若有多個模塊連接在一起,則只有主模塊的END語句使用標號見例3.2.13.4 DOS調用微機的系統(tǒng)軟件提供了很多可供用戶調用的功能子程序。包括控制臺輸入/輸出,基本硬件操作、文件管理、進程管理等。用戶可在自己的程序中直接調用這些功能,而無需在自行編寫。系統(tǒng)軟件中提供的功能調用有兩種:BIOS(BasicInputandOutputSystem)功能調用(也叫低級調用)、DOS(DiskOperationSystem)功能調用(也稱高級調用)BIOS:固化在主板上FlashROM中一組程序,在IBMPC的存儲器系統(tǒng)中,BIOS存放在從地址0FE00H開始的8KBROM存儲區(qū)中,其功能包括系統(tǒng)測試程序、初始化引導程序、部分矢量裝入程序及外設的服務程序。DOS負責管理系統(tǒng)的所有資源、協(xié)調微機操作。DOS功能調用不依賴于具體的硬件系統(tǒng)。二、DOS系統(tǒng)功能調用DOS系統(tǒng)功能調用的步驟:Step1:AH置功能號Step2:在指定寄存器中放置入口參數Step3:執(zhí)行INT21H指令Step4:分析出口參數1、鍵盤輸入鍵盤上的按鍵分為3種類型:字符鍵,如字母、數字等功能鍵,如Del,Enter等組合鍵,如Shift,Alt等DOS系統(tǒng)功能通過調用字符輸入子功能,可以接收從鍵盤上輸入的字符,輸入的字符將以對應的ASCII碼形式存放。例如:若在鍵盤上按下數據鍵“9”,則鍵盤輸入功能將返回一個字符9的ASCII碼39H。若程序要求的是其他類型的值,則應自行編程進行轉換。(1)單字符輸入功能號為1,7和8。其中7號和8號功能無回顯,1號功能有回顯。(回顯是指鍵盤輸入的內容同時也顯示在顯示器上)編程時,可根據輸入的信息是否需要自動顯示來選擇三者之一例如,按鍵‘Y’按下使程序轉向Yes分支,按鍵‘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ū)來存放輸入的字符串。緩沖器一般定義在數據段,結構如圖:緩沖區(qū)長度n實際讀入的字符數(不含回車符)n個字節(jié)的預留內存區(qū)(DOS從鍵盤讀入的字符放在此處)n+2個字節(jié)的輸入緩沖區(qū)123n+2若輸入的字符數(包括回車符)大于此值,則喇叭會發(fā)出嘟嘟聲,且光標不再右移直到輸入回車符為止由0AH號功能自動填入在調用此功能前,應把輸入緩沖區(qū)的起始偏移地址預置入DX寄存器。例如,從鍵盤上輸入一個長度不超過10的字符串,DATASEGMENTSTRINGDB10,0,10DUP(?)DATAENDSCODESEGENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEADX,STRING MOVAH,0AH INT21H MOVAH,4CH INT21HCODEENDS ENDSTART2、顯示器輸出在顯示器上顯示的內容都是字符形式,如果是數字,則一定是其對應的ASCII碼。例如,若要顯示5,需要先將它轉換為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號功能)該功能要求被顯示的字符串必須以“$”字符作為結束符。顯示事如果希望光標能自動換行,則應該在字符串結束前回車及換行的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號功能)一個實際可運行的用戶程序在執(zhí)行完后,應該返回DOS,簡單地使用HLT指令使CPU停止運行將無法把控制權交還給DOS。而4CH號功能可以完成這一任務。方法: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數轉換為ASCII碼以BCDBUFF為首址的內存區(qū)有18個字節(jié)的組合BCD數,要求轉換為相應的36個ASCII碼,并依次輸出到CRT顯示。BCD數存放時,低位在前,高位在后。若該十進制數有若干個前導“0”,不顯示前導“0”,若該數字全部為0,則要求顯示一個“0”3.5 匯編語言程序設計舉例例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é)數 LEA SI,BCDBUF ADDSI,17;(SI)<-BCD緩沖區(qū)末址

MOVDH,0;設置前導為‘0’標志LOAD: PUSHCX MOVAL,[SI];取一個字節(jié)BCD數

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

ADDAL,30H;不是,轉換,顯示

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

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

JNZBCDL;不是,轉移到BCDL MOVDH,OFFH;是,設置標志BCDL: MOVAL,BLANDAL,0FH ORDH,AL JZGOON ADDAL,30H MOVDL,AL MOV AH,2 INT 21H GOON: LOOP LOAD RETTRANSENDPCODE ENDS END START例2字符串查找假設內存中已經存有一張表,從鍵盤上輸入一個字符串,要求在表中查找該字符串,如有,則在屏幕上顯示“OK!”,若沒有,則顯示“No!”;若輸入字符串的長度大于表的長度,則顯示“Wrong!Thelengthofthestringistoolong!”(本例中假設內存中已經存有一張包括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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論