第4章微型計(jì)算機(jī)原理與應(yīng)用_第1頁
第4章微型計(jì)算機(jī)原理與應(yīng)用_第2頁
第4章微型計(jì)算機(jī)原理與應(yīng)用_第3頁
第4章微型計(jì)算機(jī)原理與應(yīng)用_第4頁
第4章微型計(jì)算機(jī)原理與應(yīng)用_第5頁
已閱讀5頁,還剩75頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、微型計(jì)算機(jī)原理及應(yīng)用微型計(jì)算機(jī)原理及應(yīng)用微型計(jì)算機(jī)原理及應(yīng)用微型計(jì)算機(jī)原理及應(yīng)用微型計(jì)算機(jī)原理及應(yīng)用微型計(jì)算機(jī)原理及應(yīng)用第四章匯編語言程序設(shè)計(jì)第四章匯編語言程序設(shè)計(jì)主要內(nèi)容主要內(nèi)容 匯編語言源程序的結(jié)構(gòu)匯編語言源程序的結(jié)構(gòu) 匯編語言語句格式匯編語言語句格式 偽指令偽指令 功能調(diào)用功能調(diào)用 匯編語言程序設(shè)計(jì)匯編語言程序設(shè)計(jì)4.1 4.1 匯編語言源程序匯編語言源程序了解:了解:計(jì)算機(jī)的三種語言計(jì)算機(jī)的三種語言源程序的結(jié)構(gòu)源程序的結(jié)構(gòu)匯編語言語句格式匯編語言語句格式1. 計(jì)算機(jī)設(shè)計(jì)語言計(jì)算機(jī)設(shè)計(jì)語言機(jī)器語言機(jī)器語言匯編語言匯編語言高級(jí)語言高級(jí)語言面向機(jī)器面向機(jī)器 的語言的語言機(jī)器語言機(jī)器語言匯編語

2、言匯編語言高級(jí)語言高級(jí)語言用二進(jìn)制數(shù)碼表示指令用二進(jìn)制數(shù)碼表示指令和數(shù)據(jù)的語言和數(shù)據(jù)的語言執(zhí)行速度快,占用內(nèi)存少不執(zhí)行速度快,占用內(nèi)存少不直觀,不易理解和記憶直觀,不易理解和記憶用匯編語言編寫用匯編語言編寫的程序的程序4.1 4.1 匯編語言源程序匯編語言源程序2. 2. 匯編程序匯編程序匯編語言源程序匯編語言源程序用助記符編寫用助記符編寫源程序的編譯程序源程序的編譯程序匯編程序匯編程序(assemble)匯編語言源匯編語言源程序程序機(jī)器語言目機(jī)器語言目標(biāo)程序標(biāo)程序ASMMASM匯編語言程序設(shè)計(jì)與執(zhí)行過程:匯編語言程序設(shè)計(jì)與執(zhí)行過程:輸入?yún)R編語言源程序輸入?yún)R編語言源程序 源文件源文件 . .A

3、SMASM匯編(編譯)匯編(編譯) 目標(biāo)文件目標(biāo)文件 . .OBJOBJ鏈接鏈接 可執(zhí)行文件可執(zhí)行文件 . .EXEEXE調(diào)試調(diào)試 最終程序最終程序4.1 4.1 匯編語言源程序匯編語言源程序4.1.14.1.1匯編語言結(jié)構(gòu)匯編語言結(jié)構(gòu) 段名段名1SEGMENT段名段名1ENDS段名段名2SEGMENT段名段名2ENDS段名段名nSEGMENT段名段名nENDS END一個(gè)完整的用匯編語言寫的源程序,由可執(zhí)行指令組成的一個(gè)完整的用匯編語言寫的源程序,由可執(zhí)行指令組成的指令指令性語句性語句和由對符號(hào)定義、分配存儲(chǔ)單元、分段等和由對符號(hào)定義、分配存儲(chǔ)單元、分段等指示性語句指示性語句組成。組成。一個(gè)

4、完整的程序包括四種段:由源程序組成的一個(gè)完整的程序包括四種段:由源程序組成的代碼段代碼段,堆棧操作所,堆棧操作所需要的需要的堆棧段堆棧段和存放數(shù)據(jù)的和存放數(shù)據(jù)的數(shù)據(jù)段數(shù)據(jù)段以及以及附加段附加段。 例例4-1 編寫一個(gè)兩個(gè)字相加的程序。編寫一個(gè)兩個(gè)字相加的程序。DSEGSEGMENTDATA1 DW 0F865HDATA2 DW360CH DSEG ENDS;ESEG SEGMENT SUM DW 2 DUP (?)ESEG ENDS CSEG SEGMENTASSUMECS:CSEG,DS:DSEG,ES:ESEG定義數(shù)定義數(shù)據(jù)段據(jù)段定義被定義被加數(shù)加數(shù)定義加定義加數(shù)數(shù)定義附定義附加段加段ST

5、ART:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,DATA1 ADD AX,DATA2 MOV ES:SI,AX HLTCSEG ENDS ENDSTART4.1.14.1.1匯編語言結(jié)構(gòu)匯編語言結(jié)構(gòu) 4.1.24.1.2匯編語言語句類型及格式匯編語言語句類型及格式指令性語句指令性語句:由指令組成的由:由指令組成的由CPU執(zhí)行的語句。執(zhí)行的語句。指示性語句指示性語句:不是由:不是由CPU執(zhí)行的語句,而是用來告訴匯編程序如執(zhí)行的語句,而是用來告訴匯編程序如何對程序進(jìn)行匯編的指令,這類指令不能生成目標(biāo)代碼。何對程序進(jìn)行匯編的指令,這類指令

6、不能生成目標(biāo)代碼。指令性語句的格式:指令性語句的格式: 標(biāo)號(hào):標(biāo)號(hào): 前綴前綴 助記符助記符 操作數(shù)操作數(shù) , 操作數(shù)操作數(shù) ;注釋;注釋 指令的符號(hào)地址,指令的符號(hào)地址,標(biāo)號(hào)后要有冒號(hào)標(biāo)號(hào)后要有冒號(hào)操作碼操作碼注釋前加分號(hào)注釋前加分號(hào)指示性語句格式指示性語句格式: : 名字名字 偽指令助記符偽指令助記符 操作數(shù)操作數(shù) ,操作數(shù),操作數(shù), ;注釋;注釋 變量的符號(hào)地址變量的符號(hào)地址,其后不加冒號(hào),其后不加冒號(hào)指示性語句中至指示性語句中至少有一個(gè)操作數(shù)少有一個(gè)操作數(shù)標(biāo)號(hào)、名字的區(qū)別標(biāo)號(hào)、名字的區(qū)別標(biāo)號(hào)后有冒號(hào),在指令性語句前;名字后不加冒號(hào),在指示標(biāo)號(hào)后有冒號(hào),在指令性語句前;名字后不加冒號(hào),在

