微機(jī)原理與接口技術(shù)匯編語言程序設(shè)計(jì)_第1頁
微機(jī)原理與接口技術(shù)匯編語言程序設(shè)計(jì)_第2頁
微機(jī)原理與接口技術(shù)匯編語言程序設(shè)計(jì)_第3頁
微機(jī)原理與接口技術(shù)匯編語言程序設(shè)計(jì)_第4頁
微機(jī)原理與接口技術(shù)匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第4 4章章 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)本章重點(diǎn)本章重點(diǎn)v掌握匯編語言程序的規(guī)范格式掌握匯編語言程序的規(guī)范格式v掌握匯編語言程序設(shè)計(jì)的基本方法掌握匯編語言程序設(shè)計(jì)的基本方法 順序程序設(shè)計(jì)順序程序設(shè)計(jì) 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 選擇程序設(shè)計(jì)選擇程序設(shè)計(jì) 子程序設(shè)計(jì)子程序設(shè)計(jì)v了解匯編語言與高級語言的接口了解匯編語言與高級語言的接口v匯編語言的特點(diǎn)匯編語言的特點(diǎn) 80868086系統(tǒng)常用的匯編語言稱為系統(tǒng)常用的匯編語言稱為ASMASM8686,匯編語言的有如下,匯編語言的有如下的特點(diǎn):的特點(diǎn):1 1)匯編語言可以讓我們從根本上了解計(jì)算機(jī)的工作原理,清晰)匯編語言可以讓我們從根本上了解計(jì)算機(jī)

2、的工作原理,清晰的跟蹤計(jì)算機(jī)的工作過程。的跟蹤計(jì)算機(jī)的工作過程。2 2)計(jì)算機(jī)系統(tǒng)中,某些功能程序仍然用匯編語言來實(shí)現(xiàn),比如)計(jì)算機(jī)系統(tǒng)中,某些功能程序仍然用匯編語言來實(shí)現(xiàn),比如機(jī)器自檢、輸入輸出驅(qū)動程序。機(jī)器自檢、輸入輸出驅(qū)動程序。3 3)匯編語言書寫的程序目標(biāo)代碼占用的內(nèi)存空間少、執(zhí)行速度)匯編語言書寫的程序目標(biāo)代碼占用的內(nèi)存空間少、執(zhí)行速度快、效率高、實(shí)時性強(qiáng)。快、效率高、實(shí)時性強(qiáng)。4 4)匯編語言可以直接調(diào)用系統(tǒng)中斷,方便用戶使用資源。)匯編語言可以直接調(diào)用系統(tǒng)中斷,方便用戶使用資源。4.1 匯編語言設(shè)計(jì)概述匯編語言設(shè)計(jì)概述v匯編語言的編譯過程匯編語言的編譯過程1)用文本編輯器編寫符合

3、匯編格式的程序,并將文件的擴(kuò)展)用文本編輯器編寫符合匯編格式的程序,并將文件的擴(kuò)展名命名為名命名為.ASM.ASM,該文件稱為匯編源程序。,該文件稱為匯編源程序。2 2)利用匯編程序)利用匯編程序(MASM.EXE)(MASM.EXE)將匯編源程序翻譯成計(jì)算機(jī)可以將匯編源程序翻譯成計(jì)算機(jī)可以識別和運(yùn)行的擴(kuò)展名為識別和運(yùn)行的擴(kuò)展名為.OBJ.OBJ二進(jìn)制目標(biāo)程序。二進(jìn)制目標(biāo)程序。3 3)利用鏈接程序)利用鏈接程序(LINK.EXE)(LINK.EXE)將目標(biāo)文件進(jìn)行地址重定位、目將目標(biāo)文件進(jìn)行地址重定位、目標(biāo)程序組合等過程,產(chǎn)生用戶可以執(zhí)行的擴(kuò)展名為標(biāo)程序組合等過程,產(chǎn)生用戶可以執(zhí)行的擴(kuò)展名為.

4、EXE.EXE的可運(yùn)的可運(yùn)行程序。行程序。匯編源文件匯編源文件.ASM.ASM目標(biāo)程序目標(biāo)程序.OBJ.OBJ可執(zhí)行程序可執(zhí)行程序.EXE.EXE匯編匯編鏈接鏈接MASM.EXEMASM.EXELINK.EXELINK.EXEv匯編語言語句類型匯編語言語句類型指令性語句指令性語句 一條指令性語句就是一條一條指令性語句就是一條80868086的指令,例如的指令,例如 ADD AL,BLADD AL,BL和和MOV CX,1000MOV CX,1000;每一條指令性語句都會在匯編過程中產(chǎn)生相應(yīng);每一條指令性語句都會在匯編過程中產(chǎn)生相應(yīng)的目標(biāo)代碼。的目標(biāo)代碼。指示性語句指示性語句 指示性語句又稱為指

5、示性語句又稱為偽指令,偽指令,例如例如 SEGMENTSEGMENT和和ABC DB 50HABC DB 50H。偽指令用來為匯編程序提供某些信息,讓匯編程序在匯編的過偽指令用來為匯編程序提供某些信息,讓匯編程序在匯編的過程中執(zhí)行特定功能的信息,比如規(guī)定一個數(shù)據(jù)段從哪里開始到程中執(zhí)行特定功能的信息,比如規(guī)定一個數(shù)據(jù)段從哪里開始到哪里結(jié)束等。每一條偽指令在匯編的過程中都不會產(chǎn)生相應(yīng)的哪里結(jié)束等。每一條偽指令在匯編的過程中都不會產(chǎn)生相應(yīng)的目標(biāo)代碼。目標(biāo)代碼。指令性語句的格式如下:指令性語句的格式如下: : 指令助記符指令助記符 目標(biāo)操作數(shù)目標(biāo)操作數(shù) STARTSTART: MOV AX,1090H

6、 : MOV AX,1090H ;將;將1616進(jìn)制數(shù)進(jìn)制數(shù)1090H1090H送入送入AXAX INC BXINC BX指示性語句的格式如下:指示性語句的格式如下: 偽指令助記符偽指令助記符 CR CR DB ODHDB ODH ;在字節(jié)單元;在字節(jié)單元CRCR處存放數(shù)據(jù)處存放數(shù)據(jù)0DH0DH ORG 200H ORG 200H ;目標(biāo)程序的偏移量;目標(biāo)程序的偏移量 DATADATA SEGMENT SEGMENT ;數(shù)據(jù)段開始;數(shù)據(jù)段開始 指令性語句和指示性語句的最大區(qū)別就是指示性指令性語句和指示性語句的最大區(qū)別就是指示性語句在語句在標(biāo)識符和偽指令助記符沒有冒號標(biāo)識符和偽指令助記符沒有冒號

