




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第三章 匯編語言程序設(shè)計(jì) 匯編語言是一種以匯編語言是一種以處理器指令系統(tǒng)處理器指令系統(tǒng)為基礎(chǔ)的為基礎(chǔ)的低級程序設(shè)計(jì)語言。低級程序設(shè)計(jì)語言。 匯編語言的主要優(yōu)點(diǎn)是匯編語言的主要優(yōu)點(diǎn)是可以直接、有效地控制計(jì)算機(jī)可以直接、有效地控制計(jì)算機(jī)硬件硬件,容易創(chuàng)建代碼序列容易創(chuàng)建代碼序列短小短小、運(yùn)行、運(yùn)行快速快速的程序。的程序。第三章學(xué)習(xí)內(nèi)容 匯編語言源程序格式匯編語言源程序格式 常量、變量常量、變量 匯編語言程序設(shè)計(jì)方法匯編語言程序設(shè)計(jì)方法 順序程序設(shè)計(jì)順序程序設(shè)計(jì) 分支程序設(shè)計(jì)分支程序設(shè)計(jì) 循環(huán)程序設(shè)計(jì)循環(huán)程序設(shè)計(jì) 子程序設(shè)計(jì)子程序設(shè)計(jì)匯編語言源程序格式 源程序可包含若干個(gè)源程序可包含若干個(gè)代碼段代碼
2、段/數(shù)據(jù)段數(shù)據(jù)段/附加段附加段/堆棧段堆棧段段與段之間的順序可隨意排列段與段之間的順序可隨意排列 獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段獨(dú)立運(yùn)行的程序必須包含一個(gè)代碼段并在代碼段中指示程序執(zhí)行的起始點(diǎn)并在代碼段中指示程序執(zhí)行的起始點(diǎn)一個(gè)程序只有一個(gè)起始點(diǎn)一個(gè)程序只有一個(gè)起始點(diǎn) 執(zhí)行性語句必須位于某一個(gè)代碼段內(nèi)執(zhí)行性語句必須位于某一個(gè)代碼段內(nèi)說明性語句可根據(jù)需要位于任一段內(nèi)說明性語句可根據(jù)需要位于任一段內(nèi)執(zhí)行性語句格式 用于表達(dá)處理器指令用于表達(dá)處理器指令( (也稱為硬指令也稱為硬指令) )匯編后對應(yīng)一條指令代碼匯編后對應(yīng)一條指令代碼 標(biāo)號:硬指令助記符標(biāo)號:硬指令助記符 操作數(shù),操作數(shù)操作數(shù),操作數(shù)
3、 ;注釋;注釋 NEXTNEXT:MOV AXMOV AX,1234H 1234H ;初值為;初值為1234H1234H說明性語句格式 用于表達(dá)偽指令用于表達(dá)偽指令指示源程序如何匯編、變量怎樣定義、過程怎指示源程序如何匯編、變量怎樣定義、過程怎么設(shè)置等么設(shè)置等 名字名字 偽指令助記符偽指令助記符 參數(shù),參數(shù),參數(shù),參數(shù),;注釋;注釋 X1 DB 12HX1 DB 12H,34H34H,56H56H;標(biāo)識符 標(biāo)識符最多由標(biāo)識符最多由3131個(gè)字母個(gè)字母、數(shù)字及規(guī)定的特殊符、數(shù)字及規(guī)定的特殊符號(如號(如_ _、$ $、? ?、 )組成,不能以數(shù)字開頭。)組成,不能以數(shù)字開頭。 默認(rèn)情況下,不區(qū)別
4、標(biāo)識符中的字母默認(rèn)情況下,不區(qū)別標(biāo)識符中的字母大小寫大小寫。 一個(gè)源程序中,每個(gè)標(biāo)識符的一個(gè)源程序中,每個(gè)標(biāo)識符的定義是唯一定義是唯一的,的,且不能是匯編系統(tǒng)所采用的保留字。且不能是匯編系統(tǒng)所采用的保留字。簡化段定義格式 .MODEL SMALL .MODEL SMALL ;定義程序的存儲模式定義程序的存儲模式 .STACK .STACK ;定義堆棧段定義堆棧段 .DATA.DATA ;定義數(shù)據(jù)段定義數(shù)據(jù)段 ;數(shù)據(jù)定義數(shù)據(jù)定義 .CODE .CODE ;定義代碼段定義代碼段START: MOV AX, DATA START: MOV AX, DATA ;程序執(zhí)行起始;程序執(zhí)行起始 MOV DS
5、, AXMOV DS, AX ;給給DSDS賦值賦值 ;主程序主程序 MOV AH, 4C00HMOV AH, 4C00H INT 21H INT 21H ;程序執(zhí)行結(jié)束程序執(zhí)行結(jié)束 ;子程序子程序 END START END START ;匯編結(jié)束匯編結(jié)束簡化段定義格式.MODEL SMALL .MODEL SMALL ;定義程序的存儲模式;定義程序的存儲模式.STACK.STACK ;定義堆棧段;定義堆棧段.DATA.DATA ;定義數(shù)據(jù)段;定義數(shù)據(jù)段 ;數(shù)據(jù)定義;數(shù)據(jù)定義.CODE.CODE ;定義代碼段;定義代碼段.STARTUP.STARTUP ;程序執(zhí)行起始;程序執(zhí)行起始 ;主程序
6、;主程序.EXIT.EXIT ;程序執(zhí)行結(jié)束;程序執(zhí)行結(jié)束 ;子程序;子程序 ENDEND ;匯編結(jié)束;匯編結(jié)束存儲模式TINYTINY微型模式微型模式SMALLSMALL小型模式小型模式COMPACTCOMPACT緊湊模式緊湊模式MEDIUMMEDIUM中型模式中型模式LARGELARGE大型模式大型模式HUGEHUGE巨型模式巨型模式FLATFLAT平坦模式平坦模式微型和小型模式 TINYTINY微型模式微型模式只有一個(gè)小于只有一個(gè)小于64KB64KB的邏輯段的邏輯段 SMALLSMALL小型模式小型模式一個(gè)代碼段、一個(gè)數(shù)據(jù)段,每個(gè)段不大于一個(gè)代碼段、一個(gè)數(shù)據(jù)段,每個(gè)段不大于64KB64K
7、B定義堆棧段 .STACK .STACK 大小大小 段名:段名:STACKSTACK可用可用STACKSTACK預(yù)定義操作符表示。預(yù)定義操作符表示。 默認(rèn)是默認(rèn)是1KB1KB空間??臻g。定義數(shù)據(jù)段 .DATA.DATA 段名:段名:_DATA_DATA可用可用DATADATA預(yù)定義操作符表示預(yù)定義操作符表示定義代碼段 .CODE .CODE 段名段名 默認(rèn)段名:默認(rèn)段名:_TEXT_TEXT可用可用CODECODE預(yù)定義操作符表示預(yù)定義操作符表示執(zhí)行開始 語句語句.STARTUP.STARTUP指明程序開始執(zhí)行的位置,同時(shí)指明程序開始執(zhí)行的位置,同時(shí)將數(shù)據(jù)段地址賦給將數(shù)據(jù)段地址賦給DSDS。
8、可用如下兩條語句代替可用如下兩條語句代替.STARTUP.STARTUP語句。語句。STARTSTART:MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX 語句標(biāo)號語句標(biāo)號STARTSTART用于指明程序開始執(zhí)行的位置。用于指明程序開始執(zhí)行的位置。執(zhí)行結(jié)束 語句語句.EXIT.EXIT終止應(yīng)用程序執(zhí)行終止應(yīng)用程序執(zhí)行。 語句語句.EXIT.EXIT利用利用4CH4CH號號DOSDOS系統(tǒng)功能調(diào)用實(shí)現(xiàn)。系統(tǒng)功能調(diào)用實(shí)現(xiàn)。MOV AHMOV AH,4CH4CHINT 21HINT 21H匯編結(jié)束 語句語句ENDEND表示匯編過程到此結(jié)束。表示匯編過程到此結(jié)束。源程序
9、的最后必須有一條源程序的最后必須有一條ENDEND語句語句。 匯編程序不處理匯編程序不處理ENDEND語句之后的任何內(nèi)容語句之后的任何內(nèi)容。 ENDEND偽指令后面可以有一個(gè)標(biāo)號參數(shù),偽指令后面可以有一個(gè)標(biāo)號參數(shù),指定程序開始執(zhí)行的起點(diǎn)。指定程序開始執(zhí)行的起點(diǎn)。END STARTEND START常量、變量 常量表示一個(gè)固定的數(shù)值。常量表示一個(gè)固定的數(shù)值??捎米饔仓噶畹牧⒓磾?shù)操作數(shù)或偽指令的參數(shù)。有可用作硬指令的立即數(shù)操作數(shù)或偽指令的參數(shù)。有常數(shù)常數(shù)/字符串字符串/符號常量符號常量/數(shù)值表達(dá)式數(shù)值表達(dá)式等多種形式。等多種形式。 變量實(shí)質(zhì)上是指內(nèi)存單元的數(shù)據(jù)。變量實(shí)質(zhì)上是指內(nèi)存單元的數(shù)據(jù)。主要用
10、作存儲器操作數(shù)。主要用作存儲器操作數(shù)。常數(shù) 常數(shù)是指由各種進(jìn)制形式表示的數(shù)值。常數(shù)是指由各種進(jìn)制形式表示的數(shù)值。默認(rèn)為十進(jìn)制。默認(rèn)為十進(jìn)制。 MOV AXMOV AX,1234H1234HADD ALADD AL,-77-77CMP AHCMP AH,10010001B10010001B字符串 字符串是指:字符串是指:用單引號或雙引號括起來的單個(gè)或多個(gè)字符,用單引號或雙引號括起來的單個(gè)或多個(gè)字符,其數(shù)值是每個(gè)字符對應(yīng)的其數(shù)值是每個(gè)字符對應(yīng)的ASCIIASCII碼。碼。 例如:例如:d= 64Hd= 64H、AB= 4142HAB= 4142H MOV ALMOV AL, A A MOV ALM
11、OV AL, 41H 41H符號常量 符號常量是使用標(biāo)識符表達(dá)一個(gè)固定的數(shù)值。符號常量是使用標(biāo)識符表達(dá)一個(gè)固定的數(shù)值。 符號名符號名 EQU EQU 數(shù)值數(shù)值表達(dá)式表達(dá)式符號名符號名 EQU EQU 符號名符號名 數(shù)值數(shù)值表達(dá)式表達(dá)式 EQUEQU不能重復(fù)不能重復(fù)定義符號名,定義符號名,“”則允許。則允許。 符號常量可以提高程序的可讀性。符號常量可以提高程序的可讀性。符號常量示例 COUNT EQU 100COUNT EQU 100DOSCALL EQU DOSCALL EQU MOV CXMOV CX,COUNT COUNT ;MOV CXMOV CX,100100 MOV AHMOV AH
12、, 01H 01H DOSCALL DOSCALL ;INT 21HINT 21H數(shù)值表達(dá)式 數(shù)值表達(dá)式一般是指:數(shù)值表達(dá)式一般是指:由運(yùn)算符連接的由運(yùn)算符連接的各種各種常數(shù)常數(shù)所構(gòu)成的表達(dá)式。所構(gòu)成的表達(dá)式。 數(shù)值表達(dá)式可增強(qiáng)程序的可讀性。數(shù)值表達(dá)式可增強(qiáng)程序的可讀性。 運(yùn)算符有:運(yùn)算符有:算術(shù)算術(shù)操作符操作符/ /邏輯邏輯操作符操作符/ /移位移位操作符操作符/ /關(guān)系關(guān)系操作符。操作符。運(yùn)算符(1) 算術(shù)運(yùn)算符:算術(shù)運(yùn)算符:+ +、* *、/ /、MODMOD 邏輯運(yùn)算符:邏輯運(yùn)算符:ANDAND、OROR、XORXOR、NOTNOT運(yùn)算符(2) 移位運(yùn)算符:移位運(yùn)算符:SHLSHL、S
13、HRSHR其格式為:數(shù)值表達(dá)式其格式為:數(shù)值表達(dá)式 SHL/SHR SHL/SHR 移位次數(shù)移位次數(shù) 關(guān)系運(yùn)算符:關(guān)系運(yùn)算符:EQEQ、NENE、GTGT、LTLT、GEGE、LELE用用FFFFHFFFFH表示條件為真,表示條件為真,用用0000H0000H表示條件為假。表示條件為假。數(shù)值表達(dá)式示例ADD AXADD AX,100100* *4+2 4+2 ;ADD AXADD AX,402402OR ALOR AL,3 AND 47H 3 AND 47H ;OR ALOR AL,3 3 MOV AXMOV AX,1024 SHR 4 1024 SHR 4 ;MOV AXMOV AX,40H
14、40HMOV AXMOV AX,1234H GT 1024H 1234H GT 1024H ;MOV AXMOV AX,0FFFFH0FFFFH變量的定義 變量實(shí)質(zhì)上是指內(nèi)存單元的數(shù)據(jù),變量實(shí)質(zhì)上是指內(nèi)存單元的數(shù)據(jù),因而可以改變。因而可以改變。 變量需要事先定義才能使用。變量需要事先定義才能使用。 變量定義方法:變量定義方法:變量名變量名 偽指令偽指令 初值表初值表變量名 變量名變量名是是用戶自定義用戶自定義的標(biāo)識符,的標(biāo)識符,用來表示該變量所占用的內(nèi)存單元的用來表示該變量所占用的內(nèi)存單元的首地址首地址。 一個(gè)變量可以沒有變量名一個(gè)變量可以沒有變量名。 這種情況匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g。
15、這種情況匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g。設(shè)置變量名是為了方便存取它指示的存儲單元。設(shè)置變量名是為了方便存取它指示的存儲單元。變量定義偽指令 變量定義偽指令為變量分配或變量定義偽指令為變量分配或預(yù)留內(nèi)存單元預(yù)留內(nèi)存單元。DB DB :定義:定義 字節(jié)字節(jié) 偽指令偽指令DW DW :定義:定義 字字 偽指令偽指令DD DD :定義:定義 雙字雙字 偽指令偽指令DF DF :定義:定義 3 3 字字 偽指令偽指令DQ DQ :定義:定義 4 4 字字 偽指令偽指令DT DT :定義:定義 1010字節(jié)偽指令字節(jié)偽指令初值表 初值表是用逗號分隔的參數(shù),初值表是用逗號分隔的參數(shù),是用戶為所申請的內(nèi)存單元
16、賦的初值。是用戶為所申請的內(nèi)存單元賦的初值。 初值表主要由常量或?等組成。初值表主要由常量或?等組成。其中?表示初值不確定,即未賦初值。其中?表示初值不確定,即未賦初值。若多個(gè)存儲單元初值相同,可用若多個(gè)存儲單元初值相同,可用DUPDUP進(jìn)行定義。進(jìn)行定義。復(fù)制操作符DUP重復(fù)次數(shù)重復(fù)次數(shù) DUP (DUP (重復(fù)參數(shù)重復(fù)參數(shù)) )X1 DB 3 DUP (12H)X1 DB 3 DUP (12H)X1 DB 12HX1 DB 12H,12H12H,12H12HY1 DB 34H,56,01100001B,ABY1 DB 34H,56,01100001B,AB變量的定位 ORG ORG 參數(shù)參
17、數(shù) ;偏移地址為該參數(shù)值;偏移地址為該參數(shù)值 EVENEVEN ;從偶地址開始;從偶地址開始 ALIGN nALIGN n ;從;從n n的整數(shù)倍地址開始的整數(shù)倍地址開始 $ $ ;表示當(dāng)前偏移地址值;表示當(dāng)前偏移地址值變量名和語句標(biāo)號的屬性邏輯地址邏輯地址屬性:屬性:變量名和標(biāo)號對應(yīng)的存儲單元的變量名和標(biāo)號對應(yīng)的存儲單元的邏輯地址邏輯地址,含有段地址和偏移地址。含有段地址和偏移地址。類型類型屬性:屬性:變量名的類型可以是變量名的類型可以是BYTE/WORD/DWORDBYTE/WORD/DWORD標(biāo)號標(biāo)號( (段名段名/ /子程序名子程序名) )的類型可以是的類型可以是NEAR/FARNEA
18、R/FARSTAR: MOV AX, 1234HSTAR: MOV AX, 1234HSTAR DB 32H,76,10111011B,ASSTAR DB 32H,76,10111011B,AS地址操作符 OFFSET OFFSET 變量名變量名/ /標(biāo)號標(biāo)號返回變量名或標(biāo)號的返回變量名或標(biāo)號的偏移地址偏移地址 SEG SEG 變量名變量名/ /標(biāo)號標(biāo)號返回變量名或標(biāo)號的返回變量名或標(biāo)號的段地址段地址類型操作符1 類型名類型名 PTR PTR 變量名變量名/ /標(biāo)號標(biāo)號將變量名將變量名/ /標(biāo)號按指定類型使用標(biāo)號按指定類型使用類型操作符PTR用法示例 VARW DW 1234HVARW DW
19、1234HMOV AXMOV AX,WORD PTR VARW WORD PTR VARW ;AX=1234HAX=1234HMOV BLMOV BL,BYTE PTR VARW BYTE PTR VARW ;BL=34HBL=34HMOV BHMOV BH,BYTE PTR VARW+1BYTE PTR VARW+1;BH=12HBH=12H MOV WORD PTR BXMOV WORD PTR BX,1 1 ;字傳送;字傳送MOV BYTE PTR BXMOV BYTE PTR BX,1 1 ;字節(jié)傳送;字節(jié)傳送 THIS 類型名類型名創(chuàng)建位于當(dāng)前地址但為指定類型的操作數(shù)創(chuàng)建位于當(dāng)前地址
20、但為指定類型的操作數(shù)類型名可為類型名可為BYTE/WORD/DWORD,或者,或者NEAR/FAR類型操作符THIS用法示例 MYBYTE EQU THIS BYTEMYBYTE EQU THIS BYTEMYWORD DW 1234HMYWORD DW 1234HMOV AXMOV AX, MYWORD MYWORD ;AX=1234HAX=1234HMOV BLMOV BL, MYBYTE MYBYTE ;BL=34HBL=34H MYWORD DW 1234HMYWORD DW 1234HMYBYTE1 EQU BYTE PTR MYWORDMYBYTE1 EQU BYTE PTR MY
21、WORDMYBYTE2 EQU BYTE PTR MYWORD+1MYBYTE2 EQU BYTE PTR MYWORD+1類型操作符2 TYPE TYPE 變量名變量名/ /標(biāo)號;標(biāo)號;返回一個(gè)數(shù)值返回一個(gè)數(shù)值,表明名字,表明名字/ /標(biāo)號的類型。標(biāo)號的類型。字節(jié)字節(jié)/ /字字/ /雙字變量返回雙字變量返回1/2/41/2/4。短短/ /近近/ /遠(yuǎn)標(biāo)號為返回遠(yuǎn)標(biāo)號為返回FF01H/FF02H/FF05HFF01H/FF02H/FF05H。 LENGTHOF LENGTHOF 變量名;返回整個(gè)變量的數(shù)據(jù)項(xiàng)數(shù)。變量名;返回整個(gè)變量的數(shù)據(jù)項(xiàng)數(shù)。 SIZEOF SIZEOF 變量名;返回整個(gè)變量占
22、用的字節(jié)數(shù)。變量名;返回整個(gè)變量占用的字節(jié)數(shù)。TYPE/LENGTHOF/SIZEOF用法示例 VARW DW 1234HVARW DW 1234H,5678H5678HVARD DD 12345678HVARD DD 12345678HBUFF DB HELLOBUFF DB HELLO MOV AXMOV AX,TYPE VARW TYPE VARW ;AX=2AX=2MOV BXMOV BX,LENGTHOF VARDLENGTHOF VARD;BX=1BX=1MOV CXMOV CX,SIZEOF BUFF SIZEOF BUFF ;CX=5CX=5變量和常量應(yīng)用舉例 例3.2 .MO
23、DEL SMALL.STACK.DATA bvar1 db 100, 01100100b, 64h, d minit =5 bvar2 db -1, minit, minit+5 db ?, 2 dup(20h) wvar1 dw 2010h, 4*4 wvar2 dw ? dvar dd 12347777h, 87651111h, ? abc db a, b, c, ?maxint equ 0ah string db ABCDEFGHIJ crifs db 13, 10, $ array1 dw maxint dup(0) array db 2 dup(2,3,2 dup(4).CODEst
24、art: mov ax, data mov ds, ax mov dl, bvar1 dec bvar2+1 mov abc3, dl mov ax, word ptr dvar0 mov dx, word ptr dvar2 add ax, word ptr dvar4 adc dx, word ptr dvar6 mov word ptr dvar8, ax mov word ptr dvar10, dx mov cx, maxint mov bx, 0again: add stringbx, 3 inc bx loop again lea dx, abc mov ah, 09h int
25、21h mov ax, 4C00h int 21h end start屬性及應(yīng)用舉例屬性及應(yīng)用舉例 例3.3 .MODEL SMALL.STACK.DATA v_byte equ this byte v_word dw 3332h, 3735h target dw 5 dup(20h) crlf db 0dh, 0ah, $ flag db 0 n_point dw offset s_label .CODEstart: mov ax, data mov ds, ax mov al, byte ptr v_word dec al mov v_byte, al n_label: cmp flag,
26、 1 jz s_label inc flag jmp short n_label s_label: cmp flag, 2jz nextinc flagjmp n_point next: mov ax, type v-word mov cx, lengthof target mov si, offset target w_again: mov si, ax inc si inc siloop w_againmov cx, sizeof targetmov al, ?mov di, offset target b_again: mov di, alinc diloop b_againmov dx
27、, offset v_wordmov ah, 9int 21h mov ax, 4C00h int 21h end start程序設(shè)計(jì)順序程序設(shè)計(jì)Hello! .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA MESSAGE DB HELLO MESSAGE DB HELLO!,0DH0DH,0AH0AH,$.CODE.CODE.STARTUP.STARTUP MOV AH MOV AH,09H09H MOV DX MOV DX,OFFSET MESSAGEOFFSET MESSAGE INT 21H INT 21H.EXIT.EXIT END E
28、ND例例3.4 采用查表法,實(shí)現(xiàn)一位采用查表法,實(shí)現(xiàn)一位16進(jìn)進(jìn)制數(shù)轉(zhuǎn)換為制數(shù)轉(zhuǎn)換為ASCII 碼顯示碼顯示.model small.stack.data ASCII db 30h,31h,32h,33h,34h,35h,36h,37h db 38h,39h,41h,42h,43h,44h,45h,46h hex db 04h, 0bh .code start: mov ax, data mov ds, ax mov bx, offset ASCIImov al, hexand al, 0fhxlatmov dl, almov ah, 2int 21hmov al, hex+1 and al,
29、 0fh xlatmov dl, al mov ah, 2int 21h mov ax, 4C00h int 21h end start分支程序設(shè)計(jì)分支程序設(shè)計(jì) 分支程序的基本特征是其中含有分支程序的基本特征是其中含有條件轉(zhuǎn)條件轉(zhuǎn)移指令或無條件轉(zhuǎn)移移指令或無條件轉(zhuǎn)移指令。指令。分支程序舉例 比較無符號數(shù)的大小比較無符號數(shù)的大小 A1、B1無符號數(shù)比較大小1.MODEL SMALL.MODEL SMALL.STACK.STACK.DATA.DATA A1 DW 9676H A1 DW 9676H B1 DW 6769H B1 DW 6769H E1 E1 DB AB, $DB AB, $ E2
30、E2 DB AB, $DB AB, $ E3 E3 DB A=B, $DB A=B, $無符號數(shù)比較大小2.CODE.CODE.STARTUP.STARTUP MOV AX,A1 L1: MOV DX,OFFSET E3 MOV AX,A1 L1: MOV DX,OFFSET E3 CMP AX,B1 JMP L3 CMP AX,B1 JMP L3 JB L2 L2: MOV DX,OFFSET E2 JB L2 L2: MOV DX,OFFSET E2 JZ L1 L3: MOV AH,9 JZ L1 L3: MOV AH,9 MOV DX,OFFSET E1 INT 21H MOV DX,
31、OFFSET E1 INT 21H JMP L3 JMP L3 .EXIT.EXIT ENDEND循環(huán)程序設(shè)計(jì)循環(huán)次數(shù)的控制 計(jì)數(shù)計(jì)數(shù)控制法:用于循環(huán)次數(shù)已知的情況。又可分控制法:用于循環(huán)次數(shù)已知的情況。又可分為正計(jì)數(shù)法和倒計(jì)數(shù)法。為正計(jì)數(shù)法和倒計(jì)數(shù)法。 條件條件控制法:用于循環(huán)次數(shù)未知的情況,或者雖控制法:用于循環(huán)次數(shù)未知的情況,或者雖然次數(shù)已知,但有可能提前結(jié)束循環(huán)的情況。然次數(shù)已知,但有可能提前結(jié)束循環(huán)的情況。計(jì)數(shù)控制循環(huán)循環(huán)初始化循環(huán)初始化循環(huán)修改部分循環(huán)修改部分循環(huán)體循環(huán)體計(jì)數(shù)控制條件計(jì)數(shù)控制條件Y YN N 例:無符號字?jǐn)?shù)組的最大最小值,要求把無符號字?jǐn)?shù)組的最大最小值,要求把最大值
32、放入字變量最大值放入字變量A1A1,最小值放入,最小值放入B1.B1. 無符號字?jǐn)?shù)組的最大最小值1 .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA W1 DW W1 DW 533,0A6H,77,A,20,-1533,0A6H,77,A,20,-1 A1 DW ? A1 DW ? B1 DW ? B1 DW ?無符號字?jǐn)?shù)組的最大最小值2 .CODE .CODE .STARTUP .STARTUP MOV CX,5 JAE L3 MOV CX,5 JAE L3 LEA BX,W1 MOV DX,BX+2 LEA BX,W1 MOV DX,BX+2
33、MOV AX,BX L3: ADD BX,2 MOV AX,BX L3: ADD BX,2 MOV DX,BX; MOV DX,BX;小小 LOOP L1LOOP L1L1: CMP AX,BX+2 MOV A1,AX L1: CMP AX,BX+2 MOV A1,AX JBE L2 MOV B1,DX JBE L2 MOV B1,DX MOV AX,BX+2 .EXIT MOV AX,BX+2 .EXITL2: CMP DX,BX+2 L2: CMP DX,BX+2 ENDEND條件控制循環(huán)之先循環(huán)后判斷循環(huán)初始化循環(huán)初始化循環(huán)修改部分循環(huán)修改部分循環(huán)體循環(huán)體循環(huán)條件滿足循環(huán)條件滿足Y YN
34、 N條件控制循環(huán)之先判斷后循環(huán)循環(huán)初始化循環(huán)初始化循環(huán)修改部分循環(huán)修改部分循環(huán)體循環(huán)體循環(huán)條件滿足循環(huán)條件滿足Y YN N剔除以$結(jié)尾的結(jié)尾的字符串中的空格字符1 .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA S1 DB Let us have a try !$ S1 DB Let us have a try !$.CODE.CODE.STARTUP.STARTUP MOV DX, OFFSET S1 MOV DX, OFFSET S1 MOV DI, OFFSET S1 MOV DI, OFFSET S1剔除以$結(jié)尾的結(jié)尾的字符串中的空格字符
35、2L1: MOV AL,DI MOV BH,SI L1: MOV AL,DI MOV BH,SI CMP AL,$ CMP BH,$ CMP AL,$ CMP BH,$ JZ L4 JNZ L2 JZ L4 JNZ L2 CMP AL,20H JMP L1 CMP AL,20H JMP L1 JNZ L3 L3: INC DI JNZ L3 L3: INC DI MOV SI,DI JMP L1 MOV SI,DI JMP L1 L2: INC SI L4: MOV AH,09L2: INC SI L4: MOV AH,09 MOV AH,SI INT 21H MOV AH,SI INT 21
36、H MOV SI-1,AH .EXIT MOV SI-1,AH .EXIT END END例例:統(tǒng)計(jì):統(tǒng)計(jì)AX寄存器中寄存器中1的個(gè)數(shù),并將結(jié)果存放在的個(gè)數(shù),并將結(jié)果存放在CL寄寄存器中。存器中。(3.11) MOV CL,0 L: AND AX,AX JZ EXIT SAL AX,1 ;將;將AX中的最高位移入中的最高位移入CF中中 JNC L ;如果;如果CF=0,轉(zhuǎn),轉(zhuǎn)L INC CL ;如果;如果CF=1,則(,則(CL)+1CL JMP L ;轉(zhuǎn);轉(zhuǎn)L處繼續(xù)循環(huán)處繼續(xù)循環(huán) EXIT:子程序設(shè)計(jì) 子程序,是指能完成一定功能的指令序列。子程序,是指能完成一定功能的指令序列。調(diào)用子程序使用
37、調(diào)用子程序使用CALLCALL指令,指令,從子程序返回使用從子程序返回使用RETRET指令。指令。 子程序的基本特征是其中一定含有子程序的基本特征是其中一定含有RETRET指令。指令。保護(hù)斷點(diǎn) 執(zhí)行執(zhí)行CALLCALL指令時(shí)指令時(shí)IP(IP(或或CS:IP)CS:IP)的值是的值是CALLCALL指令指令后面一條指令的地址,此即斷點(diǎn)。后面一條指令的地址,此即斷點(diǎn)。 在轉(zhuǎn)入子程序前應(yīng)將斷點(diǎn)在轉(zhuǎn)入子程序前應(yīng)將斷點(diǎn)( (地址地址) )保存到堆棧。保存到堆棧。這是由這是由CALLCALL指令自動完成的。指令自動完成的。 當(dāng)子程序執(zhí)行完成后,斷點(diǎn)當(dāng)子程序執(zhí)行完成后,斷點(diǎn)( (地址地址) )應(yīng)從堆棧中應(yīng)從
38、堆棧中彈出恢復(fù)到彈出恢復(fù)到IP(IP(或或CS:IP)CS:IP)中,以便能從子程序中,以便能從子程序返回到主程序。這是由返回到主程序。這是由RETRET指令自動完成的。指令自動完成的。保存現(xiàn)場 所謂現(xiàn)場,主要是指在調(diào)用子程序之前的有關(guān)所謂現(xiàn)場,主要是指在調(diào)用子程序之前的有關(guān)寄存器的內(nèi)容。寄存器的內(nèi)容。 若子程序使用的某個(gè)寄存器的內(nèi)容對主程序而若子程序使用的某個(gè)寄存器的內(nèi)容對主程序而言是不能被破壞的,則必須在子程序的入口處言是不能被破壞的,則必須在子程序的入口處將該寄存器的內(nèi)容保存到堆棧將該寄存器的內(nèi)容保存到堆棧( (或其他地方或其他地方) ),并在子程序的出口處從堆棧并在子程序的出口處從堆棧
39、( (或其他地方或其他地方) )恢復(fù)恢復(fù)相應(yīng)的內(nèi)容到原來的寄存器中。相應(yīng)的內(nèi)容到原來的寄存器中。主程序和子程序的參數(shù)傳遞 主程序在調(diào)用子程序時(shí),通常要傳遞一些原始主程序在調(diào)用子程序時(shí),通常要傳遞一些原始數(shù)據(jù)給子程序,這些數(shù)據(jù)稱為子程序的入口參數(shù)據(jù)給子程序,這些數(shù)據(jù)稱為子程序的入口參數(shù);數(shù); 子程序在返回主程序時(shí),也常要傳遞一些處理子程序在返回主程序時(shí),也常要傳遞一些處理結(jié)果給主程序,這些數(shù)據(jù)稱為子程序的出口參結(jié)果給主程序,這些數(shù)據(jù)稱為子程序的出口參數(shù)。數(shù)。參數(shù)傳遞方法 參數(shù)傳遞有三種方法:參數(shù)傳遞有三種方法:通過寄存器傳遞通過寄存器傳遞通過存儲單元傳遞通過存儲單元傳遞通過堆棧傳遞通過堆棧傳遞子
40、程序的嵌套與遞歸 在子程序中又調(diào)用其他的子程序,稱為子程在子程序中又調(diào)用其他的子程序,稱為子程序的嵌套調(diào)用。序的嵌套調(diào)用。 在子程序中調(diào)用其自身,稱為子程序的遞歸在子程序中調(diào)用其自身,稱為子程序的遞歸調(diào)用。調(diào)用。堆棧在子程序中的作用 堆棧在子程序的使用中有重要的作用:堆棧在子程序的使用中有重要的作用:主程序中可能使用堆棧傳遞入口參數(shù)主程序中可能使用堆棧傳遞入口參數(shù)主程序執(zhí)行主程序執(zhí)行CALLCALL指令時(shí)使用堆棧保存斷點(diǎn)指令時(shí)使用堆棧保存斷點(diǎn)子程序在入口處使用堆棧保護(hù)現(xiàn)場子程序在入口處使用堆棧保護(hù)現(xiàn)場子程序中可能進(jìn)行堆棧操作子程序中可能進(jìn)行堆棧操作子程序在出口處從堆棧中恢復(fù)現(xiàn)場子程序在出口處從
41、堆棧中恢復(fù)現(xiàn)場子程序執(zhí)行子程序執(zhí)行RETRET指令將堆棧中的斷點(diǎn)恢復(fù)指令將堆棧中的斷點(diǎn)恢復(fù)調(diào)用完成后主程序從堆棧中彈出出口參數(shù)調(diào)用完成后主程序從堆棧中彈出出口參數(shù)保持堆棧的平衡 子程序中必須保持堆棧的平衡。子程序中必須保持堆棧的平衡。 通常通常PUSHPUSH和和POPPOP指令應(yīng)成對使用。指令應(yīng)成對使用。用子程序完成累加求和A1 .MODEL SMALL .MODEL SMALL.STACK.STACK.DATA.DATA W1 DW 100 DUP (10)W1 DW 100 DUP (10) W3 DW ? W3 DW ?.CODE.CODE.STARTUP.STARTUP LEA BX
42、,W1 LEA BX,W1 MOV CX,LENGTHOF W1 MOV CX,LENGTHOF W1 CALL P1 CALL P1 MOV W3,AX MOV W3,AX.EXIT.EXIT用子程序完成累加求和A2 P1 PROC NEAR P1 PROC NEAR PUSH BX PUSH BX PUSH CX PUSH CX MOV AX,0 MOV AX,0L1: ADD AX,BXL1: ADD AX,BX ADD BX,2 ADD BX,2 LOOP L1 LOOP L1 POP CX POP CX POP BX POP BX RET RETP1 ENDPP1 ENDP ENDE
43、NDread2:cmp al,0 jb read3 cmp al,9 ja read3 sub al,30h ; BX BX乘10sh1 bx,1 mov dx,bxshl bx,lshl bx,l add bx ,dx mov ah, 0 add bx ,ax jmp read1read2:cmp al,0 jb read3 cmp al,9 ja read3 sub al,30h ; BX BX乘乘10shl bx,1 mov dx,bxshl bx,lshl bx,l add bx ,dx mov ah, 0 add bx ,ax jmp read1例3.17 從鍵盤輸入有從鍵盤輸入有符
44、號符號10進(jìn)制數(shù)的子進(jìn)制數(shù)的子程序。程序。;數(shù)據(jù)段count =10array dw count dup(0);代碼段mov cx,count mov bx,offset arrayagain:call readmov bx, axinc bxinc bxcall dpcrlfloop againmov ax,4c00hint 21hreadproc push bx;絕對值;絕對值push cx;符號;符號push dx;中間;中間xor bx,bxxor cx,cxmov ah,1int 21hcmp al,+jz readlcmp al,-jnz read2mov cx,-1read1:m
45、ov ah,1int 21hread3:cmp cx, 0 jz read4 neg bxread4:mov ax, bxpop dxpop cxpop bxretread endpdpcrlf proc push axpush dxmov ah,2mov d1,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlf endpcode endsend start read3:cmp cx, 0 jz read4 neg bxread4:mov ax, bxpop dxpop cxpop bxretread endpdpcrlf proc push axpush dxmov ah,2mov d1,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlf endpend start 例例3.18顯示器輸出有符號顯示器輸出有符號10進(jìn)制數(shù)的子程序進(jìn)制數(shù)的子程序。. Model small.stack.data count=10arraydw 1234, -1234, 0,1,-1 dw 32767,-32768, 5678 dw -5678,9000wtempdw ?mov ah, 2int 21hjmp write5write1
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家庭控制智能系統(tǒng)
- 2025年度安全評價(jià)掛靠項(xiàng)目執(zhí)行合同
- 互聯(lián)網(wǎng)醫(yī)療行業(yè)發(fā)展報(bào)告
- 三農(nóng)村農(nóng)業(yè)發(fā)展規(guī)劃指南
- 智能倉儲整體解決方案
- 監(jiān)控系統(tǒng)項(xiàng)目實(shí)施方案
- 種養(yǎng)結(jié)合生態(tài)循環(huán)農(nóng)業(yè)可行性報(bào)告
- 三農(nóng)村土地流轉(zhuǎn)政策與市場分析報(bào)告
- 分析一個(gè)成功的電商平臺案例探討其成功因素
- 企業(yè)運(yùn)營成本優(yōu)化指南
- 人員轉(zhuǎn)移安置實(shí)施方案(公司重組)
- 養(yǎng)肝護(hù)肝科普課件
- 點(diǎn)修補(bǔ)培訓(xùn)課件
- 統(tǒng)編版六年級語文上冊專項(xiàng) 專題12說明文閱讀-原卷版+解析
- 《京劇的角色》課件
- 《項(xiàng)脊軒志》公開課課件【一等獎】
- 肛腸疾病的預(yù)防與保健
- 情感體驗(yàn)量表DESⅡ-附帶計(jì)分解釋
- 10G409預(yù)應(yīng)力管樁圖集
- 中班安全活動《保護(hù)鼻子》
- 醫(yī)院護(hù)理不良事件月分析總結(jié)表
評論
0/150
提交評論