7、指示性語句前。性語句前。英文字母、數(shù)字及專用字符組成英文字母、數(shù)字及專用字符組成, ,最大長度不能超過最大長度不能超過3131個(gè)個(gè), ,且且不能由數(shù)字打頭不能由數(shù)字打頭, ,不能用保留字不能用保留字( (如寄存器名如寄存器名, ,指令助記符指令助記符, ,偽偽指令指令) )。 例例:START:MOV AX,DATADATA1 DB 11H,22H,33H4.1.24.1.2匯編語言語句類型及格式匯編語言語句類型及格式操作碼操作碼指令碼指令碼 命令命令CPUCPU要完成的操作要完成的操作偽指令助記符偽指令助記符指示匯編程序要完成的操作指示匯編程序要完成的操作用來定義變量用來定義變量, ,分配存

8、儲(chǔ)單元分配存儲(chǔ)單元指示程序開始和結(jié)束等指示程序開始和結(jié)束等注釋注釋 用分號(hào)作為注釋的開始,用于說明程序或語句的功能,以用分號(hào)作為注釋的開始,用于說明程序或語句的功能,以便于閱讀和理解。便于閱讀和理解。4.1.24.1.2匯編語言語句類型及格式匯編語言語句類型及格式4.1.34.1.3數(shù)據(jù)項(xiàng)及表達(dá)式數(shù)據(jù)項(xiàng)及表達(dá)式 常量(常量(Constant):):指令中出現(xiàn)的固定值指令中出現(xiàn)的固定值,包括數(shù)字常量和字符包括數(shù)字常量和字符 串常量。串常量。寄存器寄存器存儲(chǔ)器單元存儲(chǔ)器單元常量常量變量或標(biāo)號(hào)變量或標(biāo)號(hào)表達(dá)式表達(dá)式操作數(shù)操作數(shù)數(shù)據(jù)項(xiàng)數(shù)據(jù)項(xiàng)數(shù)字常量數(shù)字常量字符串常量字符串常量十進(jìn)制常量,十進(jìn)制常量,2

9、3D二進(jìn)制常量,二進(jìn)制常量,1010010B十六進(jìn)制常量,十六進(jìn)制常量,64H,0F8H匯編時(shí)被譯成對應(yīng)的匯編時(shí)被譯成對應(yīng)的ASCII碼碼:用引號(hào)引起的字符或字符串,例:用引號(hào)引起的字符或字符串,例:A,ABCD 標(biāo)號(hào)標(biāo)號(hào)是為了使程序便于理解和書寫所使用的一些字符串,常作是為了使程序便于理解和書寫所使用的一些字符串,常作為一段程序的開頭,一個(gè)數(shù)據(jù)塊的開頭。如規(guī)范程序中的為一段程序的開頭,一個(gè)數(shù)據(jù)塊的開頭。如規(guī)范程序中的DA1、BUFFER、START等等,它不能與指令助記符或偽指令重名它不能與指令助記符或偽指令重名,也不允也不允許由數(shù)字打頭。許由數(shù)字打頭。 保留字保留字是匯編語言中預(yù)先保留下來

10、的具有特殊含義的符號(hào),是匯編語言中預(yù)先保留下來的具有特殊含義的符號(hào),只能作為固定用途。只能作為固定用途。 由程序員確定,不能與助記符或偽指令重名代表存放一條指令由程序員確定,不能與助記符或偽指令重名代表存放一條指令的存儲(chǔ)單元的符號(hào)地址標(biāo)號(hào)的屬性:的存儲(chǔ)單元的符號(hào)地址標(biāo)號(hào)的屬性: 段段 標(biāo)號(hào)所在段的段地址標(biāo)號(hào)所在段的段地址 偏移量偏移量 標(biāo)號(hào)單元地址與段首地址之間的位移量。標(biāo)號(hào)單元地址與段首地址之間的位移量。 類型類型 字節(jié)型、字型和雙字型字節(jié)型、字型和雙字型4.1.34.1.3數(shù)據(jù)項(xiàng)及表達(dá)式數(shù)據(jù)項(xiàng)及表達(dá)式變量變量名由字母開頭名由字母開頭,其長度不能超過其長度不能超過31個(gè)字符個(gè)字符,類型有類型

11、有BYTE、WORD、DWORD等等。等等。代表內(nèi)存中的數(shù)據(jù)區(qū),程序中視為存儲(chǔ)器操作數(shù)代表內(nèi)存中的數(shù)據(jù)區(qū),程序中視為存儲(chǔ)器操作數(shù)變量的屬性:變量的屬性: 段段 值值 變量所在段的段地址變量所在段的段地址 偏移量偏移量 變量單元地址與段首地址之間的位移量。變量單元地址與段首地址之間的位移量。 類類 型型 字節(jié)型、字型和雙字型字節(jié)型、字型和雙字型使用時(shí)要注意:使用時(shí)要注意: 變量類型與指令的要求相符;變量類型與指令的要求相符; MOV AX, VAR1 MOV AL, VAR2 定義變量時(shí),變量名對應(yīng)的是數(shù)據(jù)區(qū)的首地址。定義變量時(shí),變量名對應(yīng)的是數(shù)據(jù)區(qū)的首地址。 NUN DB 11H,22H,33

12、H MOV AL, NUM+24.1.34.1.3數(shù)據(jù)項(xiàng)及表達(dá)式數(shù)據(jù)項(xiàng)及表達(dá)式用一個(gè)用一個(gè)運(yùn)算符運(yùn)算符可以對一個(gè)操作數(shù)或幾個(gè)操作數(shù)進(jìn)行運(yùn)算,這就可以對一個(gè)操作數(shù)或幾個(gè)操作數(shù)進(jìn)行運(yùn)算,這就構(gòu)成了一個(gè)表達(dá)式,從而得到一個(gè)新的值。構(gòu)成了一個(gè)表達(dá)式,從而得到一個(gè)新的值。運(yùn)算符包括:算術(shù)運(yùn)運(yùn)算符包括:算術(shù)運(yùn)算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、分析運(yùn)算符各綜合運(yùn)算符算符、邏輯運(yùn)算符、關(guān)系運(yùn)算符、分析運(yùn)算符各綜合運(yùn)算符。 表達(dá)式表達(dá)式由操作數(shù)和運(yùn)算符組成,不是指令,不能執(zhí)行,是一個(gè)由操作數(shù)和運(yùn)算符組成,不是指令,不能執(zhí)行,是一個(gè)本身已確定的操作數(shù),在匯編時(shí)表達(dá)式得到一個(gè)值。本身已確定的操作數(shù),在匯編時(shí)表達(dá)式得到一

13、個(gè)值。 算術(shù)運(yùn)算和邏輯運(yùn)算符算術(shù)運(yùn)算和邏輯運(yùn)算符: :算術(shù)運(yùn)算符算術(shù)運(yùn)算符 + +,- -,* *,/ /,MODMOD邏輯運(yùn)算符邏輯運(yùn)算符 ANDAND,OROR,NOTNOT,XORXOR例:例:MOV ALMOV AL,8 AND 48 AND 4 MOV AL MOV AL,8+4-18+4-1關(guān)系運(yùn)算符:關(guān)系運(yùn)算符:參與關(guān)系運(yùn)算的必須是兩個(gè)數(shù)值參與關(guān)系運(yùn)算的必須是兩個(gè)數(shù)值關(guān)系不成立,結(jié)果為關(guān)系不成立,結(jié)果為0 0;關(guān)系成立,結(jié)果為關(guān)系成立,結(jié)果為FFFFHFFFFH。包括:包括: EQEQ(等于)、(等于)、NENE(不等(不等于)、于)、LTLT(小于)、(小于)、GTGT(大于)