7、v匯編語句語句格式匯編語句語句格式v段定義偽指令段定義偽指令SEGMENTSEGMENT、ENDSENDS、ASSUMEASSUME 偽指令偽指令SEGMENTSEGMENT和和ENDSENDS總是成對出現(xiàn)??偸浅蓪Τ霈F(xiàn)。SEGMENTSEGMENT用來定義用來定義段開始,段開始,ENDSENDS是來定義段結(jié)束。這一段偽指令可以將源程序是來定義段結(jié)束。這一段偽指令可以將源程序分為幾個段,通常為數(shù)據(jù)段,堆棧段和代碼段。分為幾個段,通常為數(shù)據(jù)段,堆棧段和代碼段。 格式為:格式為: 段名段名 SEGMENTSEGMENT 段內(nèi)容段內(nèi)容 段名段名 ENDSENDS 偽指令偽指令A(yù)SSUMEASSUME

8、告訴匯編程序,哪一個段是數(shù)據(jù)段,哪一告訴匯編程序,哪一個段是數(shù)據(jù)段,哪一個段是堆棧段,哪一個段是代碼段。個段是堆棧段,哪一個段是代碼段。 格式為:格式為: ASSUMEASSUME 段寄存器:段名段寄存器:段名 v源程序結(jié)束偽指令源程序結(jié)束偽指令 ENDEND4.2 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu)一個標(biāo)準(zhǔn)匯編語言源程序結(jié)構(gòu)如下:一個標(biāo)準(zhǔn)匯編語言源程序結(jié)構(gòu)如下: 數(shù)據(jù)段名數(shù)據(jù)段名 SEGMENTSEGMENT 數(shù)據(jù)段內(nèi)容數(shù)據(jù)段內(nèi)容 數(shù)據(jù)段名數(shù)據(jù)段名 ENDSENDS 堆棧段名堆棧段名 SEGMENTSEGMENT 堆棧段內(nèi)容堆棧段內(nèi)容 堆棧段名堆棧段名 ENDSENDS 代碼段名代碼段名 SE

9、GMENTSEGMENT ASSUME CS: ASSUME CS:代碼段名代碼段名, DS:, DS:數(shù)據(jù)段名數(shù)據(jù)段名, SS:, SS:堆棧段名堆棧段名 代碼段內(nèi)容代碼段內(nèi)容 代碼段名代碼段名 ENDSENDS END END注意:各個段的名稱可以任意起,一般注意:各個段的名稱可以任意起,一般把數(shù)據(jù)段的段名記做把數(shù)據(jù)段的段名記做DATADATA,堆棧段的段,堆棧段的段名記做名記做STACKSTACK,代碼段的段名記做,代碼段的段名記做CODECODE。規(guī)范程序示例:規(guī)范程序示例:CODECODE SEGMENT SEGMENT ;定義段;定義段 ASSUME CS:CODEASSUME C

10、S:CODE ;把上面定義段的段基址放入;把上面定義段的段基址放入 CSCS MOV CX,100H MOV CX,100H ;裝入循環(huán)次數(shù);裝入循環(huán)次數(shù) MOV DL,0 MOV DL,0 ;裝入第一個;裝入第一個ASCIIASCII碼碼 NEXT: MOV AH,02NEXT: MOV AH,02 INT 21HINT 21H INC DL INC DL ;每次將數(shù)據(jù)寄存器;每次將數(shù)據(jù)寄存器DLDL內(nèi)的數(shù)值加內(nèi)的數(shù)值加1 1 LOOP NEXT LOOP NEXT ;執(zhí)行一次,;執(zhí)行一次,CXCX減減1 1,直到,直到CXCX為為0.0. MOV AH,4CH MOV AH,4CH ;終止

11、當(dāng)前程序并返回調(diào)用程序;終止當(dāng)前程序并返回調(diào)用程序 INT 21H INT 21H ;返回;返回DOSDOSCODECODE ENDS ENDS ;段結(jié)束;段結(jié)束END END ;匯編程序結(jié)束;匯編程序結(jié)束編譯工具編譯工具M(jìn)ASMMASM的使用的使用 MASM MASM是專門為匯編語言設(shè)計(jì)的一種集編譯、鏈接是專門為匯編語言設(shè)計(jì)的一種集編譯、鏈接為一體的工具,它是利用文本編輯器(為一體的工具,它是利用文本編輯器(EDITEDIT等)將匯等)將匯編指令編指令按照規(guī)范格式按照規(guī)范格式建成一個獨(dú)立且建成一個獨(dú)立且擴(kuò)展名為擴(kuò)展名為.ASM.ASM的的匯編程序,稱源程序。匯編程序,稱源程序。編譯程序編譯程

12、序MASMMASM將輸入的將輸入的ASMASM文文件,編譯成件,編譯成.OBJ.OBJ文件,稱為目標(biāo)程序。文件,稱為目標(biāo)程序。OBJOBJ文件僅包文件僅包含有關(guān)程序各部分要載入何處及如何與其他程序合并含有關(guān)程序各部分要載入何處及如何與其他程序合并的信息,無法直接載入內(nèi)存執(zhí)行。的信息,無法直接載入內(nèi)存執(zhí)行。鏈接程序鏈接程序LINKLINK則可則可將將OBJOBJ文件轉(zhuǎn)換成可載入內(nèi)存執(zhí)行的文件轉(zhuǎn)換成可載入內(nèi)存執(zhí)行的EXEEXE文件。文件。 利用利用MASMMASM編譯、鏈接匯編程序的步驟如下:編譯、鏈接匯編程序的步驟如下:(1) (1) 用用EDITEDIT編輯一個擴(kuò)張名為編輯一個擴(kuò)張名為ASMA

13、SM的源程序文件。例如:的源程序文件。例如:smile.asmsmile.asm(2) DOS(2) DOS窗口的命令提示符下輸入:窗口的命令提示符下輸入:MASM SMILE MASM SMILE 不用打入附加名不用打入附加名.ASM.ASM。 50162 + 403867 Bytes symbol space free50162 + 403867 Bytes symbol space free 0 Warning Errors 0 Warning Errors 警告錯誤,表示編譯器對某些語句不理解,通常警告錯誤,表示編譯器對某些語句不理解,通常 是輸入錯誤。是輸入錯誤。 0 Severe

14、Errors 0 Severe Errors 嚴(yán)重錯誤,會造成程序無法執(zhí)行,通常是語法結(jié)嚴(yán)重錯誤,會造成程序無法執(zhí)行,通常是語法結(jié) 構(gòu)錯誤。構(gòu)錯誤。 如果沒有一個錯誤存在,即可生成如果沒有一個錯誤存在,即可生成OBJOBJ文件。文件。(3) DOS(3) DOS窗口的命令提示符下輸入窗口的命令提示符下輸入: LINK SMILE: LINK SMILE 不用附加名不用附加名OBJOBJ LINK : warning L4021: no stack segment LINK : warning L4021: no stack segment 由于由于COMCOM文件不使用堆棧文件不使用堆棧 段,

15、所以錯誤信息并不段,所以錯誤信息并不 “ “no stack segment” no stack segment” 影響程序正常執(zhí)行。影響程序正常執(zhí)行。vDEBUGDEBUG和和MASMMASM的區(qū)別的區(qū)別 DEBUGDEBUG是調(diào)試器,它的主要用途在于除錯,能夠是調(diào)試器,它的主要用途在于除錯,能夠觀察每條匯編語句運(yùn)行后的結(jié)果,方便的修正匯編觀察每條匯編語句運(yùn)行后的結(jié)果,方便的修正匯編程序中的錯誤。程序中的錯誤。DEBUGDEBUG中必須使用中必須使用1616進(jìn)制的數(shù)。進(jìn)制的數(shù)。 MASMMASM是一種編譯器,它能將匯編源程序進(jìn)行編是一種編譯器,它能將匯編源程序進(jìn)行編譯、鏈接形成可執(zhí)行文件,但

16、匯編程序必須譯、鏈接形成可執(zhí)行文件,但匯編程序必須使用規(guī)使用規(guī)范書寫方式范書寫方式,源程序中除了指令性語句,還必須加源程序中除了指令性語句,還必須加入許多與指令語句無關(guān)的指示性語句,以供編譯器入許多與指令語句無關(guān)的指示性語句,以供編譯器識別。識別。 MASMMASM中的數(shù)據(jù)默認(rèn)為中的數(shù)據(jù)默認(rèn)為1010進(jìn)制。進(jìn)制。 除了除了MASMMASM外,還有外,還有TASMTASM等工具軟件也能對規(guī)范等工具軟件也能對規(guī)范格式的匯編語言進(jìn)行編譯格式的匯編語言進(jìn)行編譯 v段定義偽指令段定義偽指令SEGMENTSEGMENT、ENDSENDS、ASSUMEASSUME和和ORGORG(1) (1) 偽指令偽指令