14、、(大于)、LELE(小于等于)(小于等于)GEGE(大于等于)(大于等于)4.1.34.1.3數(shù)據(jù)項(xiàng)及表達(dá)式數(shù)據(jù)項(xiàng)及表達(dá)式 取值運(yùn)算符取值運(yùn)算符:用于分析存儲(chǔ)器操作數(shù)的屬性用于分析存儲(chǔ)器操作數(shù)的屬性O(shè)FFSET 取得其后變量或標(biāo)號(hào)的偏移地址取得其后變量或標(biāo)號(hào)的偏移地址SEG 取得其后變量或標(biāo)號(hào)的段地址取得其后變量或標(biāo)號(hào)的段地址TYPE 取取LENGTH 取所定義存儲(chǔ)區(qū)的長度取所定義存儲(chǔ)區(qū)的長度SIZE 取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)取所定義存儲(chǔ)區(qū)的字節(jié)數(shù)MOV BX,OFFSET DATA LEA BX,DATA若若BUFFERBUFFER存儲(chǔ)區(qū)是用如下偽指令定義:存儲(chǔ)區(qū)是用如下偽指令定義: BUF

15、FER DW 200 DUP(0)BUFFER DW 200 DUP(0) 則:則: TYPETYPE BUFFER BUFFER 等于等于2 2 LENGTH BUFFERLENGTH BUFFER等于等于200200 SIZE BUFFERSIZE BUFFER等于等于4004004.1.34.1.3數(shù)據(jù)項(xiàng)及表達(dá)式數(shù)據(jù)項(xiàng)及表達(dá)式綜合運(yùn)算符綜合運(yùn)算符PTRPTR用來指定位于其后的存儲(chǔ)器操作數(shù)的類型用來指定位于其后的存儲(chǔ)器操作數(shù)的類型。比如:。比如: MOVBYTE PTR 1000,0 此語句用此語句用BYTE和和PTR規(guī)定規(guī)定1000單元作為字節(jié)單元,執(zhí)行結(jié)果是單元作為字節(jié)單元,執(zhí)行結(jié)果是

16、使使1000單元清單元清0。 MOVWORD PTR 1000,0 則對則對1000、1001兩單元清兩單元清0,因?yàn)檫@里用,因?yàn)檫@里用WORD和和PTR規(guī)定規(guī)定1000作為一個(gè)字的開始。作為一個(gè)字的開始。 PTR也用來更改一些已經(jīng)規(guī)定了類型的存儲(chǔ)單元的類型。也用來更改一些已經(jīng)規(guī)定了類型的存儲(chǔ)單元的類型。SEG運(yùn)算符用來得到一個(gè)標(biāo)號(hào)或變量的段地址。如:運(yùn)算符用來得到一個(gè)標(biāo)號(hào)或變量的段地址。如: MOVAX,SEGDATA MOVDS,AX這兩個(gè)語句使得這兩個(gè)語句使得DS中存放對應(yīng)于中存放對應(yīng)于DATA的段地址。的段地址。 4.1.34.1.3數(shù)據(jù)項(xiàng)及表達(dá)式數(shù)據(jù)項(xiàng)及表達(dá)式其它運(yùn)算符其它運(yùn)算符方括

17、號(hào)方括號(hào) 方括號(hào)中內(nèi)容為操作數(shù)的偏移地址方括號(hào)中內(nèi)容為操作數(shù)的偏移地址段重設(shè)符段重設(shè)符 段寄存器名:段寄存器名: 用于修改默認(rèn)的段基地址用于修改默認(rèn)的段基地址4.1.34.1.3數(shù)據(jù)項(xiàng)及表達(dá)式數(shù)據(jù)項(xiàng)及表達(dá)式4.2 4.2 偽指令偽指令掌握:掌握:偽指令的格式及實(shí)現(xiàn)的操作偽指令的格式及實(shí)現(xiàn)的操作偽指令的應(yīng)用偽指令的應(yīng)用 指示性語句中的偽操作命令,在形式和所處語句中位置,指示性語句中的偽操作命令,在形式和所處語句中位置,都與都與CPUCPU指令相似,稱為指令相似,稱為偽指令偽指令。由匯編程序執(zhí)行的由匯編程序執(zhí)行的“指令系統(tǒng)指令系統(tǒng)”用于定義變量、分配存儲(chǔ)區(qū)、定義邏輯段、指示程序開始和結(jié)用于定義變量

18、、分配存儲(chǔ)區(qū)、定義邏輯段、指示程序開始和結(jié)束等束等4.24.2偽指令偽指令4.2.1 4.2.1 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令用于定義數(shù)據(jù)區(qū)中變量的類型,數(shù)據(jù)定義偽指令的一般格式:用于定義數(shù)據(jù)區(qū)中變量的類型,數(shù)據(jù)定義偽指令的一般格式:變量名變量名偽操作偽操作操作數(shù),操作數(shù),操作數(shù),操作數(shù),偽指令助記符偽指令助記符DB 定義的變量為字節(jié)型定義的變量為字節(jié)型DW 定義的變量為字類型(雙字節(jié))定義的變量為字類型(雙字節(jié))DD 定義的變量為雙字型(定義的變量為雙字型(4字節(jié))字節(jié))DQ 定義的變量為定義的變量為4字型(字型(8字節(jié))字節(jié))DT 定義的變量為定義的變量為10字節(jié)型字節(jié)型DATA DB 1

19、1H,33H ;定義包含兩個(gè)元素的字節(jié)變量;定義包含兩個(gè)元素的字節(jié)變量DATANUM DW 100588 ;定義一個(gè)字類型變量;定義一個(gè)字類型變量NUM,初值為表達(dá),初值為表達(dá) 式的值式的值STR DB Hello! ;定義一個(gè)字符串,字符串的首地址為;定義一個(gè)字符串,字符串的首地址為STRDATA1 DB ?;在該單元中沒有放初值,匯編程序會(huì)在該處留出一?;在該單元中沒有放初值,匯編程序會(huì)在該處留出一 個(gè)單元。個(gè)單元。DATA1DB20DUP(?);為變量(?);為變量DATA1分配分配20個(gè)字節(jié)的空個(gè)字節(jié)的空 間,初值為任意值。間,初值為任意值。DATA2DW?;為變量?;為變量DATA2

20、分配分配2個(gè)字節(jié)的空個(gè)字節(jié)的空 間,間, 值為任意值值為任意值數(shù)據(jù)定義偽操作數(shù)的操作數(shù)還可以是問號(hào)數(shù)據(jù)定義偽操作數(shù)的操作數(shù)還可以是問號(hào)“?”,此時(shí)僅給變,此時(shí)僅給變量保留相應(yīng)的存儲(chǔ)單元。量保留相應(yīng)的存儲(chǔ)單元。當(dāng)同樣的操作數(shù)重復(fù)多次時(shí),可用重復(fù)操作符當(dāng)同樣的操作數(shù)重復(fù)多次時(shí),可用重復(fù)操作符“DUP”表示。表示。DATA3DB20DUP(30H);為變量);為變量DATA3分配分配20個(gè)字節(jié)個(gè)字節(jié) 的空間,初值均為的空間,初值均為30HSTDBHow are you?格式:格式: 變量名變量名 偽指令助記符偽指令助記符 n DUP(初值,初值,)4.2.1 4.2.1 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令