17、SEGMENTSEGMENT和和ENDSENDS總是成對出現(xiàn)??偸浅蓪Τ霈F(xiàn)。SEGMENTSEGMENT用來定義用來定義段開始,段開始,ENDSENDS是來定義段結(jié)束,段名是合法的標(biāo)識符。偽指是來定義段結(jié)束,段名是合法的標(biāo)識符。偽指令令SEGMENTSEGMENT的參數(shù)有定位類型,組合類型和類別。的參數(shù)有定位類型,組合類型和類別。 格式為:格式為: 段名段名 SEGMENT SEGMENT 定位類型定位類型 組合類型組合類型 類別類別 段名段名 ENDSENDS定位類型:定位類型:指定邏輯段在主存儲器中的邊界指定邏輯段在主存儲器中的邊界 BYTEBYTE 段基址為為任何地址,段間無空隙(段基址

18、為為任何地址,段間無空隙(xxxx xxxxBxxxx xxxxB) WORDWORD 段基址為下一個可用的偶數(shù)地址(段基址為下一個可用的偶數(shù)地址(xxxx xxx0Bxxxx xxx0B) PARAPARA 段基址為下一個可用的節(jié)地址(段基址為下一個可用的節(jié)地址(xxxx 0000Bxxxx 0000B) PAGEPAGE 段基址為下一個可用的頁地址(段基址為下一個可用的頁地址(0000 0000B0000 0000B) 默認(rèn)的定位類型是默認(rèn)的定位類型是PARAPARA組合類型:組合類型:指定多個邏輯段之間的關(guān)系指定多個邏輯段之間的關(guān)系 NONE NONE 本段與其他段沒有邏輯關(guān)系,不與其他

19、段合并,每本段與其他段沒有邏輯關(guān)系,不與其他段合并,每段都有自己的段地址。段都有自己的段地址。 PUBLICPUBLIC 連接程序把本段與所有同名同類型的其他段相鄰地連接程序把本段與所有同名同類型的其他段相鄰地連接在一起,然后為所有這些段指定一個共同的段地址,也就連接在一起,然后為所有這些段指定一個共同的段地址,也就是合成一個物理段。是合成一個物理段。 STACK STACK 僅用于堆棧段,連接程序?qū)⑺袃H用于堆棧段,連接程序?qū)⑺蠸TACKSTACK段進(jìn)行合并連段進(jìn)行合并連接成一個物理段,系統(tǒng)初始化接成一個物理段,系統(tǒng)初始化SSSS和和SPSP。 COMMON COMMON 連接程序把本段與

20、所有同名同類型的其他段指定連接程序把本段與所有同名同類型的其他段指定相同的段基址,即共享存儲空間。相同的段基址,即共享存儲空間。 MEMORY MEMORY 連接程序把本段定位在所有同名同類型的其他段連接程序把本段定位在所有同名同類型的其他段后面,即最高的地址空間。后面,即最高的地址空間。 默認(rèn)的組合類型是默認(rèn)的組合類型是NONENONE(2) (2) 偽指令偽指令A(yù)SSUMEASSUME告訴匯編程序,哪一個段是數(shù)據(jù)段,哪一個告訴匯編程序,哪一個段是數(shù)據(jù)段,哪一個段是堆棧段,哪一個段是代碼段。段是堆棧段,哪一個段是代碼段。 格式為:格式為: ASSUMEASSUME 段寄存器:段名段寄存器:段

21、名 除除CSCS的值可以自動裝入外,的值可以自動裝入外,其他各段的實(shí)際值還要用其他各段的實(shí)際值還要用MOVMOV指指令來賦值。令來賦值。 MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX ;將數(shù)據(jù)段;將數(shù)據(jù)段DATADATA的段基址送的段基址送DSDS MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX ;將堆棧段;將堆棧段STACKSTACK的段基址送的段基址送SSSS MOV SP,TOP MOV SP,TOP ;堆棧指針指向棧頂;堆棧指針指向棧頂類別:類別必須用單引號括起來,連接程序所有程序中類別類別:類別必須

22、用單引號括起來,連接程序所有程序中類別相同的段放在一個連續(xù)的存儲空間里組合成一個物理段。相同的段放在一個連續(xù)的存儲空間里組合成一個物理段。 STACK SEGMENT PARASTACK SEGMENT PARA STACK STACKSTACK STACK 段名段名 定位定位 組合類型組合類型 類別類別 DATA SEGMENTDATA SEGMENT 數(shù)據(jù)段內(nèi)容數(shù)據(jù)段內(nèi)容 DATA ENDS DATA ENDS STACK SEGMENT STACK SEGMENT 堆棧段內(nèi)容堆棧段內(nèi)容 STACK ENDSSTACK ENDS CODE CODE SEGMENTSEGMENT ASSUM

23、E CS:CODE, DS:DATA, SS:STACK ASSUME CS:CODE, DS:DATA, SS:STACK START:START:MOV AX,DATAMOV AX,DATA MOV DS,AX MOV DS,AX ;初始化;初始化DSDS MOV AX,STCAKMOV AX,STCAK MOV SS,AXMOV SS,AX ;初始化;初始化SSSS MOV SP,TOP MOV SP,TOP ;初始化;初始化SPSP MOV AH,4CHMOV AH,4CH INT 21H INT 21H ;程序正常結(jié)束;程序正常結(jié)束 CODE CODE ENDSENDS END ST

24、ART END STARTv過程定義偽指令過程定義偽指令PROCPROC、ENDPENDP 過程就是完成某個特定功能的子程序,應(yīng)用偽指令過程就是完成某個特定功能的子程序,應(yīng)用偽指令PROCPROC和和ENDPENDP定義過程的格式如下:定義過程的格式如下: 過程名過程名PROC NEAR|FARPROC NEAR|FAR過程名過程名ENDPENDP(1)(1)過程名:過程名:( (子程序名子程序名) )為符合語法的標(biāo)識符為符合語法的標(biāo)識符(2)(2)屬性:屬性:NEARNEAR屬性屬性( (段內(nèi)近調(diào)用段內(nèi)近調(diào)用) )的過程只能被相同代碼段的的過程只能被相同代碼段的其他程序調(diào)用、其他程序調(diào)用、F

25、ARFAR屬性屬性( (段間遠(yuǎn)調(diào)用段間遠(yuǎn)調(diào)用) )的過程可以被相同或不的過程可以被相同或不同代碼段的程序調(diào)用;同代碼段的程序調(diào)用;NEARNEAR屬性是默認(rèn)值。屬性是默認(rèn)值。(3)(3)調(diào)用過程:調(diào)用過程:CALL CALL 過程名過程名(4)(4)過程返回:過程返回:RETRETv程序結(jié)束偽指令程序結(jié)束偽指令ENDEND 格式是:格式是: END END 標(biāo)識符標(biāo)識符 標(biāo)識符是可選項(xiàng),它是程序起始地址的標(biāo)識符。標(biāo)識符是可選項(xiàng),它是程序起始地址的標(biāo)識符。 CODE SEGMENT CODE SEGMENT ;定義段;定義段 ASSUME CS:CODE ASSUME CS:CODE ;把;把C

26、ODECODE段的段基址放入段的段基址放入CSCS START:MOV DL,1 START:MOV DL,1 MOV AH,02 MOV AH,02 INT 21H INT 21H MOV AH,4CH MOV AH,4CH ;終止當(dāng)前程序并返回調(diào)用程序;終止當(dāng)前程序并返回調(diào)用程序 INT 21H INT 21H ;返回;返回DOSDOS CODE ENDS CODE ENDS ;段結(jié)束;段結(jié)束 END STARTEND STARTDATA SEGMENT DATA SEGMENT ;數(shù)據(jù)段開始;數(shù)據(jù)段開始 ARRAY DB 3,12,45,21,97,56,8 ARRAY DB 3,12,

27、45,21,97,56,8 ;存放;存放7 7各數(shù)字各數(shù)字 MAXNUM DB ? MAXNUM DB ? ;MAXNUMMAXNUM單元存放最大數(shù)單元存放最大數(shù)DATA ENDS DATA ENDS ;數(shù)據(jù)段結(jié)束;數(shù)據(jù)段結(jié)束CODE SEGMENT CODE SEGMENT ;代碼段開始;代碼段開始 ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATASTART:MOV AX,DATASTART:MOV AX,DATA MOV DS,AX MOV DS,AX ;數(shù)據(jù)段寄存器賦值;數(shù)據(jù)段寄存器賦值 MOV BX,OFFSET ARRAY MOV BX,OF

28、FSET ARRAY ;取數(shù)組的偏移量送;取數(shù)組的偏移量送BXBX MOV CX,6 MOV CX,6 ;比較的次數(shù)送;比較的次數(shù)送CXCX MOV AL,BX MOV AL,BX ;取第一個數(shù);取第一個數(shù)LABLE:INC BX LABLE:INC BX ;偏移量加;偏移量加1 1,指向下一個數(shù),指向下一個數(shù) CMP AL,BX CMP AL,BX ;比較;比較ALAL和第和第N+1N+1個數(shù)個數(shù) JNB NEXT JNB NEXT ;不低于則轉(zhuǎn)入;不低于則轉(zhuǎn)入NEXTNEXT MOV AL,BX MOV AL,BX ;否則將大數(shù)送;否則將大數(shù)送ALAL NEXT:LOOP LABLE NE

29、XT:LOOP LABLE ;繼續(xù)下一次比較,直到;繼續(xù)下一次比較,直到CXCX為為0 0 MOV MAXNUM,AL MOV MAXNUM,AL ;最大數(shù)送;最大數(shù)送MAXNUMMAXNUM單元單元 MOV DL,ALMOV DL,AL MOV AH,02 MOV AH,02 INT 21H INT 21H ;顯示輸出最大數(shù);顯示輸出最大數(shù)9797 MOV AH,4CH MOV AH,4CH INT 21H INT 21H ;程序正常結(jié)束;程序正常結(jié)束CODE ENDS CODE ENDS ;代碼段結(jié)束;代碼段結(jié)束END START END START ;匯編程序結(jié)束;匯編程序結(jié)束v常量常量

30、 常量就是指令中出現(xiàn)的固定值,比如常量就是指令中出現(xiàn)的固定值,比如 MOV AX,MOV AX,9090 。 1 1)數(shù)字常量)數(shù)字常量 如果一個常數(shù)后面加字母如果一個常數(shù)后面加字母B B來表示二進(jìn)制數(shù)。來表示二進(jìn)制數(shù)。 如果一個常數(shù)后面加字母如果一個常數(shù)后面加字母D D(可不加)表示十進(jìn)制數(shù)??刹患樱┍硎臼M(jìn)制數(shù)。 如果一個常數(shù)后面加字母如果一個常數(shù)后面加字母H H來表示十六進(jìn)制數(shù),一個來表示十六進(jìn)制數(shù),一個1616進(jìn)制進(jìn)制數(shù)以字母數(shù)以字母A AF F開頭,前面必須加一個開頭,前面必須加一個0 0,如,如0A59H0A59H2 2)字符常量)字符常量 單引號引出的字符表示字符常量,如單引號引