21、例例:DATA1 DB 11HDATA1 DB 11H,22H22H,33H33H,44H44HDATA2 DW 11HDATA2 DW 11H,22H22H,3344H3344HDATA3 DD 11HDATA3 DD 11H* *2 2,22H22H,33445566H33445566HSUM DQ 0011223344556677HSUM DQ 0011223344556677HABC DT 1234567890HABC DT 1234567890H以上變量在內(nèi)存以上變量在內(nèi)存中的存放形式中的存放形式4.2.1 4.2.1 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令偽指令的性質(zhì)決定所定義變量的屬性偽指

22、令的性質(zhì)決定所定義變量的屬性定義字符串必須用定義字符串必須用DBDB偽指令偽指令 例例 : DATA1 DB ABCDDATA1 DB ABCD,66H66HABCD41H42H43H44H66H4.2.1 4.2.1 數(shù)據(jù)定義偽指令數(shù)據(jù)定義偽指令4.2.24.2.2符號(hào)定義偽指令符號(hào)定義偽指令EQUEQU EQUEQU不僅可以使一個(gè)標(biāo)號(hào)等于一個(gè)數(shù)值,也可以使一個(gè)標(biāo)號(hào)等不僅可以使一個(gè)標(biāo)號(hào)等于一個(gè)數(shù)值,也可以使一個(gè)標(biāo)號(hào)等于另一個(gè)標(biāo)號(hào)。于另一個(gè)標(biāo)號(hào)。 EQUEQU說明的表達(dá)式不占用內(nèi)存空間。其兩種使用格說明的表達(dá)式不占用內(nèi)存空間。其兩種使用格式:式: 名字名字 EQUEQU表達(dá)式表達(dá)式新名字新名字

23、EQUEQU舊名字舊名字CREQU0DH;使標(biāo)號(hào);使標(biāo)號(hào)CR為數(shù)值為數(shù)值0DHXYZEQUABC;使;使XYZ和和ABC等同等同COUNTEQUCX;使;使COUNT和寄存器和寄存器CX具有相具有相 同的意義。同的意義。 例例:CR EQU 0DHTEN EQU 0AHAA EQU ASCII_TABLEVAR EQU TEN*2+1024ADR EQU ES:BP+DI+5GOTO EQU JMPMOV AL,CRCMP AL,TENGOTO WORD PTR ADR4.2.24.2.2符號(hào)定義偽指令符號(hào)定義偽指令EQUEQU4.2.34.2.3段定義偽指令段定義偽指令偽指令偽指令SEGME

24、NTSEGMENT、ENDSENDS總是成對使用的。用這一對偽指令可將總是成對使用的。用這一對偽指令可將匯編語言源程序分成幾個(gè)段,通常分為數(shù)據(jù)段、堆棧段和代碼段。匯編語言源程序分成幾個(gè)段,通常分為數(shù)據(jù)段、堆棧段和代碼段。格式為:格式為:段名段名SEGMENTSEGMENT定位類型定位類型 組合類型組合類型 類別類別定位類型定位類型:PARAPARA: 段的起點(diǎn)從節(jié)邊界開始(段的起點(diǎn)從節(jié)邊界開始(1616個(gè)字節(jié)為個(gè)字節(jié)為1 1節(jié))節(jié))BYTEBYTE: 段的起點(diǎn)從存儲(chǔ)器任何地址開始段的起點(diǎn)從存儲(chǔ)器任何地址開始WORDWORD: 段的起點(diǎn)從偶地址開始段的起點(diǎn)從偶地址開始PAGEPAGE: 段的起點(diǎn)

25、從頁邊界開始(段的起點(diǎn)從頁邊界開始(256256個(gè)字節(jié)為個(gè)字節(jié)為1 1頁)頁)組合類型:組合類型:與其它模塊中的同名段在滿足定位類型的前提下具有的組合方式與其它模塊中的同名段在滿足定位類型的前提下具有的組合方式: :NONENONE: 不組合不組合PUBLICPUBLIC: 依次連接(順序由依次連接(順序由LINKLINK程序確定)程序確定)COMMONCOMMON: 覆蓋連接覆蓋連接STACKSTACK: 堆棧段的依次連接堆棧段的依次連接AT AT 表達(dá)式:表達(dá)式: 段定義在表達(dá)式值為段基的節(jié)邊界段定義在表達(dá)式值為段基的節(jié)邊界MEMORYMEMORY: 相應(yīng)段在同名段的最高地址處相應(yīng)段在同名

26、段的最高地址處類別類別:不同模塊連接時(shí)將相同類別的段放在連續(xù)的內(nèi)存區(qū)域中不同模塊連接時(shí)將相同類別的段放在連續(xù)的內(nèi)存區(qū)域中4.2.34.2.3段定義偽指令段定義偽指令例例:DATA SEGMENT PUBLIC CODEDATA SEGMENT PUBLIC CODEMEM1 DB 11HMEM1 DB 11H,22H22HDATA ENDSDATA ENDS4.2.34.2.3段定義偽指令段定義偽指令模塊模塊1STACK SEGMENT STACK DB 100 DUP(?)STACK EDNSDATA SEGMENT COMMONAREA1 DB 1024 DUP(?)DATA ENDSCO

27、DE SEGMENT PUBLICCODE ENDS模塊模塊2STACK SEGMENT STACK DB 50 DUP(?)STACK EDNSDATA SEGMENT COMMONAREA1 DB 8192 DUP(0)DATA ENDSCODE SEGMENT PUBLICCODE ENDS END4.2.34.2.3段定義偽指令段定義偽指令 例題例題4-34-34.2.44.2.4設(shè)定段寄存器偽指令設(shè)定段寄存器偽指令偽指令偽指令A(yù)SSUMEASSUME則告訴匯編程序,哪一個(gè)段為數(shù)據(jù)段哪一個(gè)段為堆則告訴匯編程序,哪一個(gè)段為數(shù)據(jù)段哪一個(gè)段為堆棧段,哪一個(gè)段為代碼段。棧段,哪一個(gè)段為代碼段。

28、 ASSUMEASSUME段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,例例4-4:CODE SEGMENT PARA PUBLIC CODE ASSUME CS:CODE,DS:DATA,ES:EDATA,SS:STACK MOV AX,DATA MOV DS,AX MOV AX,EDATA MOV ES,AX MOV AX,STACK MOV SS,AX CODE ENDS4.2.44.2.4設(shè)定段寄存器偽指令設(shè)定段寄存器偽指令4.2.5 4.2.5 定義過程偽指令定義過程偽指令A(yù)SM-86ASM-86語言中,過程的含義和子程序是一樣的,一個(gè)過程可語言中,過程的含