31、出的字符表示字符常量,如cc表示字符表示字符c c。 單引號引出的多個字符序列稱為字符串常量,如單引號引出的多個字符序列稱為字符串常量,如ABCABC注意:一個用引號引出的字符串也代表常數(shù),如帶引號的字符注意:一個用引號引出的字符串也代表常數(shù),如帶引號的字符串串ABCABC,等效于它們對應(yīng)的,等效于它們對應(yīng)的ASCIIASCII的常數(shù)的常數(shù)6464、6565、6666。4.3 匯編語言的語法匯編語言的語法v變量變量 變量是存放數(shù)據(jù)的存儲器單元的符號地址,在程序運(yùn)行過變量是存放數(shù)據(jù)的存儲器單元的符號地址,在程序運(yùn)行過程中其值可以變化。程中其值可以變化。 偽指令偽指令DBDB,DWDW,DDDD用

32、來定義變量用來定義變量 變量的屬性變量的屬性1 1)段基址)段基址(SEG)(SEG):變量所在段的起始地址:變量所在段的起始地址2 2)偏移量)偏移量(OFFSET)(OFFSET):變量所在地址與段基址的相對距離:變量所在地址與段基址的相對距離3 3)類型)類型(TYPE)(TYPE):變量指示的存儲區(qū)中每個數(shù)據(jù)所占的內(nèi)存單:變量指示的存儲區(qū)中每個數(shù)據(jù)所占的內(nèi)存單元的字節(jié)數(shù),可以是字節(jié)元的字節(jié)數(shù),可以是字節(jié)(1(1字節(jié)字節(jié)) )、字、字(2(2字節(jié)字節(jié)) )、雙字、雙字(4(4字節(jié)字節(jié)) )注意:注意:1 1)變量定義后可以使用,在指令中必須與操作數(shù)類型一致)變量定義后可以使用,在指令中必

33、須與操作數(shù)類型一致2 2)變量的偏移地址僅僅對應(yīng)其所代表的數(shù)據(jù)區(qū)的首地址,如變量的偏移地址僅僅對應(yīng)其所代表的數(shù)據(jù)區(qū)的首地址,如果這個數(shù)據(jù)區(qū)有多個數(shù)據(jù)項(xiàng),對后面的數(shù)據(jù)項(xiàng)操作時必須改變果這個數(shù)據(jù)區(qū)有多個數(shù)據(jù)項(xiàng),對后面的數(shù)據(jù)項(xiàng)操作時必須改變地址值。地址值。0200H0200H0202H0202H0203H0203H0204H0204H0205H0205H0206H0206H0201H0201H定義變量偽指令定義變量偽指令DBDB、DWDW、DDDD 該組偽指令用來給出程序中所用到的數(shù)據(jù)、字符串以及存該組偽指令用來給出程序中所用到的數(shù)據(jù)、字符串以及存儲單元。儲單元。DBDB用來定義字節(jié)、用來定義字節(jié)、

34、DWDW用來定義字、用來定義字、DDDD用來定義雙字。用來定義雙字。 變量定義的格式為:變量定義的格式為: 變量變量 偽指令偽指令 參數(shù)參數(shù)11、參數(shù)、參數(shù)2 2 例如:例如: CR DB 10HCR DB 10H LF DB 0BH LF DB 0BH,64H64H RP DW FBFFHRP DW FBFFH,3CH 3CH 10CRLF0B643CFBFF00RP用標(biāo)識符代表地址,相用標(biāo)識符代表地址,相當(dāng)于高級語言中的變量當(dāng)于高級語言中的變量1)1)操作數(shù)操作數(shù)? ?用來保留存儲空間用來保留存儲空間, ,但不存入數(shù)據(jù)。但不存入數(shù)據(jù)。 ABCABC DBDB 0BH0BH,06H06H,?

35、 ?,? ?,? ? LPI LPI DWDW ? ?,54H54H,? ? 0B065400 ABCABCLPILPI2)2)操作數(shù)還可以用操作數(shù)還可以用復(fù)制操作符復(fù)制操作符DUPDUP來縮寫來縮寫 BUFFER DB 9 DUP (?)BUFFER DB 9 DUP (?) 3)3)操作數(shù)可以是字符串操作數(shù)可以是字符串STRING DB HELLOSTRING DB HELLO48504C4C4FHELLOSTRINGSTRINGv匯編的表達(dá)式和運(yùn)算符匯編的表達(dá)式和運(yùn)算符 表達(dá)式表達(dá)式是是常數(shù)常數(shù)、寄存器、標(biāo)識符寄存器、標(biāo)識符與一些與一些運(yùn)算符運(yùn)算符組組合的序列,分合的序列,分?jǐn)?shù)字表達(dá)式數(shù)

36、字表達(dá)式和和地址表達(dá)式地址表達(dá)式兩種。匯編時兩種。匯編時按一定的優(yōu)先規(guī)則對表達(dá)式進(jìn)行計(jì)算后可得到一個數(shù)按一定的優(yōu)先規(guī)則對表達(dá)式進(jìn)行計(jì)算后可得到一個數(shù)值或一個地址。值或一個地址。 算術(shù)運(yùn)算符算術(shù)運(yùn)算符 邏輯運(yùn)算符邏輯運(yùn)算符 關(guān)系運(yùn)算符關(guān)系運(yùn)算符 分析運(yùn)算符分析運(yùn)算符 綜合運(yùn)算符綜合運(yùn)算符算術(shù)運(yùn)算符算術(shù)運(yùn)算符 有有+ +、- -、* *、/ /、MODMOD。 算術(shù)運(yùn)算符可以用于算術(shù)運(yùn)算符可以用于數(shù)字表達(dá)式數(shù)字表達(dá)式, ,例如:例如: MOV AL,2MOV AL,2* *7 7 匯編后為匯編后為 MOV AL,0E MOV AL,0E 算術(shù)運(yùn)算符也可以用于算術(shù)運(yùn)算符也可以用于地址表達(dá)式地址表達(dá)式