29、義和子程序是一樣的,一個(gè)過程可以被其他程序所調(diào)用,它的最后一條指令總是返回指令,以控制以被其他程序所調(diào)用,它的最后一條指令總是返回指令,以控制此過程在執(zhí)行完畢后,返回到主程序。此過程在執(zhí)行完畢后,返回到主程序。定義過程的偽指令的一般格式:定義過程的偽指令的一般格式: 過程名過程名PROCPROCNEAR/FARNEAR/FAR RETRET過程名過程名ENDPENDP偽指令偽指令ENDEND用來表示源程序到此結(jié)束,指示匯編程序停止匯編。用來表示源程序到此結(jié)束,指示匯編程序停止匯編。 END END標(biāo)號(hào)標(biāo)號(hào)4.2.6 4.2.6 宏命令偽指令宏命令偽指令宏命令宏命令源程序中由匯編程序識(shí)別的具有獨(dú)

30、立功能的一段源程序中由匯編程序識(shí)別的具有獨(dú)立功能的一段 程序代碼程序代碼格式:格式: 宏命令名宏命令名 MACRO MACRO ENDM ENDM宏體宏體宏命令宏命令與與子程序子程序的區(qū)別:的區(qū)別:(1 1)宏命令偽指令有匯編程序)宏命令偽指令有匯編程序MASMMASM在反匯編過程中進(jìn)行處理,在反匯編過程中進(jìn)行處理,在每個(gè)宏調(diào)用處,在每個(gè)宏調(diào)用處,MASMMASM都用其對應(yīng)的宏定義體替換。都用其對應(yīng)的宏定義體替換。(2 2)宏指令簡化了源程序,但不能簡化目標(biāo)程序)宏指令簡化了源程序,但不能簡化目標(biāo)程序(3 3)宏指令執(zhí)行的速度快)宏指令執(zhí)行的速度快4.2.7 4.2.7 模塊定義與鏈接偽指令模

31、塊定義與鏈接偽指令ORG ORG 段內(nèi)程序代碼或變量的起始偏移地址段內(nèi)程序代碼或變量的起始偏移地址格式:格式: ORG ORG 表達(dá)式表達(dá)式例:例: ORG 2000HORG 2000H計(jì)算值為計(jì)算值為非負(fù)常數(shù)非負(fù)常數(shù)NAMENAME為目標(biāo)程序設(shè)定一個(gè)名字為目標(biāo)程序設(shè)定一個(gè)名字格式:格式: NAME NAME 模塊名模塊名TITLETITLE為程序清單指定打印標(biāo)題為程序清單指定打印標(biāo)題格式:格式: TITLE TITLE 標(biāo)題名標(biāo)題名END 表示源程序結(jié)束表示源程序結(jié)束格式:格式: END END 標(biāo)號(hào)標(biāo)號(hào) 一個(gè)完整源程序結(jié)構(gòu)例一個(gè)完整源程序結(jié)構(gòu)例DSEG SEGMENTDATA1 DB 1,

32、2,DATA2 DW 1234HDSEG ENDSESEG SEGMENT DB 20 DUP(?)(?)ESEG ENDSSSEG SEGMENT STACK STACK DB 200 DUP(?)(?)SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG, ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX CSEG ENDS END START一個(gè)完整源程序結(jié)構(gòu)例一個(gè)完整源程序結(jié)構(gòu)例 CSEG SEGMENT ASSUME CS

33、:CSEG,DS:DSEG, ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX CSEG ENDS END START源程序源程序 代碼代碼例例4-7求從求從TABLE開始的開始的10個(gè)無符號(hào)字節(jié)數(shù)的和,結(jié)果放個(gè)無符號(hào)字節(jié)數(shù)的和,結(jié)果放SUM字單元中。字單元中。DATASEGMENT; 定義數(shù)據(jù)段定義數(shù)據(jù)段TABLE DB 12H,23H,34H,45H,56H DB 67H,78H,89H,9AH,0FDH ; 10個(gè)加數(shù)個(gè)加數(shù)SUM DW?DATA ENDS;數(shù)據(jù)段

34、結(jié)束;數(shù)據(jù)段結(jié)束;STACKSEGMENT;定義;定義50個(gè)字節(jié)的堆棧段個(gè)字節(jié)的堆棧段DB 50 DUP (?);STACKENDS ;附加段結(jié)束;附加段結(jié)束;CODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AX MOV AX,STACK MOVSS,AX LEA SI,TABLE MOVCX,10 XORAX,AXNEXT: ADD AL,SI ADC AH,0 INC SI LOOP NEXT MOV SUM,AXHLTCODE ENDS END START4.3 4.3 DOS 功能調(diào)用功能調(diào)用 微型機(jī)

35、的系統(tǒng)軟件(如操作系統(tǒng))提供了很多可供用戶調(diào)用微型機(jī)的系統(tǒng)軟件(如操作系統(tǒng))提供了很多可供用戶調(diào)用的功能子程序。主要分為的功能子程序。主要分為DOSDOS和和BIOSBIOS功能調(diào)用。功能調(diào)用。DOSDOS功能調(diào)用不依功能調(diào)用不依賴具體的硬件系統(tǒng)。賴具體的硬件系統(tǒng)。 所有的所有的DOSDOS系統(tǒng)功能調(diào)用都是利用軟中斷指令系統(tǒng)功能調(diào)用都是利用軟中斷指令I(lǐng)NT 21HINT 21H來實(shí)現(xiàn)來實(shí)現(xiàn)的。的。 INT 21H 是一個(gè)具有是一個(gè)具有90多各子功能的中斷服務(wù)程序,每個(gè)子多各子功能的中斷服務(wù)程序,每個(gè)子功能都進(jìn)行了編號(hào)功能都進(jìn)行了編號(hào)稱為功能號(hào)。用戶通過指定功能號(hào)來調(diào)用稱為功能號(hào)。用戶通過指定功

36、能號(hào)來調(diào)用INT 21H的不同子功能。的不同子功能。DOS系統(tǒng)功能調(diào)用的使用方法如下:系統(tǒng)功能調(diào)用的使用方法如下:AH功能號(hào);功能號(hào);在其他寄存器中放入該功能所要求的入口參數(shù);在其他寄存器中放入該功能所要求的入口參數(shù);執(zhí)行執(zhí)行INT 21H指令;指令;分析出口參數(shù)。分析出口參數(shù)。 例例4-8從鍵盤輸入一個(gè)從鍵盤輸入一個(gè)“Y”或或“N”字符。字符。KEY: MOV AH,1;有回顯的鍵盤輸入。功能號(hào);有回顯的鍵盤輸入。功能號(hào)1送送(AH) INT 21H CMP AL,Y JE YES CMP AL,N JE NOT JMP KEYYES: NOT: 1、從鍵盤輸入單個(gè)字符、從鍵盤輸入單個(gè)字符4

37、.3 4.3 DOS 功能調(diào)用功能調(diào)用2、從鍵盤輸入字符串、從鍵盤輸入字符串AH AH 功能號(hào)功能號(hào)OAHOAHDSDS:DX DX 字符串在內(nèi)存中的存放地址字符串在內(nèi)存中的存放地址INT 21HINT 21H定義字符緩沖區(qū)定義字符緩沖區(qū)0DHN1N2整個(gè)緩沖區(qū)整個(gè)緩沖區(qū)最大鍵入字符數(shù)最大鍵入字符數(shù)實(shí)際鍵入字符數(shù)實(shí)際鍵入字符數(shù)4.3 4.3 DOS 功能調(diào)用功能調(diào)用輸入字符串程序段輸入字符串程序段 DAT1 DB 20 DAT1 DB 20,?,?,20 DUP20 DUP(?)(?) LEA DX LEA DX,DAT1DAT1 MOV AH MOV AH,0AH0AH INT 21H IN