37、, ,對地址運(yùn)算對地址運(yùn)算的結(jié)果應(yīng)有明確的的結(jié)果應(yīng)有明確的物理意義物理意義, ,例兩個地址的乘或除無例兩個地址的乘或除無意義意義, ,而加或減則可以而加或減則可以, ,例如例如: BUF DW 1,2,3,4,5,6,7,8: BUF DW 1,2,3,4,5,6,7,8 MAX DW ?MAX DW ? MOV CX,(BUF-MAX)/2 MOV CX,(BUF-MAX)/2 匯編后為匯編后為 MOV CX,8 MOV CX,8邏輯運(yùn)算符邏輯運(yùn)算符 邏輯運(yùn)算符有邏輯運(yùn)算符有ANDAND、OROR、XORXOR和和NOTNOT,它們只能用它們只能用于數(shù)字表達(dá)式中于數(shù)字表達(dá)式中。例如:例如:M

38、OV CLMOV CL,36H AND 0FH36H AND 0FH 經(jīng)匯編后經(jīng)匯編后:MOV CLMOV CL,06H06H 這些邏輯運(yùn)算符也是這些邏輯運(yùn)算符也是8086/8088的指令助記符,的指令助記符,會不會造成混亂呢會不會造成混亂呢? 不會的,前者在不會的,前者在匯編時匯編時進(jìn)行,而進(jìn)行,而后者在后者在指令執(zhí)行時指令執(zhí)行時進(jìn)行的。進(jìn)行的。例如:例如: ANDAND DXDX,36H 36H ANDAND 0FH0FH 后一個邏輯運(yùn)算符后一個邏輯運(yùn)算符AND在匯編時進(jìn)行在匯編時進(jìn)行, 匯編后得到表達(dá)匯編后得到表達(dá)式的值為式的值為06H,運(yùn)行時執(zhí)行前一個指令助記符,運(yùn)行時執(zhí)行前一個指令助

39、記符AND,將將(DX)與與06H相與相與,結(jié)果在結(jié)果在DX中。中。關(guān)系運(yùn)算符關(guān)系運(yùn)算符 共有共有6 6個個, ,它們?yōu)椋核鼈優(yōu)椋?EQ(EQ(相等相等) ),NE(NE(不等不等) ),LT(LT(小于小于) ),GT(GT(大于大于),), LE(LE(小于或等于小于或等于) ),GE(GE(大于或等于大于或等于) ) 關(guān)系運(yùn)算符關(guān)系運(yùn)算符的兩個操作數(shù)必須都是的兩個操作數(shù)必須都是數(shù)字?jǐn)?shù)字或者是同一段內(nèi)的或者是同一段內(nèi)的兩個存儲器地址兩個存儲器地址。 關(guān)系為關(guān)系為真真, ,結(jié)果為結(jié)果為0 0FFFFHFFFFH;關(guān)系為;關(guān)系為假假, ,結(jié)果為結(jié)果為0 0例如:例如: MOV BXMOV BX

40、,PORT GE 5PORT GE 5 若若PORTPORT的值大于等于的值大于等于5,5,則匯編后為:則匯編后為: MOVMOVBX,0FFFFHBX,0FFFFH 若若PORTPORT的值小于的值小于5, 5, 則匯編后為:則匯編后為: MOVMOVBX,0BX,0分析運(yùn)算符分析運(yùn)算符 分析運(yùn)算符的分析運(yùn)算符的OFFSET,SEGOFFSET,SEG可以把一個存儲單元的可以把一個存儲單元的地址分解為段基址和偏移量。地址分解為段基址和偏移量。1)1)運(yùn)算符運(yùn)算符OFFSETOFFSET用來取地址的偏移量;用來取地址的偏移量;2)2)運(yùn)算符運(yùn)算符SEGSEG取存儲單元的段地址。取存儲單元的段地

41、址。例如在規(guī)范程序中有定義:例如在規(guī)范程序中有定義:ABC DB 11HABC DB 11HABCABC11DSDS:1EFFH1EFFH0150H0150H則執(zhí)行則執(zhí)行: MOV DX: MOV DX,OFFSET ABCOFFSET ABC此語句將此語句將ABCABC處的偏移量處的偏移量0150H0150H送送DXDX則執(zhí)行則執(zhí)行: MOV DX: MOV DX,SEG ABCSEG ABC此語句將此語句將ABCABC處的段地址處的段地址1EFFH1EFFH送送DXDX3)3)分析運(yùn)算符的分析運(yùn)算符的TYPETYPE,SIZESIZE及及LENGTHLENGTH可以把存儲器一可以把存儲器一

42、些特征作為數(shù)值送回。些特征作為數(shù)值送回。 TYPETYPE運(yùn)算符用來取存儲器的單元運(yùn)算符用來取存儲器的單元類型類型,各單元類型對應(yīng)值,各單元類型對應(yīng)值如下:如下: 存儲器單元類型存儲器單元類型 對應(yīng)值對應(yīng)值 DBDB( (字節(jié)字節(jié)) ) 1 1 DWDW( (字字) ) 2 2 DDDD( (雙字雙字) ) 4 4 LENGTH LENGTH運(yùn)算符用來計(jì)算一個存儲區(qū)的單元的數(shù)目。運(yùn)算符用來計(jì)算一個存儲區(qū)的單元的數(shù)目。 SIZESIZE運(yùn)算符用來計(jì)算一個存儲區(qū)的字節(jié)總數(shù)。運(yùn)算符用來計(jì)算一個存儲區(qū)的字節(jié)總數(shù)。 若若BUFFERBUFFER存儲區(qū)是用如下偽指令定義的:存儲區(qū)是用如下偽指令定義的: B

43、UFFER BUFFER DWDW 100 DUP (?) 100 DUP (?) 則則TYPE BUFFERTYPE BUFFER等于等于2 2, LENGTH BUFFERLENGTH BUFFER等于等于100100,SIZE BUFFERSIZE BUFFER等于等于200200合成運(yùn)算符合成運(yùn)算符PTRPTR 用來對存儲單元規(guī)定類型用來對存儲單元規(guī)定類型, ,通常和通常和BYTE, WORDBYTE, WORD和和DWORDDWORD等連起來使用。等連起來使用??紤]下面的語句:考慮下面的語句:MOV 1000MOV 1000,0 0 ;類型不定類型不定MOV BYTE PTR1000