38、T 21H在數(shù)據(jù)段在數(shù)據(jù)段中定義中定義輸入緩沖區(qū)輸入緩沖區(qū)14H ?定義后的輸入緩定義后的輸入緩沖區(qū)初始狀態(tài):沖區(qū)初始狀態(tài):4.3 4.3 DOS 功能調(diào)用功能調(diào)用4.3 4.3 DOS 功能調(diào)用功能調(diào)用 3.顯示器(顯示器(CRT)輸出)輸出 要將一個(gè)字符串送到顯示器顯示,可調(diào)用要將一個(gè)字符串送到顯示器顯示,可調(diào)用DOS功能的功能的2,6,9號(hào)功能實(shí)現(xiàn)。其中,功能號(hào)功能實(shí)現(xiàn)。其中,功能2,6用于顯示單個(gè)字符,功能用于顯示單個(gè)字符,功能9顯示一個(gè)顯示一個(gè)字符串。字符串。 MOV DL,要顯示的字符要顯示的字符 MOV AH,2 INT 21H要顯示的字符的要顯示的字符的ASCII代碼代碼DOS

39、功功能號(hào)能號(hào)4.3 4.3 DOS 功能調(diào)用功能調(diào)用AH 功能號(hào)功能號(hào)O2HDL 待輸出字符待輸出字符INT 21H 注:注:功能功能2、6、9都可以接受鍵盤輸入,都可以接受鍵盤輸入,2、6顯示單個(gè)字符,顯示單個(gè)字符,9顯示一個(gè)字符串顯示一個(gè)字符串1) 單字符顯示輸出單字符顯示輸出 MOVAH,02 MOVDL,41H INT21H執(zhí)行結(jié)果:執(zhí)行結(jié)果:屏幕顯示屏幕顯示A4.3 4.3 DOS 功能調(diào)用功能調(diào)用例例:AH AH 功能號(hào)功能號(hào)O9HO9HDSDS:DX DX 待輸出字符串的偏移地址待輸出字符串的偏移地址INT 21HINT 21H 被顯示的字符串必須被顯示的字符串必須以以$結(jié)束結(jié)束

40、,且所顯示的內(nèi)容不應(yīng)出現(xiàn)非且所顯示的內(nèi)容不應(yīng)出現(xiàn)非可見的可見的ASCII碼碼2 2)字符串輸出顯示)字符串輸出顯示DATA SEGMENTMESS1 DB Input String: 0DH,0AH,$DATA ENDSCODE SEGMENT MOVAH,09MOVDX,OFFSET MESS1INT21H 4.3 4.3 DOS 功能調(diào)用功能調(diào)用 4.退回到退回到DOS 一個(gè)實(shí)際可運(yùn)行的用戶程序在執(zhí)行完后,應(yīng)該返回到一個(gè)實(shí)際可運(yùn)行的用戶程序在執(zhí)行完后,應(yīng)該返回到DOS提示符提示符狀態(tài),這時(shí)需要調(diào)用狀態(tài),這時(shí)需要調(diào)用4CH 號(hào)功能:號(hào)功能: MOV AH,4CH INT 21HDOS功功能號(hào)

41、能號(hào)4.44.4匯編語言程序設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ) 4.4.14.4.1程序設(shè)計(jì)概述程序設(shè)計(jì)概述 1 1、程序質(zhì)量的評價(jià)標(biāo)準(zhǔn)、程序質(zhì)量的評價(jià)標(biāo)準(zhǔn) 衡量一個(gè)程序的質(zhì)量通常有以下幾個(gè)標(biāo)準(zhǔn):衡量一個(gè)程序的質(zhì)量通常有以下幾個(gè)標(biāo)準(zhǔn):(1 1)程序的正確性和完整性;)程序的正確性和完整性;(2)程序的易讀性:程序的易讀性:(3 3)程序的執(zhí)行時(shí)間和效率:)程序的執(zhí)行時(shí)間和效率:(4 4)程序所占內(nèi)存的大小。)程序所占內(nèi)存的大小。 編寫一個(gè)程序首先要保證它的正確性,包括語法上和功能編寫一個(gè)程序首先要保證它的正確性,包括語法上和功能上:針對匯編語言程序較難讀、難理解的缺點(diǎn),設(shè)計(jì)時(shí)應(yīng)盡量上:針對匯編語言程

42、序較難讀、難理解的缺點(diǎn),設(shè)計(jì)時(shí)應(yīng)盡量采用結(jié)構(gòu)化、模塊化的程序設(shè)計(jì)方法,每個(gè)模塊都由基本結(jié)構(gòu)采用結(jié)構(gòu)化、模塊化的程序設(shè)計(jì)方法,每個(gè)模塊都由基本結(jié)構(gòu)程序組成,在語句后邊添加一定的注釋說明,并配以完整的文程序組成,在語句后邊添加一定的注釋說明,并配以完整的文檔資料。以便于閱讀、測試和維護(hù)等:另外,程序的響應(yīng)時(shí)間、檔資料。以便于閱讀、測試和維護(hù)等:另外,程序的響應(yīng)時(shí)間、實(shí)時(shí)處理能力、輸入輸出方式和結(jié)果、內(nèi)存占用大小及安全可實(shí)時(shí)處理能力、輸入輸出方式和結(jié)果、內(nèi)存占用大小及安全可靠性等,也都是非常重要的性能指標(biāo)。靠性等,也都是非常重要的性能指標(biāo)。 2、程序設(shè)計(jì)的一般步驟、程序設(shè)計(jì)的一般步驟 依照軟件工程理

43、論,匯編語言的程序設(shè)計(jì)與高級(jí)語言的程序設(shè)依照軟件工程理論,匯編語言的程序設(shè)計(jì)與高級(jí)語言的程序設(shè)計(jì)一樣可分為以下幾個(gè)步驟:計(jì)一樣可分為以下幾個(gè)步驟:(1) 分析實(shí)際問題并抽象出系統(tǒng)數(shù)學(xué)模型,建立模塊結(jié)構(gòu)并畫出結(jié)分析實(shí)際問題并抽象出系統(tǒng)數(shù)學(xué)模型,建立模塊結(jié)構(gòu)并畫出結(jié)構(gòu)框圖;構(gòu)框圖;(2) 確定求解各模塊的數(shù)據(jù)結(jié)構(gòu)及算法。確定求解各模塊的數(shù)據(jù)結(jié)構(gòu)及算法。 (3) 畫程序流程圖畫程序流程圖;(4) 用指令或偽指令為數(shù)據(jù)和程序代碼分配內(nèi)存單元和寄存器,這用指令或偽指令為數(shù)據(jù)和程序代碼分配內(nèi)存單元和寄存器,這是匯編語言程序設(shè)計(jì)的一個(gè)重要特點(diǎn)名是匯編語言程序設(shè)計(jì)的一個(gè)重要特點(diǎn)名;(5) 編寫源程序并保存,形