44、MOV BYTE PTR1000,0 0 ;1000字節(jié)單元清零字節(jié)單元清零MOV WORD PTR1000MOV WORD PTR1000,0 0 ;1000開始的字單元清零開始的字單元清零10001000字節(jié)單元清零?字節(jié)單元清零?10001000開始的字單元清零?開始的字單元清零?INC WORD PTRSI INC WORD PTRSI ;SI所指內(nèi)存所指內(nèi)存1個字自增個字自增1JMP DWORD PTR SIJMP DWORD PTR SI ;段地址;段地址CSCS在在SISI、SI+1SI+1中中 ;偏移量;偏移量IPIP在在SI+2SI+2、SI+3SI+3中中標(biāo)號賦值偽指令標(biāo)號

45、賦值偽指令EQUEQU 為了便于閱讀和修改,匯編程序常常使用標(biāo)識符代表數(shù)據(jù)為了便于閱讀和修改,匯編程序常常使用標(biāo)識符代表數(shù)據(jù)或者寄存器,必須在源程序前用或者寄存器,必須在源程序前用EQUEQU偽指令對標(biāo)識符賦值。偽指令對標(biāo)識符賦值。 格式為:格式為: 標(biāo)識符標(biāo)識符 EQU EQU 操作數(shù)操作數(shù)例如:例如: CONSTANT EQUCONSTANT EQU 100 100 COUNT EQU CXCOUNT EQU CX 在一個程序中不能用在一個程序中不能用EQUEQU對一個標(biāo)識符多次重復(fù)定義。對一個標(biāo)識符多次重復(fù)定義。標(biāo)號解除偽指令標(biāo)號解除偽指令PURGEPURGE 此偽指令用來解除用此偽指令

46、用來解除用EQUEQU對某一個標(biāo)識符的賦值對某一個標(biāo)識符的賦值例如:例如: PURGE CONSTANTPURGE CONSTANT等號偽指令等號偽指令 = = 與與EQUEQU功能一樣,但那是可以多次重復(fù)定義同一標(biāo)識符功能一樣,但那是可以多次重復(fù)定義同一標(biāo)識符v匯編的常用的偽指令匯編的常用的偽指令定位偽指令定位偽指令ORGORG 指定數(shù)據(jù)段或者代碼段的偏移地址。指定數(shù)據(jù)段或者代碼段的偏移地址。 DATA SEGMENTDATA SEGMENT ORG 0200H ORG 0200H BUF DB 10 DUP (?) BUF DB 10 DUP (?) ;變量;變量BUFBUF的在數(shù)據(jù)段的偏

47、移地址的在數(shù)據(jù)段的偏移地址 DATA ENDS DATA ENDS ;是;是0200H0200H,省略為,省略為0000H0000H CODE SEGMENT CODE SEGMENT ASSUME CS:DCODE,DS,DATA ASSUME CS:DCODE,DS,DATA ORG 1000H ORG 1000H ;首條指令在代碼段的偏移地址;首條指令在代碼段的偏移地址 MOV AX,DATA MOV AX,DATA ;是;是1000H1000H,省略為,省略為0100H0100H MOV DS,AX MOV DS,AX CODE ENDS CODE ENDSEND END 地址計(jì)數(shù)器地

48、址計(jì)數(shù)器 $ 匯編語言中,每一個段都有一個地址計(jì)數(shù)器匯編語言中,每一個段都有一個地址計(jì)數(shù)器$,指示當(dāng)前指,指示當(dāng)前指令或者數(shù)據(jù)的在段內(nèi)的偏移量。令或者數(shù)據(jù)的在段內(nèi)的偏移量。某數(shù)據(jù)段定義如下:某數(shù)據(jù)段定義如下:DATA SEGMENTDATA SEGMENT ORG 1000H ORG 1000H BUF DW 1,2,$+3,$-2,1234H BUF DW 1,2,$+3,$-2,1234H COUNT EQU ($-BUF)/2 COUNT EQU ($-BUF)/2 NUM DW 5ABBH,$-BUF NUM DW 5ABBH,$-BUFDATA ENDSDATA ENDS匯編后內(nèi)存的

49、分配如右所示:匯編后內(nèi)存的分配如右所示: 1000H1000H1001H1001H1002H1002H1003H1003H1004H1004H1005H1005H1006H1006H1007H1007H1008H1008H1009H1009H100AH100AH100BH100BH01H01H00H00H02H02H00H00H07H07H10H10H04H04H10H10H34H34H12H12H5AH5AHBBHBBH概述概述:1)1) SEGMENTSEGMENT和和ENDSENDS前面的標(biāo)識符為各個段的名稱,可以任意起前面的標(biāo)識符為各個段的名稱,可以任意起名,一般把數(shù)據(jù)段的段名記做名,

50、一般把數(shù)據(jù)段的段名記做DATADATA,堆棧段的段名記做,堆棧段的段名記做STACKSTACK,代碼段的段名記做代碼段的段名記做CODECODE。2) ASSUME2) ASSUME告訴匯編程序,哪一個段是數(shù)據(jù)段,哪一個段是堆棧告訴匯編程序,哪一個段是數(shù)據(jù)段,哪一個段是堆棧段,哪一個段是代碼段。除段,哪一個段是代碼段。除CSCS的值可以自動裝入外,的值可以自動裝入外,其他各段其他各段的實(shí)際值還要用的實(shí)際值還要用MOVMOV指令來賦值。指令來賦值。3) 3) 指令性語句的標(biāo)識符后面要指令性語句的標(biāo)識符后面要有冒號有冒號,如標(biāo)識符,如標(biāo)識符NEXTNEXT;指示性;指示性語句的標(biāo)識符后面語句的標(biāo)識

51、符后面沒有冒號沒有冒號,如標(biāo)識符,如標(biāo)識符DATADATA、CODECODE。4) 4) 每一個匯編程序都要調(diào)用每一個匯編程序都要調(diào)用21H21H中斷的中斷的4C4C功能子程序讓程序正功能子程序讓程序正常結(jié)束,否則運(yùn)行出錯。常結(jié)束,否則運(yùn)行出錯。4.4 匯編程序設(shè)計(jì)概述匯編程序設(shè)計(jì)概述例例: :要求完成兩個要求完成兩個3232位的數(shù)據(jù)相加運(yùn)算位的數(shù)據(jù)相加運(yùn)算 DATA SEGMENTDATA SEGMENT X DD 10008423HX DD 10008423H Y DD 20007F00HY DD 20007F00H Z DD ? Z DD ? DATA ENDS DATA ENDS CO

52、DE SEGMENT CODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA START:MOV AX,DATA START:MOV AX,DATA MOV DS,AX MOV DS,AX ;初始化;初始化DSDSv順序程序設(shè)計(jì)順序程序設(shè)計(jì) 順序程序完全按指令書寫的前后順序執(zhí)行每一條指令,是順序程序完全按指令書寫的前后順序執(zhí)行每一條指令,是最基本、最常見的程序結(jié)構(gòu)最基本、最常見的程序結(jié)構(gòu) MOV SI MOV SI,OFFSET XOFFSET X MOV AX MOV AX,SI SI ;取第;取第1 1個數(shù)的低個數(shù)的低1616位

53、送位送AXAX MOV DI MOV DI,OFFSET YOFFSET Y ADD AX ADD AX,DI DI ;低;低1616位相加位相加 MOV BX, OFFSET ZMOV BX, OFFSET Z MOV BX MOV BX,AX AX ;送低;送低1616位和位和 MOV AX MOV AX,SI+2 SI+2 ;取第;取第1 1個數(shù)的高個數(shù)的高1616位送位送AXAX ADC AX ADC AX,DI+2 DI+2 ;高;高1616位連同進(jìn)位標(biāo)志相加位連同進(jìn)位標(biāo)志相加 MOV BX+2 MOV BX+2,AX AX ;送高;送高1616位和位和 MOV AH,4CHMOV

54、AH,4CH INT 21H INT 21H ;程序結(jié)束;程序結(jié)束 CODE ENDSCODE ENDS END START END START 例:例: 編寫程序,判別鍵盤上輸入的字符;若是編寫程序,判別鍵盤上輸入的字符;若是0 09 9字符,則字符,則顯示之;若為顯示之;若為a-za-z字符,均顯示字符,均顯示“c”c”;若是回車字符;若是回車字符(0DH)(0DH),則結(jié)束程序;若為其它字符則不顯示。則結(jié)束程序;若為其它字符則不顯示。v分支程序設(shè)計(jì)分支程序設(shè)計(jì)JCCJCC條件滿足?條件滿足?Y YN N單分支單分支語句體語句體JCCJCC條件滿足?條件滿足?Y YN N雙分支雙分支語句體

55、語句體1 1JMPJMP語句體語句體2 2條件條件1 1?Y Y語句體語句體1 1條件條件2 2?Y Y語句體語句體2 2多分支多分支條件條件N N?Y Y語句體語句體N N CODE SEGMENTCODE SEGMENT ASSUME CS:CODE ASSUME CS:CODE START: MOV AH,1 START: MOV AH,1 INT 21H INT 21H CMP AL,0DH CMP AL,0DH JZ DONE JZ DONE CMP AL,0 CMP AL,0 JB START JB START CMP AL,9 CMP AL,9 JA CHRDN JA CHRDN

56、 MOV DL,AL MOV DL,AL MOV AH,2 MOV AH,2 INT 21H INT 21H JMP START JMP START CHRDN: CMP AL,a CHRDN: CMP AL,a JB START JB START CMP AL,z CMP AL,z JA START JA START MOV DL,C MOV DL,C MOV AH,2 MOV AH,2 INT 21H INT 21H JMP START JMP START DONE: MOV AH,4CH DONE: MOV AH,4CH INT 21H INT 21H CODE ENDS CODE EN

57、DS END END回車則結(jié)束回車則結(jié)束在在09之間則輸出之間則輸出相應(yīng)的數(shù)字相應(yīng)的數(shù)字低于低于0高于高于9低于低于a高于高于z在在az之間則之間則輸出輸出Cv循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)LOOPLOOP條件滿足?條件滿足?CX0CX0CX=0CX=0計(jì)數(shù)循環(huán)計(jì)數(shù)循環(huán) CX CX賦初值賦初值循環(huán)體循環(huán)體JCCJCC條件滿足?條件滿足?是是否否條件循環(huán)條件循環(huán) 循環(huán)初始條件循環(huán)初始條件循環(huán)體循環(huán)體 循環(huán)結(jié)束的控制可以用循環(huán)次數(shù),還可以用特定條件等:循環(huán)結(jié)束的控制可以用循環(huán)次數(shù),還可以用特定條件等:1)1)計(jì)數(shù)控制循環(huán):計(jì)數(shù)控制循環(huán):LOOPLOOP、LOOPZLOOPZ、LOOPNZLOOPNZ2)

58、2)條件控制循環(huán):條件控制循環(huán):JCCJCC例:計(jì)算例:計(jì)算SUMSUMi ii i1 1100100COUNT EQU CXCOUNT EQU CXDATA SEGMENTDATA SEGMENT ;數(shù)據(jù)段開始;數(shù)據(jù)段開始 SUM DW ? SUM DW ?DATA ENDSDATA ENDS ;數(shù)據(jù)段結(jié)束;數(shù)據(jù)段結(jié)束CODE SEGMENTCODE SEGMENT ;代碼段開始;代碼段開始 ASSUME CS:CODE,DS:DATA ASSUME CS:CODE,DS:DATA ORG 200H ORG 200H ;代碼段偏移量為;代碼段偏移量為0200H0200H處存放代碼處存放代碼

59、MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX ;數(shù)據(jù)段寄存器賦值數(shù)據(jù)段寄存器賦值 XOR AX,AX XOR AX,AX ;累加器累加器AXAX清零清零 MOV MOV C COUNTOUNT,100 ,100 ;置循環(huán)次數(shù)置循環(huán)次數(shù),CX=100,CX=100NEXT: ADD AX,CX NEXT: ADD AX,CX ;求累加和求累加和 LOOP NEXT LOOP NEXT MOV SUM,AX MOV SUM,AX ;將累加和送指定單元將累加和送指定單元 MOV AH,4CH MOV AH,4CH INT 21H INT 21H ;4C4C號

60、功能調(diào)用號功能調(diào)用: :終止當(dāng)前程序并返回調(diào)用程序終止當(dāng)前程序并返回調(diào)用程序CODE ENDSCODE ENDS ;代碼段結(jié)束;代碼段結(jié)束END END ;匯編程序結(jié)束;匯編程序結(jié)束例:以例:以1010進(jìn)制向屏幕輸出進(jìn)制向屏幕輸出BXBX中的中的1616位無符號數(shù)位無符號數(shù)分析:將分析:將BXBX的數(shù)據(jù)除以的數(shù)據(jù)除以1010,余數(shù)保存,商繼續(xù)除以,余數(shù)保存,商繼續(xù)除以1010,余數(shù)保,余數(shù)保存,直到商為存,直到商為0 0,余數(shù)的倒序即為待顯示的數(shù)字;將待顯示的,余數(shù)的倒序即為待顯示的數(shù)字;將待顯示的數(shù)字加數(shù)字加30H30H變成對應(yīng)數(shù)字的變成對應(yīng)數(shù)字的ASCIIASCII碼,調(diào)用碼,調(diào)用21H2

溫馨提示

  • 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

提交評論