44、成源程序文件(編寫源程序并保存,形成源程序文件(ASM);(6) 通過匯編生成目標(biāo)代碼文件(通過匯編生成目標(biāo)代碼文件(OBJ),同時(shí)完成靜態(tài)的語法檢,同時(shí)完成靜態(tài)的語法檢查:查:(7) 通過鏈接生成可執(zhí)行文件(通過鏈接生成可執(zhí)行文件(EXE);(8) 程序調(diào)試,通過后可進(jìn)行整個(gè)系統(tǒng)的測試。程序調(diào)試,通過后可進(jìn)行整個(gè)系統(tǒng)的測試。4.44.4匯編語言程序設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ) 3、程序設(shè)計(jì)的一般步驟、程序設(shè)計(jì)的一般步驟 任何一個(gè)復(fù)雜的程序都是由簡單的基本程序構(gòu)成的,同高任何一個(gè)復(fù)雜的程序都是由簡單的基本程序構(gòu)成的,同高級(jí)語言類似,匯編語言程序的設(shè)計(jì)也常用到以下這樣幾種基本級(jí)語言類似,匯編語言

45、程序的設(shè)計(jì)也常用到以下這樣幾種基本程序結(jié)構(gòu):程序結(jié)構(gòu): 順序程序順序程序 分支程序分支程序 循環(huán)程序循環(huán)程序 子程序子程序順序程序是直線運(yùn)動(dòng)的,既順序程序是直線運(yùn)動(dòng)的,既無分支,也無循環(huán)或轉(zhuǎn)移,無分支,也無循環(huán)或轉(zhuǎn)移,是最簡單的一種程序結(jié)構(gòu)。是最簡單的一種程序結(jié)構(gòu)。經(jīng)常會(huì)碰到因不同的條經(jīng)常會(huì)碰到因不同的條件去執(zhí)行不同的程序件去執(zhí)行不同的程序需要反復(fù)做同樣工作的情需要反復(fù)做同樣工作的情況況,循環(huán)程序中需要有循循環(huán)程序中需要有循環(huán)準(zhǔn)備、結(jié)束判斷等指令環(huán)準(zhǔn)備、結(jié)束判斷等指令又稱過程,相當(dāng)于高級(jí)又稱過程,相當(dāng)于高級(jí)語言中的函數(shù)或過程,語言中的函數(shù)或過程,是具有獨(dú)立功能的模塊。是具有獨(dú)立功能的模塊。4.

46、44.4匯編語言程序設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ) 4.4.24.4.2順序程序順序程序例例4-11 對于三個(gè)無符號(hào)數(shù)編寫對于三個(gè)無符號(hào)數(shù)編寫S86H34H21H。DATASEGMENTMUN DB 86H,34H,21H RESULT DW ?DATAENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXLEA SI,MUN LEA DI,RESULT MOV AL,SISTARTS1S2S3結(jié)束結(jié)束4.44.4匯編語言程序設(shè)計(jì)基礎(chǔ)匯編語言程序設(shè)計(jì)基礎(chǔ) MOV BL,SI1 MULBLMOVBL,SI2MOVBH,0S

47、UBAX,BXMOVDI,AXMOV AH,4CHINT21HCODEENDSENDSTART4.4.24.4.2順序程序順序程序例例4-12 內(nèi)存自內(nèi)存自TABLE開始的連續(xù)開始的連續(xù)16個(gè)單元中存放著個(gè)單元中存放著0-15的平方的平方值,查表求值,查表求DATA中任意數(shù)中任意數(shù)X(0X15)的平方值,并將結(jié)果放的平方值,并將結(jié)果放RESULT中。中。程序:程序:DSEGSEGMENTTABLE DB0,1,4,9,16,25,36,49,64,81, 100,121,144,169,196,225;定義平方表定義平方表DATA DB ?RESULT DB ?DSEG ENDSSSEG SE

48、GMENT STACK STACK DB 100 DUP(?)SSEG ENDSCSEG SEGMENT ASSUMECS:CSEG,DS:DSEG,SS:SSEG4.4.24.4.2順序程序順序程序BEGIN:MOVAX,DSEG;初始化數(shù)據(jù)段初始化數(shù)據(jù)段 MOVDS,AX MOVAX,SSEG;初始化堆棧段初始化堆棧段MOVSS,AX;LEABX,TABLE;置數(shù)據(jù)指針;置數(shù)據(jù)指針MOVAH,0 ;MOVAL,DATA;取待查數(shù);取待查數(shù)ADDBX,AX;查表;查表MOVAL,BX;MOVRESULT,AL;平方數(shù)存;平方數(shù)存RESULT單元單元MOVAH,4CHINT21HCSEG EN

49、DS ENDBEGIN4.4.24.4.2順序程序順序程序4.4.34.4.3分支程序分支程序 分支程序是利用條件轉(zhuǎn)分支程序是利用條件轉(zhuǎn)移指令,使程序執(zhí)行到某一指移指令,使程序執(zhí)行到某一指令后,根據(jù)條件是否滿足,來令后,根據(jù)條件是否滿足,來改變程序執(zhí)行的順序。改變程序執(zhí)行的順序。條件條件1 1條件條件2 2分支程序段分支程序段2 2分支程序段分支程序段3 3結(jié)束結(jié)束是是否否否否分支程序段分支程序段1 1是是結(jié)束結(jié)束例例4-13 編寫程序,將數(shù)據(jù)區(qū)中以字節(jié)變量編寫程序,將數(shù)據(jù)區(qū)中以字節(jié)變量BUFFER為首地址的為首地址的100個(gè)單元清零。個(gè)單元清零。程序段如下:程序段如下:DATASEGMENT

50、BUFFERDB 100 DUP(?)COUNT DB 100DATAENDSSTACK SEGMENT DW 32 DUP(?)STACK ENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK4.4.34.4.3分支程序分支程序START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV CL,COUNT;置單元長度置單元長度 LEA BX,BUFFERAGAIN: MOV BX,0;實(shí)現(xiàn)實(shí)現(xiàn)100個(gè)單元清零個(gè)單元清零 INC BX CMP BX,COUNT JB AGAIN MOV AH,4CH INT

51、 21HCODE ENDS END START4.4.34.4.3分支程序分支程序例例4-14 在當(dāng)前數(shù)據(jù)段的在當(dāng)前數(shù)據(jù)段的DATA開始的順序開始的順序80個(gè)單元中,存放個(gè)單元中,存放80位位同學(xué)某門課程的考試成績(同學(xué)某門課程的考試成績(0-100)。編寫程序統(tǒng)計(jì))。編寫程序統(tǒng)計(jì)90分,分,80-89分,分,70-79分,分,60-69分以及分以及60分的人數(shù)。并將結(jié)果放到同一數(shù)據(jù)分的人數(shù)。并將結(jié)果放到同一數(shù)據(jù)段的段的DATA2開始的開始的5個(gè)單元。個(gè)單元。程序:程序:DATASEGMENTDATA1 DB 80 DUP(?)DATA2 DB 5 DUP(0)DATAENDSCODE SEG

52、MENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,80;共統(tǒng)計(jì)共統(tǒng)計(jì)80個(gè)學(xué)生的成績個(gè)學(xué)生的成績4.4.34.4.3分支程序分支程序LEA SI,DATA1LEA DI,DATA2AGAIN:MOV AL,SICMP AL,90;大于大于90分嗎?分嗎?JC NEXT1INC BYTE PTRDI;90分以上的人數(shù)加分以上的人數(shù)加1JMP STONEXT1:CMP AL,80;大于大于80分嗎?分嗎?JC NEXT2INC BYTE PTRDI+1 ;80分以上的人數(shù)加分以上的人數(shù)加1JMP STO4.4.34.4.3分支程序

53、分支程序NEXT2:CMP AL,70;大于大于70分嗎?分嗎?JC NEXT3INC BYTE PTRDI+2;70分以上的人數(shù)加分以上的人數(shù)加1JMP STONEXT3:CMP AL,60;大于大于60分嗎?分嗎?JC NEXT4INC BYTE PTRDI+3 ;60分以上的人數(shù)加分以上的人數(shù)加1NEXT4:INC BYTE PTRDI+4 ;60分以下的人數(shù)加分以下的人數(shù)加1STO:INC SILOOP AGAIN4.4.34.4.3分支程序分支程序CODE ENDS END START循環(huán)循環(huán)體體循環(huán)循環(huán)初態(tài)初態(tài)循環(huán)循環(huán)結(jié)束結(jié)束條件條件4.4.4 4.4.4 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)

54、例例3-50 統(tǒng)計(jì)以統(tǒng)計(jì)以BUFFER為起始地址的為起始地址的100個(gè)單元中負(fù)數(shù)的個(gè)數(shù)個(gè)單元中負(fù)數(shù)的個(gè)數(shù),并將統(tǒng)計(jì)出來的負(fù)數(shù)個(gè)數(shù)送并將統(tǒng)計(jì)出來的負(fù)數(shù)個(gè)數(shù)送NUM單元。(單元。(P145)XOR BL,BL;存放負(fù)數(shù)的個(gè)數(shù)存放負(fù)數(shù)的個(gè)數(shù)MOV CX,100;統(tǒng)計(jì)次數(shù)統(tǒng)計(jì)次數(shù)LEA SI,BUFFERCLDNEXT: LODSB;取一個(gè)數(shù)取一個(gè)數(shù)TEST AL,80HJZ GOONINC BLGOON:LOOP NEXT;是負(fù)數(shù),計(jì)數(shù)器加是負(fù)數(shù),計(jì)數(shù)器加1MOV NUM,BL4.4.4 4.4.4 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì)4.4.5 4.4.5 子程序設(shè)計(jì)子程序設(shè)計(jì)例例4-16從一個(gè)字符串刪去一個(gè)

55、字符。從一個(gè)字符串刪去一個(gè)字符。DATASEGMENTSTRING DB ExxperinceLENGTHDW $_STRINGKEYDB XDATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAMAINPROC FARSTART:MOV AX,DATAMOV DS,AXLEA BX,STRING多余的多余的字符字符LEA CX,LENGTHPUSH BXPUSH CXMOV AL,KEYCALL DELCHARMOV AH,4CHINT 21HMAINENDPDELCHARPROCPUSH BPMOV BP,SPPUSH SIPUSH DIPUSH CX程序執(zhí)行時(shí)

56、堆棧最滿時(shí)的狀態(tài)程序執(zhí)行時(shí)堆棧最滿時(shí)的狀態(tài)4.4.5 4.4.5 子程序設(shè)計(jì)子程序設(shè)計(jì)CLDMOV SI,BP4MOV CX,SIMOV DI ,BP6REPNE SCASBJNE DONEMOV SI,BP4 DEC WORDPTRSIMOV SI,DIDEC DIREP MOVSBDONE: POPCX POPDI POPSI POPBP RET4DELCHAR ENDPCODE ENDS ENDSTART4.4.5 4.4.5 子程序設(shè)計(jì)子程序設(shè)計(jì)例例4-18當(dāng)當(dāng)I/O狀態(tài)端口狀態(tài)端口0378H的的Bit1為為0時(shí),表示外設(shè)忙;為時(shí),表示外設(shè)忙;為1則表示外則表示外設(shè)可以接收數(shù)據(jù)?,F(xiàn)將當(dāng)

57、前數(shù)據(jù)段中從設(shè)可以接收數(shù)據(jù)。現(xiàn)將當(dāng)前數(shù)據(jù)段中從BUFFER開始的連續(xù)開始的連續(xù)100個(gè)字節(jié)的內(nèi)個(gè)字節(jié)的內(nèi)容從容從I/O數(shù)據(jù)端口數(shù)據(jù)端口03F8H輸出到外設(shè)。輸出到外設(shè)。SENDATAPROC FARPUSH AXPUSH DXPUSH SIPUSH CXLEA SI,BUFFERMOV CL,100AGAIN:MOV DX,378HWAIT:IN AL,DXTEST AL,02HJZ WAIT4.4.5 4.4.5 子程序設(shè)計(jì)子程序設(shè)計(jì)MOVAL,SIMOV DX,3F8HOUT DX,ALINC SIDEC CLJNZAGAINPOP CXPOPSIPOPDXPOP AXRETSENDATA

58、ENDP4.4.5 4.4.5 子程序設(shè)計(jì)子程序設(shè)計(jì)4.54.5常見程序設(shè)計(jì)舉例常見程序設(shè)計(jì)舉例DATA SEGMENTMASC DB 2,6,A,1MBIN DB 2 DUP(?)(?) DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATABEGIN: MOV AX,DATA MOV DS,AX MOV CL,4 MOV CH,CL LEA SI,MASC CLD 例例4-194-19把把ASCIIASCII碼形式表示的數(shù)轉(zhuǎn)換為二進(jìn)制碼。碼形式表示的數(shù)轉(zhuǎn)換為二進(jìn)制碼。 ASCIIASCII碼存放碼存放在以在以MASCMASC為首地址的內(nèi)存單元中,轉(zhuǎn)換結(jié)果放為

59、首地址的內(nèi)存單元中,轉(zhuǎn)換結(jié)果放MBINMBIN。 XOR AX,AX XOR DX,DXNEXT1: LODS MASC AND AL,7FH CMP AL,0 JL ERROR CMP AL,9 JG NEXT2 SUB AL,30H JMP SHORT NEXT3NEXT2:CMP AL,A JL ERROR CMP AL,F(xiàn)4.54.5常見程序設(shè)計(jì)舉例常見程序設(shè)計(jì)舉例 JG ERROR SUB AL,37HNEXT3:OR DL,AL ROR DX,CL DEC CH JNZ NEXT1 MOV WORD PTR MBIN,DX MOV AH,4CH INT 21HCODE ENDS E

60、DN BEGIN4.54.5常見程序設(shè)計(jì)舉例常見程序設(shè)計(jì)舉例例例4-20把存放在把存放在BUFF中的中的16位二進(jìn)制數(shù)轉(zhuǎn)換為位二進(jìn)制數(shù)轉(zhuǎn)換為ASCII表示的表示的等值數(shù)字字符串。例如等值數(shù)字字符串。例如FFFFH轉(zhuǎn)換成等值的數(shù)字字符串轉(zhuǎn)換成等值的數(shù)字字符串65535。DATA SEGMENTBUFF DW 4FB6HASCC DB 5 DUP(?)(?) DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,5 LEA DI,ASCC XOR DX,DX MOV BX,0AH4.54.5常見

溫馨提示

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

評論

0/150

提交評論