第三章第10節(jié)匯編程序常用偽指令簡(jiǎn)介_第1頁
第三章第10節(jié)匯編程序常用偽指令簡(jiǎn)介_第2頁
第三章第10節(jié)匯編程序常用偽指令簡(jiǎn)介_第3頁
第三章第10節(jié)匯編程序常用偽指令簡(jiǎn)介_第4頁
第三章第10節(jié)匯編程序常用偽指令簡(jiǎn)介_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章第3章3.10 3.10 匯編程序常用偽指令匯編程序常用偽指令 匯編語言是用指令的助記符、符號(hào)地址、匯編語言是用指令的助記符、符號(hào)地址、標(biāo)號(hào)等書寫程序的語言,用匯編語言編標(biāo)號(hào)等書寫程序的語言,用匯編語言編寫的程序稱為匯編語言源程序。寫的程序稱為匯編語言源程序。把匯編把匯編語言源程序翻譯成機(jī)器語言程序(目標(biāo)語言源程序翻譯成機(jī)器語言程序(目標(biāo)程序)的過程稱為匯編程序)的過程稱為匯編。完成匯編任務(wù)。完成匯編任務(wù)的程序稱為匯編程序。的程序稱為匯編程序。 在基本匯編的基礎(chǔ)上進(jìn)一步允許在源在基本匯編的基礎(chǔ)上進(jìn)一步允許在源程序中把一個(gè)指令序列定義為一條宏指程序中把一個(gè)指令序列定義為一條宏指令的匯編程序

2、叫做宏匯編令的匯編程序叫做宏匯編第3章第3章第3章3.10.1匯編語言的格式例例 3.10.1:用重復(fù)加法的方法實(shí)現(xiàn)乘法運(yùn)算的子程序用重復(fù)加法的方法實(shí)現(xiàn)乘法運(yùn)算的子程序STACK SEGMENT PARA STACK ;堆棧段開始堆棧段開始 DB 64 DUP(?) ;堆棧段空間為;堆棧段空間為100個(gè)字節(jié)個(gè)字節(jié)STACK ENDS ;堆棧段結(jié)束;堆棧段結(jié)束MYDATA SEGMENT PARA STACK ;數(shù)據(jù)段開始;數(shù)據(jù)段開始NUM1 DB 2AH ;數(shù)據(jù)段放的數(shù)據(jù);數(shù)據(jù)段放的數(shù)據(jù)NUM2 DB 78HPRODUPCT DW ? ;數(shù)據(jù)緩沖區(qū);數(shù)據(jù)緩沖區(qū)MYDATA ENDS ;數(shù)據(jù)段結(jié)

3、束;數(shù)據(jù)段結(jié)束MYCODE SEGMENT ;代碼段開始;代碼段開始 ASSUME CS:MYCODE DS:MYDATA ;指明代碼段、數(shù)據(jù)段、;指明代碼段、數(shù)據(jù)段、 SS:STACK ;堆棧段段名;堆棧段段名MYPROC PROC FAR ;定義過程;定義過程 PUSH DS ;DS進(jìn)棧進(jìn)棧 SUB AX,AX ;AX清零清零 PUSH AX ; AX進(jìn)棧進(jìn)棧 MOV AX,SEG MYDATA ;段地址送;段地址送AX MOV DS,AX ; AX送送DS第3章第3章 SUB AX,AX ; AX清零清零 MOV CX,AX ; CX清零清零 MOV CL,NUM2 ;數(shù)據(jù)送數(shù)據(jù)送CL

4、DEC CL ; CL1 MOV AL,NUM1 ;數(shù)據(jù)送;數(shù)據(jù)送ALK: ADD AL, NUM1 ; AL+ NUM1送送AL ADC AH,00H ;進(jìn)位送;進(jìn)位送AH LOOP K ; K循環(huán),次數(shù)由循環(huán),次數(shù)由CX決定決定 MOV PRODUCT ,AX;結(jié)果送;結(jié)果送AX RET ;調(diào)用返回調(diào)用返回MYPROC ENDP ;過程結(jié)束;過程結(jié)束MYCODE ENDS ;代碼段結(jié)束;代碼段結(jié)束 END MYPROC ;程序結(jié)束;程序結(jié)束第3章第3章例4.2假設(shè)LISTA與LISTB為兩個(gè)字類型數(shù)組,將他們各對(duì)應(yīng)相加,其和放在LISTB數(shù)組中,程序設(shè)計(jì)如下: STACK SEGMENT

5、;堆棧段開始堆棧段開始 DW 32H DUP(?) ;堆棧段空間為;堆棧段空間為40個(gè)字個(gè)字STACK ENDS ;堆棧段結(jié)束;堆棧段結(jié)束DSEG SEGMENT ;數(shù)據(jù)段開始;數(shù)據(jù)段開始 LISTA DW 64H DUP(1234H) ;100字的源緩沖區(qū)字的源緩沖區(qū)DSEG ENDS ;數(shù)據(jù)段結(jié)束數(shù)據(jù)段結(jié)束ESEG SEGMENT ;附加段開始;附加段開始 LISTB DW 100 DUP (432H1) ; 100字的目的緩沖區(qū)字的目的緩沖區(qū)ESEG ENDS ;附加段結(jié)束;附加段結(jié)束CSEG SEGMENT ;代碼段開始;代碼段開始 ASSUME CS:CSEG DS:DSEG;指明代

6、碼段、數(shù)據(jù)段段名;指明代碼段、數(shù)據(jù)段段名 ASSUME SS:STACK ES:ESEG ;堆棧段、附加段段名;堆棧段、附加段段名 MAIN PROC ;定義過程;定義過程 0000H B8 9014 MOV AX,DSEG ;數(shù)據(jù)段段地址送;數(shù)據(jù)段段地址送AX 0003H 8ED8 MOV DS, AX ;數(shù)據(jù)段段地址裝入數(shù)據(jù)段段地址裝入DS 0005H B8 9D14 MOV AX, ESEG ;附加段段地址送附加段段地址送AX 0008H 8EC0 MOV ES, AX ;附加段段地址裝入;附加段段地址裝入ES 000AH FC CLD ; 選擇地址增方向選擇地址增方向第3章第3章第3章

7、000BH BE 0000 MOV SI, OFFSET LISTA ; 指向源塊的首地址指向源塊的首地址000EH BF 0000 MOV DI, OFFSET LISTB ; 指向目的塊的首地址指向目的塊的首地址0011H B9 6400 MOV CX,100 ;循環(huán)次數(shù)循環(huán)次數(shù)0014H AD LOP1: LODSW ; LISTA元素送元素送AX0015H 260305 ADD AX,ES:DI ;將將LISTB元素加到元素加到AX0018H AB STOSW ;兩數(shù)之和存入;兩數(shù)之和存入LISTB0019H E2F9 LOOP LOP1 ;循環(huán)至循環(huán)至CX=0001BH B4 4C

8、MOV AH,4CH ;功能調(diào)用號(hào)功能調(diào)用號(hào)4CH送入送入AH001DH CD 21 INT 21H ;程序結(jié)束后返回程序結(jié)束后返回DOS MAIN ENDP ;過程結(jié)束;過程結(jié)束 CSEG ENDS ;代碼段結(jié)束;代碼段結(jié)束 END MAIN ;程序結(jié)束;程序結(jié)束第3章第3章第3章舉例程序得出結(jié)論 (1) 源程序一般由源程序一般由n個(gè)段構(gòu)成,個(gè)段構(gòu)成,理論上講可以有很多,但實(shí)際理論上講可以有很多,但實(shí)際上上8086/8088規(guī)定不超出規(guī)定不超出16段。段。每個(gè)段都以每個(gè)段都以 SEGMEN語句開始,語句開始,以以ENDS語句結(jié)束。程序中第一段稱為語句結(jié)束。程序中第一段稱為STACK(堆棧段)

9、,它(堆棧段),它用來在存儲(chǔ)器的某個(gè)地方建立一個(gè)棧區(qū);第二段稱為用來在存儲(chǔ)器的某個(gè)地方建立一個(gè)棧區(qū);第二段稱為DATA (數(shù)據(jù)段),它在存儲(chǔ)器中放了被乘數(shù),乘數(shù)的數(shù)據(jù),第三段(數(shù)據(jù)段),它在存儲(chǔ)器中放了被乘數(shù),乘數(shù)的數(shù)據(jù),第三段稱為稱為CODE (代碼段),其中包括了許多以符號(hào)表示的指令用(代碼段),其中包括了許多以符號(hào)表示的指令用于實(shí)現(xiàn)乘法運(yùn)算。程序中出現(xiàn)了于實(shí)現(xiàn)乘法運(yùn)算。程序中出現(xiàn)了SEGMEN 、ASSUME偽指令。偽指令。 (2) ASSUME語句可使匯編程序知道語句可使匯編程序知道CS、DS、SS、ES指向指向那個(gè)段地址,它在匯編時(shí)起作用,在運(yùn)行時(shí)那個(gè)段地址,它在匯編時(shí)起作用,在運(yùn)行

10、時(shí)CPU不知道除不知道除CS外外的其他段地址,所以必須在程序中用指令進(jìn)行賦值。的其他段地址,所以必須在程序中用指令進(jìn)行賦值。 (3)所有過程(用)所有過程(用RROC語句定義)必須用過程結(jié)束語句語句定義)必須用過程結(jié)束語句(ENDP)結(jié)束。整個(gè)源程序也必須用結(jié)束語句()結(jié)束。整個(gè)源程序也必須用結(jié)束語句(END)來結(jié))來結(jié)束。束。 匯編程序有三種基本語句構(gòu)成:匯編程序有三種基本語句構(gòu)成:(硬)(硬)指令語句,指令語句,(說明)(說明)偽指令語句,偽指令語句,(說明)(說明)宏指令語句。宏指令語句。 (4)程序開始必須申明(裝入)各段寄存器的值,即各段地址)程序開始必須申明(裝入)各段寄存器的值,

11、即各段地址的值的值第3章第3章第3章一:(硬)指令語句和偽指令語句使使CPU產(chǎn)生動(dòng)作、并在程序執(zhí)產(chǎn)生動(dòng)作、并在程序執(zhí)行時(shí)才處理的語句,就是前面第行時(shí)才處理的語句,就是前面第3章學(xué)習(xí)章學(xué)習(xí)的處理器指令的處理器指令,匯編時(shí)會(huì)生成目標(biāo)代碼,匯編時(shí)會(huì)生成目標(biāo)代碼(Directive)不產(chǎn)生不產(chǎn)生CPU動(dòng)動(dòng)作、在程序執(zhí)行前由匯編程序處理的說明作、在程序執(zhí)行前由匯編程序處理的說明性語句,例如,數(shù)據(jù)說明、變量定義等等性語句,例如,數(shù)據(jù)說明、變量定義等等偽指令與具體的處理器類型無關(guān),但與匯偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān)編程序的版本有關(guān),即;偽指令語句只為,即;偽指令語句只為匯編程序提供匯

12、編時(shí)所需的信息,而本身匯編程序提供匯編時(shí)所需的信息,而本身不會(huì)生成目標(biāo)代碼不會(huì)生成目標(biāo)代碼第3章 執(zhí)行性語句執(zhí)行性語句由硬指令構(gòu)成的語句,它通常對(duì)應(yīng)由硬指令構(gòu)成的語句,它通常對(duì)應(yīng)一條機(jī)器指令,出現(xiàn)在程序的代碼段中:一條機(jī)器指令,出現(xiàn)在程序的代碼段中: 標(biāo)號(hào)標(biāo)號(hào): 硬指令助記符硬指令助記符 目的操作數(shù)目的操作數(shù), 源操作數(shù);注釋源操作數(shù);注釋 前面章節(jié)已講過前面章節(jié)已講過 說明性語句說明性語句由偽指令構(gòu)成的語句,它通由偽指令構(gòu)成的語句,它通常指示匯編程序如何匯編源程序:常指示匯編程序如何匯編源程序: 名字名字 偽指令助記符偽指令助記符 參數(shù)參數(shù),參數(shù)參數(shù),;注釋;注釋第3章MOV CX,0MOV

13、 CX,0; ;傳送指令,具有傳送指令,具有2 2個(gè)操作數(shù)個(gè)操作數(shù)DELAY:DELAY: NOPNOP; ;空操作指令,沒有操作數(shù),帶有標(biāo)號(hào)空操作指令,沒有操作數(shù),帶有標(biāo)號(hào)LOOP DELAYLOOP DELAY; ;循環(huán)指令,標(biāo)號(hào)循環(huán)指令,標(biāo)號(hào)DELAYDELAY說明轉(zhuǎn)移位置說明轉(zhuǎn)移位置BUFFERBUFFER DB 1,2,3,4,5,6,7 DB 1,2,3,4,5,6,7; ;數(shù)據(jù)定義偽指令,數(shù)據(jù)定義偽指令,在主存中在主存中開辟開辟7 7個(gè)連續(xù)的字節(jié)單元,初值依次為個(gè)連續(xù)的字節(jié)單元,初值依次為1 17 7,BUFFERBUFFER表示首地址,即段地址和偏移地址,具有賦過初值的變量的表

14、示首地址,即段地址和偏移地址,具有賦過初值的變量的意義意義,由匯編程序自動(dòng)給出。,由匯編程序自動(dòng)給出。匯編語言語句實(shí)例匯編語言語句實(shí)例標(biāo)號(hào)、名字與標(biāo)識(shí)符標(biāo)號(hào)標(biāo)號(hào)是反映硬指令位置(邏輯地址)的標(biāo)識(shí)是反映硬指令位置(邏輯地址)的標(biāo)識(shí)符,后跟一個(gè)冒號(hào)符,后跟一個(gè)冒號(hào)“ :”分隔分隔名字名字是反映偽指令位置(邏輯地址)和屬性是反映偽指令位置(邏輯地址)和屬性的標(biāo)識(shí)符,后跟空格或制表符分隔,沒有冒的標(biāo)識(shí)符,后跟空格或制表符分隔,沒有冒號(hào)號(hào)“:”標(biāo)識(shí)符標(biāo)識(shí)符(Identifier)一般最多由)一般最多由31個(gè)字母、個(gè)字母、數(shù)字及規(guī)定的特殊符號(hào)(如數(shù)字及規(guī)定的特殊符號(hào)(如 _、$、?、)組成,不能以數(shù)字開頭

15、。默認(rèn)情況下,匯編組成,不能以數(shù)字開頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識(shí)符中的字母大小寫程序不區(qū)別標(biāo)識(shí)符中的字母大小寫一個(gè)程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,一個(gè)程序中,每個(gè)標(biāo)識(shí)符的定義是唯一的,還不能書寫成匯編語言采用的保留字還不能書寫成匯編語言采用的保留字第4章保留字保留字(保留字(Reserved Word)是匯編程序已)是匯編程序已經(jīng)利用的標(biāo)識(shí)符,主要有:經(jīng)利用的標(biāo)識(shí)符,主要有:o硬指令助記符類硬指令助記符類例如:例如:MOV、ADDo偽指令助記符類偽指令助記符類例如:例如:DB、EQUo操作符操作符例如:例如:OFFSET、PTRo寄存器名寄存器名例如:例如:AX、CSo預(yù)定義符號(hào)預(yù)定義

16、符號(hào)例如:例如:data第4章 匯編語言大小寫不敏感第3章第3章3 . 1 0 . 2 偽 指 令 中 參 數(shù) 、 變 量 和 標(biāo) 號(hào)1.匯編偽指令的標(biāo)號(hào)匯編偽指令的標(biāo)號(hào);不能以數(shù)字不能以數(shù)字09開頭開頭不能以保留字開頭不能以保留字開頭字母不區(qū)分大小寫字母不區(qū)分大小寫標(biāo)號(hào)和語句之間不能有標(biāo)號(hào)和語句之間不能有:第3章第3章2.符號(hào)定義語句(1) 用符號(hào)來表示一個(gè)指定的常數(shù)或數(shù)值表達(dá)式即為常用符號(hào)來表示一個(gè)指定的常數(shù)或數(shù)值表達(dá)式即為常量標(biāo)號(hào),這種偽指令的格式是在符號(hào)與常數(shù)之間用量標(biāo)號(hào),這種偽指令的格式是在符號(hào)與常數(shù)之間用“=”或者或者“EQU”連接(等值語句)如:連接(等值語句)如:NUM1 EQ

17、U 78H ;將將78H賦值給賦值給NUM1CONT1 = 96 ;將;將60H賦值給賦值給CONT1CONT2 = 28H+NUM1 ;將將A0H賦值給賦值給CONT2CONT3 EQU 2*CONT1 ;將將C0H賦值給賦值給CONT3常量標(biāo)號(hào)是給某個(gè)數(shù)據(jù)取的名字,一經(jīng)定義,匯編指令常量標(biāo)號(hào)是給某個(gè)數(shù)據(jù)取的名字,一經(jīng)定義,匯編指令中就可以使用這個(gè)名字,無需使用具體的數(shù)字中就可以使用這個(gè)名字,無需使用具體的數(shù)字(2)解除語句解除語句PURGE格式格式 PURGE 符號(hào)名符號(hào)名1,符號(hào)名,符號(hào)名2,此語句本身沒有符號(hào)名,被此語句本身沒有符號(hào)名,被PURGE解除后的符號(hào)名可解除后的符號(hào)名可以重新

18、定義,例:以重新定義,例: PURGE NUM1, CONT1第4章第3章第3章3.變量(數(shù)據(jù))定義偽指令變量定義(變量定義(Define)偽指令為變量申)偽指令為變量申請(qǐng)固定長度的存儲(chǔ)空間,并可同時(shí)將請(qǐng)固定長度的存儲(chǔ)空間,并可同時(shí)將相應(yīng)的存儲(chǔ)單元初始化相應(yīng)的存儲(chǔ)單元初始化變量名變量名 偽指令助記符偽指令助記符 初值表初值表匯編語言規(guī)定有匯編語言規(guī)定有DB、DW、DD、DF、DQ、DT 變量定義偽指令最常使用變量定義偽指令最常使用第3章第3章第3章變量定義偽指令助記符變量定義偽指令根據(jù)申請(qǐng)的主存變量定義偽指令根據(jù)申請(qǐng)的主存空間單位分類空間單位分類DB定義字節(jié)偽指令定義字節(jié)偽指令DW定義字偽指令

19、定義字偽指令DD定義雙字偽指令定義雙字偽指令DF定義定義3字偽指令字偽指令DQ定義定義4字偽指令字偽指令DT定義定義10字節(jié)偽指令字節(jié)偽指令第3章第3章第3章變量名變量名為用戶自定義標(biāo)識(shí)符,變量名為用戶自定義標(biāo)識(shí)符,表示初表示初值表首元素的邏輯地址值表首元素的邏輯地址;用這個(gè)符號(hào);用這個(gè)符號(hào)表示地址,常稱為符號(hào)地址表示地址,常稱為符號(hào)地址變量名可以沒有。這種情況,匯編程變量名可以沒有。這種情況,匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g,無符號(hào)序?qū)⒅苯訛槌踔当矸峙淇臻g,無符號(hào)地址地址設(shè)置變量名是為了方便存取它指示的設(shè)置變量名是為了方便存取它指示的存儲(chǔ)單元存儲(chǔ)單元第3章第3章第3章初始值可以是確定的值或字符

20、串初始值可以是確定的值或字符串 DATA1 DW 9999HDATA2 DB OK初始值不確定而為任意值時(shí)則使用?初始值不確定而為任意值時(shí)則使用?DATA3 DD ?簡(jiǎn)化定義過程可使用重復(fù)定義偽指令簡(jiǎn)化定義過程可使用重復(fù)定義偽指令DUP,例如定義一,例如定義一個(gè)擁有個(gè)擁有256個(gè)存儲(chǔ)單元的字節(jié)型數(shù)據(jù)緩沖區(qū)個(gè)存儲(chǔ)單元的字節(jié)型數(shù)據(jù)緩沖區(qū)BUFFB,初,初值均為值均為0BUFFB DB 256 DUP(0)簡(jiǎn)化定義過程,可以在一條偽指令中用逗號(hào)分隔而構(gòu)成簡(jiǎn)化定義過程,可以在一條偽指令中用逗號(hào)分隔而構(gòu)成任意組合序列任意組合序列BUFFB DB 0,0,ABC,?,?,?,? , 0FFH第3章第3章第

21、3章初值表初值表是用逗號(hào)分隔的參數(shù)初值表是用逗號(hào)分隔的參數(shù)主要由數(shù)值常數(shù)、表達(dá)式或?、主要由數(shù)值常數(shù)、表達(dá)式或?、變量中重復(fù)數(shù)據(jù)的定義格式變量中重復(fù)數(shù)據(jù)的定義格式:符號(hào)名符號(hào)名 Dn 表達(dá)式表達(dá)式1 DUP(表達(dá)式)(表達(dá)式)表達(dá)式表達(dá)式1:數(shù)據(jù)重復(fù)的次數(shù)數(shù)據(jù)重復(fù)的次數(shù)圓括弧內(nèi)表達(dá)式:要重復(fù)的內(nèi)容圓括弧內(nèi)表達(dá)式:要重復(fù)的內(nèi)容?表示初值不確定,即未賦初值;表示初值不確定,即未賦初值;第3章第3章第3章定義字節(jié)單元偽指令DBDB偽指令用于分配一個(gè)或多個(gè)字節(jié)單元,偽指令用于分配一個(gè)或多個(gè)字節(jié)單元,并可以將它們初始化為指定值并可以將它們初始化為指定值初 值 表 中 每 個(gè) 數(shù) 據(jù) 一 定 是 字 節(jié)

22、量初 值 表 中 每 個(gè) 數(shù) 據(jù) 一 定 是 字 節(jié) 量(Byte),存放一個(gè)),存放一個(gè)8位數(shù)據(jù):位數(shù)據(jù):n 可以是可以是0255的無符號(hào)數(shù)的無符號(hào)數(shù)n 或是或是128127帶符號(hào)數(shù)帶符號(hào)數(shù) 也可以是字符串常數(shù)也可以是字符串常數(shù)第3章第3章datadatasegmentsegment;數(shù)據(jù)段;數(shù)據(jù)段X Xdb a,-5db a,-5db 2 dup(100),?db 2 dup(100),?Y Ydb ABCdb ABCdatadataendsends字節(jié)單元定字節(jié)單元定義實(shí)例義實(shí)例第3章第3章第3章mov al,Xmov al,X; ;此處此處X X表示它的第表示它的第1 1個(gè)數(shù)據(jù),故個(gè)數(shù)

23、據(jù),故ALaALadec X+1dec X+1; ;對(duì)對(duì)X X為始的第為始的第2 2個(gè)數(shù)據(jù)減個(gè)數(shù)據(jù)減1 1,故成為,故成為-6-6mov Y,almov Y,al; ;現(xiàn)在現(xiàn)在Y Y這個(gè)字符串成為這個(gè)字符串成為 aaBCBC字節(jié)變量的字節(jié)變量的應(yīng)用應(yīng)用第3章第3章定義字單元偽指令DWDW偽指令用于分配一個(gè)或多個(gè)字單偽指令用于分配一個(gè)或多個(gè)字單元,并可以將它們初始化為指定值元,并可以將它們初始化為指定值初 值 表 中 每 個(gè) 數(shù) 據(jù) 一 定 是 字 量初 值 表 中 每 個(gè) 數(shù) 據(jù) 一 定 是 字 量(Word),一個(gè)字單元可用于存放任),一個(gè)字單元可用于存放任何何16位數(shù)據(jù):位數(shù)據(jù):n 一個(gè)段

24、地址一個(gè)段地址n一個(gè)偏移地址一個(gè)偏移地址n 兩個(gè)字符兩個(gè)字符n 065535之間的無符號(hào)數(shù)之間的無符號(hào)數(shù) 3276832767之間的帶符號(hào)數(shù)之間的帶符號(hào)數(shù)第3章第3章datadatasegmentsegment;數(shù)據(jù)段;數(shù)據(jù)段countcount dw 8000h,?,ABdw 8000h,?,ABmaxintmaxint equ 64hequ 64hnumbernumber dw maxintdw maxintarrayarray dw maxint dup(0)dw maxint dup(0)datadataendsends字單元定義字單元定義實(shí)例實(shí)例第3章第3章字變量和字常量的定義:字變

25、量和字常量的定義:WNUMWNUM EQU 5678HEQU 5678H; ;定義定義WNUMWNUM為常量為常量COUNTCOUNT DW 20H DW 20H; ;定義定義COUNTCOUNT是賦了初值的變量,假設(shè)在數(shù)據(jù)段的是賦了初值的變量,假設(shè)在數(shù)據(jù)段的有效偏移地址為有效偏移地址為10H.10H.字變量和字常量的應(yīng)用:字變量和字常量的應(yīng)用:M O V A X , B X + S I + W N U M M O V A X , B X + S I + W N U M ; ; M O V M O V AX,BX+SI+5678HAX,BX+SI+5678HMOV AX,COUNTMOV AX

26、,COUNT; ; MOV AX,0010HMOV AX,0010H ; ; AX=0020H AX=0020HMOV AX,SI+COUNTMOV AX,SI+COUNT ; ; MOV AX,COUNTSIMOV AX,COUNTSI; ; MOV AX,SI+MOV AX,SI+2 20H0HLEA BX,COUNTLEA BX,COUNT; ; LEA BX,0010HLEA BX,0010HMOV BX,OFFSET COUNTMOV BX,OFFSET COUNT; ; MOV BX,0010HMOV BX,0010H字變量和字常量字變量和字常量第3章第3章定義雙字單元偽指令DDD

27、D偽指令偽指令用于分配一個(gè)或多個(gè)雙字單元,用于分配一個(gè)或多個(gè)雙字單元,并可以將它們初始化為指定值并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)是一個(gè)初值表中每個(gè)數(shù)據(jù)是一個(gè)3232位的雙字量位的雙字量(Double WordDouble Word):):n 可以是有符號(hào)或無符號(hào)的可以是有符號(hào)或無符號(hào)的3232位整數(shù)位整數(shù)n 也可以用來表達(dá)也可以用來表達(dá)1616位段地址(高位字)和位段地址(高位字)和1616位的偏移地址(低位字)的遠(yuǎn)指針位的偏移地址(低位字)的遠(yuǎn)指針varddvarddDD 0,?,12345678hDD 0,?,12345678hfarpointfarpointDD 0040007

28、8hDD 00400078h第3章第3章其他數(shù)據(jù)單元定義偽指令定義定義3 3字偽指令字偽指令DFDF用于為一個(gè)或多個(gè)用于為一個(gè)或多個(gè)6 6字節(jié)變量分配空間及初始化字節(jié)變量分配空間及初始化6 6字節(jié)常用在字節(jié)常用在3232位位CPUCPU中表示一個(gè)中表示一個(gè)4848位遠(yuǎn)指針位遠(yuǎn)指針(1616位段選擇器位段選擇器:32:32位偏移地址)位偏移地址)定義定義4 4字偽指令字偽指令DQDQ用于為一個(gè)或多個(gè)用于為一個(gè)或多個(gè)8 8字節(jié)變量分配空間及初始化字節(jié)變量分配空間及初始化8 8字節(jié)變量可以表達(dá)一個(gè)字節(jié)變量可以表達(dá)一個(gè)6464位整數(shù)位整數(shù)定義定義1010字節(jié)偽指令字節(jié)偽指令DTDT用于為一個(gè)或用于為一

29、個(gè)或多個(gè)多個(gè)1010字節(jié)變量分配空間及初始化字節(jié)變量分配空間及初始化1010字節(jié)變量可以表達(dá)擴(kuò)展精度浮點(diǎn)數(shù)字節(jié)變量可以表達(dá)擴(kuò)展精度浮點(diǎn)數(shù)第3章第3章ORG定位偽指令、END結(jié)束偽指令ORGORG (段的起始點(diǎn))偽指令(段的起始點(diǎn))偽指令該指令對(duì)程序計(jì)數(shù)器置數(shù),為程序該指令對(duì)程序計(jì)數(shù)器置數(shù),為程序起始點(diǎn)。起始點(diǎn)。ORG 100hORG 100h ; ;從從100h100h處安排數(shù)據(jù)或程處安排數(shù)據(jù)或程序序END結(jié)束匯編偽指令STRUC 數(shù)據(jù)結(jié)構(gòu)定義的開始NEAR 段內(nèi)轉(zhuǎn)移的近過程調(diào)用FAR 段間轉(zhuǎn)移的遠(yuǎn)過程調(diào)用第3章第3章分析和合成操作符(1)合成操作符)合成操作符 PTR操作符操作符格式:類型格

30、式:類型 PTR 表達(dá)式表達(dá)式類型可以是類型可以是 BYTE、WORD 、 DWORD、 FWORD 、 QWORD 、TBYTE 、 NEAR 、FAR如;如;BYTE PTR : 操作數(shù)為操作數(shù)為1個(gè)存儲(chǔ)單元的字節(jié)類型個(gè)存儲(chǔ)單元的字節(jié)類型 WORD PTR:操作數(shù)為:操作數(shù)為2個(gè)存儲(chǔ)單元的字節(jié)類型個(gè)存儲(chǔ)單元的字節(jié)類型 DWORD PTR :操作數(shù)為:操作數(shù)為4個(gè)存儲(chǔ)單元的字節(jié)類型個(gè)存儲(chǔ)單元的字節(jié)類型 FWORD PTR :操作數(shù)為:操作數(shù)為6個(gè)存儲(chǔ)單元的字節(jié)類型個(gè)存儲(chǔ)單元的字節(jié)類型 QWORD PTR :操作數(shù)為:操作數(shù)為8個(gè)存儲(chǔ)單元的字節(jié)類型個(gè)存儲(chǔ)單元的字節(jié)類型 TBYTE PTR :操

31、作數(shù)為:操作數(shù)為10個(gè)存儲(chǔ)單元的字節(jié)類型個(gè)存儲(chǔ)單元的字節(jié)類型SHORT: 迫使轉(zhuǎn)移指令在迫使轉(zhuǎn)移指令在128個(gè)字節(jié)的近距離內(nèi)實(shí)現(xiàn)短跳轉(zhuǎn)個(gè)字節(jié)的近距離內(nèi)實(shí)現(xiàn)短跳轉(zhuǎn)例例 JC SHORT NEXT修飾修飾 JC指令轉(zhuǎn)移到標(biāo)號(hào)指令轉(zhuǎn)移到標(biāo)號(hào)NEXT,具有具有NEAR屬性,說明它下一條屬性,說明它下一條指令不超過指令不超過128-127個(gè)字節(jié)。個(gè)字節(jié)。第3章第3章分析操作符SEG取標(biāo)號(hào)或變量的段地址取標(biāo)號(hào)或變量的段地址例例 MOV AX,SEG STACK;將變量將變量STACK存儲(chǔ)單元的段地址存儲(chǔ)單元的段地址送送AX寄存器寄存器OFFSET操作符操作符取標(biāo)號(hào)或變量的偏移值取標(biāo)號(hào)或變量的偏移值例例 M

32、OV SP, OFFSET STACK-TOP;將棧頂?shù)钠屏克蛯m數(shù)钠屏克蚐P寄寄存器存器 SIZE操作符操作符取分配給變量的字節(jié)個(gè)數(shù)取分配給變量的字節(jié)個(gè)數(shù)例例 NUM1 DB 150(?) MOV DL, SIZE NUM1;150 DLLENGTH 取分配給變量的字節(jié)或字個(gè)數(shù)即變量的長度取分配給變量的字節(jié)或字個(gè)數(shù)即變量的長度例例 NUM1 DW 150(?) MOV AH, LENGTH NUM1;150 AHHIGH 取取16位數(shù)值或地址表達(dá)式的高字節(jié)。位數(shù)值或地址表達(dá)式的高字節(jié)。LOW 取取16位數(shù)值或地址表達(dá)式的低字節(jié)。位數(shù)值或地址表達(dá)式的低字節(jié)。第3章第3章第3章段/過程規(guī)定

33、偽操作SEGMENT和和ENDS將匯編語言源程序分割將匯編語言源程序分割成段,僅用來做段的界符。一個(gè)程序最多可有成段,僅用來做段的界符。一個(gè)程序最多可有4段:段:數(shù)據(jù)段、代碼段、附加段、堆棧段數(shù)據(jù)段、代碼段、附加段、堆棧段。PROC 每個(gè)過程(子程序)都以偽操作符每個(gè)過程(子程序)都以偽操作符PROC開始,并以開始,并以ENDP結(jié)束。結(jié)束。ASSUME 告訴匯編程序一個(gè)段是使用那一告訴匯編程序一個(gè)段是使用那一個(gè)段寄存器。個(gè)段寄存器。格式:格式:ASSUME 段寄存器名:段名段寄存器名:段名, (由由SEGMENT說明的段名說明的段名)例:例:ASSUME CS:MY_CODE, DS:SEG_

34、DATA第3章第3章第3章操作數(shù)(參數(shù))處理器指令的處理器指令的操作數(shù)操作數(shù)可以是常數(shù)操作數(shù)、寄存器可以是常數(shù)操作數(shù)、寄存器和存儲(chǔ)單元和存儲(chǔ)單元常數(shù)操作數(shù):具有數(shù)字值的常數(shù)或表示常數(shù)的標(biāo)常數(shù)操作數(shù):具有數(shù)字值的常數(shù)或表示常數(shù)的標(biāo)號(hào)和名字號(hào)和名字存儲(chǔ)器操作數(shù):可分成標(biāo)號(hào)和變量存儲(chǔ)器操作數(shù):可分成標(biāo)號(hào)和變量標(biāo)號(hào)是可執(zhí)行的指令的地址符號(hào)標(biāo)號(hào)是可執(zhí)行的指令的地址符號(hào)偽指令的偽指令的參數(shù)參數(shù)可以是??梢允浅?shù)、變量名、表達(dá)式等,數(shù)、變量名、表達(dá)式等,可以有多個(gè),參數(shù)之間用可以有多個(gè),參數(shù)之間用逗號(hào)分隔逗號(hào)分隔第3章第3章第3章常數(shù)二進(jìn)制:如二進(jìn)制:如 00101110B十進(jìn)制:如十進(jìn)制:如 196D或或

35、196十六進(jìn)制:如十六進(jìn)制:如 0FDH八進(jìn)制:如八進(jìn)制:如 367Q十進(jìn)制科學(xué)表示法:十進(jìn)制科學(xué)表示法:2.735E-2十六進(jìn)制實(shí)數(shù):由若干十六進(jìn)制數(shù)數(shù)碼組成,以數(shù)十六進(jìn)制實(shí)數(shù):由若干十六進(jìn)制數(shù)數(shù)碼組成,以數(shù)字開頭、以字母字開頭、以字母R結(jié)尾,總位數(shù)必須是結(jié)尾,總位數(shù)必須是8、16或或20,以字母打頭的數(shù)前面必須加,以字母打頭的數(shù)前面必須加0,此時(shí)總位數(shù),此時(shí)總位數(shù)多多1位位例例 4FA0C65BR串常數(shù):用引號(hào)括起來的字符串,其值是字符的串常數(shù):用引號(hào)括起來的字符串,其值是字符的ASCII代碼值代碼值例例 “A5”其值是其值是4135H第3章第3章第3章宏指令語句 宏指令是現(xiàn)代匯編為自己定

36、義的新型指令,應(yīng)用宏指令會(huì)提宏指令是現(xiàn)代匯編為自己定義的新型指令,應(yīng)用宏指令會(huì)提高程序設(shè)計(jì)的有效性并簡(jiǎn)化程序的編寫和調(diào)整。高程序設(shè)計(jì)的有效性并簡(jiǎn)化程序的編寫和調(diào)整。 在編寫程序時(shí)常常遇到一個(gè)多次出現(xiàn)的指令序列(語句組),在編寫程序時(shí)常常遇到一個(gè)多次出現(xiàn)的指令序列(語句組),為了簡(jiǎn)化程序的書寫和修正,給這個(gè)指令序列起一個(gè)名字,這個(gè)為了簡(jiǎn)化程序的書寫和修正,給這個(gè)指令序列起一個(gè)名字,這個(gè)經(jīng)定義后的名字就稱為宏指令。經(jīng)定義后的名字就稱為宏指令。宏指令的好處;簡(jiǎn)化程序的編寫;易于修改程序。宏指令的好處;簡(jiǎn)化程序的編寫;易于修改程序。1.宏定義宏定義格式格式 標(biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù) NAM

37、E MACRO List 語語 句句 體體 ENDM第3章第3章第3章NAME是名字不是形式地址,在名字后不能用是名字不是形式地址,在名字后不能用“:”MACRO和和ENDM也是偽指令。該偽指令指示匯編用也是偽指令。該偽指令指示匯編用MACRO和和ENDM之間的語句組作為命名為之間的語句組作為命名為“NAME”的宏定義。經(jīng)過這種的宏定義。經(jīng)過這種定義的名字定義的名字NAME便可在程序中當(dāng)作指令語句的操作碼使用。便可在程序中當(dāng)作指令語句的操作碼使用。對(duì)源程序進(jìn)行匯編時(shí),在程序中遇到對(duì)源程序進(jìn)行匯編時(shí),在程序中遇到NAME匯編程序就自動(dòng)地匯編程序就自動(dòng)地用語句組(宏指令體)來代替用語句組(宏指令體

38、)來代替例例 把累加器把累加器AL的高、低的高、低4位交換。位交換。標(biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù)ROTATE MACRO ROL AL ROL AL ROL AL ROL AL ENDM第3章第3章第3章2.宏調(diào)用宏調(diào)用 編寫程序時(shí)使用宏指令就是宏調(diào)用。宏調(diào)用時(shí)編寫程序時(shí)使用宏指令就是宏調(diào)用。宏調(diào)用時(shí)把宏指令填寫在操作碼字段。宏指令能任意調(diào)把宏指令填寫在操作碼字段。宏指令能任意調(diào)用。如用。如; 標(biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù) MOV AL, 2FH ROTATE ADD AL, 03H ROTATE HLT 程序中程序中ROTATE被調(diào)用兩次被調(diào)用兩次第3章第3章第3章3.宏擴(kuò)展

39、宏擴(kuò)展對(duì)源程序進(jìn)行匯編時(shí),匯編程序用宏指令體代替每次出現(xiàn)的宏指對(duì)源程序進(jìn)行匯編時(shí),匯編程序用宏指令體代替每次出現(xiàn)的宏指令稱為宏擴(kuò)展。宏擴(kuò)展由匯編程序自動(dòng)完成。編程人員只完成宏令稱為宏擴(kuò)展。宏擴(kuò)展由匯編程序自動(dòng)完成。編程人員只完成宏定義和宏調(diào)用。例如上述源程序經(jīng)宏擴(kuò)展后變?yōu)橄铝性闯绦蚨x和宏調(diào)用。例如上述源程序經(jīng)宏擴(kuò)展后變?yōu)橄铝性闯绦驑?biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù) MOV AL, 2FH ROL AL ROL AL ROL AL ROL AL ADD AL,03H ROL AL ROL AL ROL AL ROL AL HLT第3章第3章第3章4.宏變?cè)曜冊(cè)甓x中的操作數(shù)宏定義中的操作

40、數(shù)List稱為形式參數(shù),宏指令中的操作數(shù)稱為宏稱為形式參數(shù),宏指令中的操作數(shù)稱為宏參數(shù)。在宏擴(kuò)展中,用宏指令中的宏參數(shù)代替相應(yīng)的宏定義參數(shù)。在宏擴(kuò)展中,用宏指令中的宏參數(shù)代替相應(yīng)的宏定義中的形式參數(shù)稱為宏變?cè)?。上例中若不是累加器中的形式參?shù)稱為宏變?cè)?。上例中若不是累加器AL高低高低4位位交換,而是其它交換,而是其它8位寄存器,這時(shí)寫入適當(dāng)形式參數(shù)。定義如位寄存器,這時(shí)寫入適當(dāng)形式參數(shù)。定義如下下 標(biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù)ROTATE MACRO REG ROL REG ROL REG ROL REG ROL REG ENDM 其宏定義中的操作數(shù)其宏定義中的操作數(shù)REG為形式參數(shù)。功

41、能是寄存器為形式參數(shù)。功能是寄存器REG內(nèi)容內(nèi)容左移,當(dāng)調(diào)用宏指令時(shí)必須填入宏參數(shù),即在指令中填入操左移,當(dāng)調(diào)用宏指令時(shí)必須填入宏參數(shù),即在指令中填入操作數(shù)。若是寄存器作數(shù)。若是寄存器BL時(shí),調(diào)用形式如下時(shí),調(diào)用形式如下第3章第3章第3章 標(biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù) ROTATE BL 匯編時(shí)用宏參數(shù)匯編時(shí)用宏參數(shù)BL代替形式參數(shù)代替形式參數(shù)REG宏指令會(huì)擴(kuò)展為宏指令會(huì)擴(kuò)展為標(biāo)號(hào)標(biāo)號(hào) 操作碼操作碼 操作數(shù)操作數(shù) ROL BL ROL BL ROL BL ROL BL在程序中經(jīng)常會(huì)出現(xiàn)數(shù)據(jù)塊在內(nèi)存的兩個(gè)區(qū)間互相傳送,也可以用一條宏指令代替。程序如下;在程序中經(jīng)常會(huì)出現(xiàn)數(shù)據(jù)塊在內(nèi)存的兩個(gè)

42、區(qū)間互相傳送,也可以用一條宏指令代替。程序如下;DATA SEGMENTSTRT DB “THE QUICK BROWNFOX JUMPS OVER THE LAZY DOG”MEMO DB 45 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE DS:DATA ES:DATAMOVE MACRO #A,#B MOV SI,OFSET#A MOV DI,OFSET#B MOV CX,SIZE#B CLD REP MOVSB ENDM用一條宏指令用一條宏指令MOVE STRT, MEMO 代替上述程序段,而代替上述程序段,而STRT , MEMO 為宏參數(shù)。為

43、宏參數(shù)。 #A, #B為形參。為形參。程序?qū)岩猿绦驅(qū)岩許TRT為首地址的數(shù)據(jù)塊,傳到以為首地址的數(shù)據(jù)塊,傳到以MEMO為首地址的數(shù)據(jù)區(qū)中為首地址的數(shù)據(jù)區(qū)中第3章第3章第3章匯編程序指令舉例DATA SEGMENT; 數(shù)據(jù)段開始,段名為數(shù)據(jù)段開始,段名為DATABUFF DB 256 DUP(?);BUFF緩沖區(qū)有緩沖區(qū)有256個(gè)單元,初值未定個(gè)單元,初值未定DATA1 DW 1234H ;定義一個(gè)字單元定義一個(gè)字單元DATA ENDS ;數(shù)據(jù)段結(jié)束數(shù)據(jù)段結(jié)束CODE SEGMENT ;指令段開始,段名為指令段開始,段名為STARTSTART PROC ;定義一個(gè)標(biāo)號(hào)為定義一個(gè)標(biāo)號(hào)為STAR

44、T的過程的過程 ASSUME DS:DATA,CS:CODE;告知匯編器告知匯編器DATA和和CODE段名段名 ;匯編語言程序主體匯編語言程序主體START ENDP ; START過程結(jié)束過程結(jié)束CODE ENDS ;指令段結(jié)束;指令段結(jié)束 END START ;程序結(jié)束,程序起始地址為;程序結(jié)束,程序起始地址為START第3章第3章第3章3.10.3匯編語言的程序設(shè)計(jì)匯編語言程序設(shè)計(jì)的基本步驟匯編語言程序設(shè)計(jì)的基本步驟1、分析問題,抽象出描述問題的數(shù)、分析問題,抽象出描述問題的數(shù)學(xué)模型學(xué)模型2、確定解決問題的算法思路、確定解決問題的算法思路3、繪制流程圖或結(jié)構(gòu)圖、繪制流程圖或結(jié)構(gòu)圖4、分配

45、存儲(chǔ)空間(包括寄存器)、分配存儲(chǔ)空間(包括寄存器)5、編寫程序、編寫程序6、上機(jī)調(diào)試、上機(jī)調(diào)試第3章第3章第3章 一、順序程序設(shè)計(jì) 一、順序程序設(shè)計(jì)一、順序程序設(shè)計(jì)程序是順序執(zhí)行的,無分支、無循環(huán),又稱直線型程序程序是順序執(zhí)行的,無分支、無循環(huán),又稱直線型程序例例 內(nèi)存中自內(nèi)存中自TABLE開始的開始的16個(gè)單元連續(xù)存放著自然數(shù)個(gè)單元連續(xù)存放著自然數(shù)015的平的平方(稱作平方表)。任意給定數(shù)方(稱作平方表)。任意給定數(shù)X(0X 15)在在XX單元,查表求單元,查表求X的平方值,并把結(jié)果存入的平方值,并把結(jié)果存入YY單元。單元。 分析一下表的存放規(guī)律如圖所示,可知表的起始地址與數(shù)分析一下表的存放

46、規(guī)律如圖所示,可知表的起始地址與數(shù)X的和,的和,便是便是X平方值所在單元的地址,由此可得子程序如下;平方值所在單元的地址,由此可得子程序如下;DATA SEGMENTTABLE DB 0,1,4,9,16,25,36,49 DB 64,81,100,121,144,169,196,255XX DB ?YY DB ?DATA ENDSSTACK SEGMENT PARA STACKSTACK DB 50 DUP(?)STACK ENDS第3章第3章第3章CODE SEGMENT ASSUME CS:CODE, DS:DATA,SS:STACKSTART PROC FAR PUSH DS MOV

47、AX,0 PUSH AX MOV AX,SEG DATA;取段地址;取段地址 MOV DS,AX MOV BX, OFFSET TABLE ;取偏移地址取偏移地址 MOV AH, 0 MOV AL, XX ADD BX, AX MOV AL, BX MOV YY, AL RETSTART ENDSCODE ENDS END STARTDSTABLE00 010409.XX第3章YY255第3章第3章例4.2假設(shè)LISTA與LISTB為兩個(gè)字類型數(shù)組,將他們各對(duì)應(yīng)相加,其和放在LISTB數(shù)組中,程序設(shè)計(jì)如下: STACK SEGMENT ;堆棧段開始堆棧段開始 DW 32H DUP(?) ;堆棧

48、段空間為;堆棧段空間為40個(gè)字個(gè)字STACK ENDS ;堆棧段結(jié)束;堆棧段結(jié)束DSEG SEGMENT ;數(shù)據(jù)段開始;數(shù)據(jù)段開始 LISTA DW 64H DUP(1234H) ;100字的源緩沖區(qū)字的源緩沖區(qū)DSEG ENDS ;數(shù)據(jù)段結(jié)束數(shù)據(jù)段結(jié)束ESEG SEGMENT ;附加段開始;附加段開始 LISTB DW 100 DUP (432H1) ; 100字的目的緩沖區(qū)字的目的緩沖區(qū)ESEG ENDS ;附加段結(jié)束;附加段結(jié)束CSEG SEGMENT ;代碼段開始;代碼段開始 ASSUME CS:CSEG DS:DSEG;指明代碼段、數(shù)據(jù)段段名;指明代碼段、數(shù)據(jù)段段名 ASSUME S

49、S:STACK ES:ESEG ;堆棧段、附加段段名;堆棧段、附加段段名 MAIN PROC ;定義過程;定義過程 MOV AX,DSEG ;數(shù)據(jù)段段地址送;數(shù)據(jù)段段地址送AX MOV DS, AX ;數(shù)據(jù)段段地址裝入數(shù)據(jù)段段地址裝入DS MOV AX, ESEG ;附加段段地址送附加段段地址送AX MOV ES, AX ;附加段段地址裝入;附加段段地址裝入ES CLD ; 選擇地址增方向選擇地址增方向第3章第3章第3章 MOV SI, OFFSET LISTA ; 指向源塊的首地址指向源塊的首地址 MOV DI, OFFSET LISTB ; 指向目的塊的首地址指向目的塊的首地址 MOV C

50、X,100 ;循環(huán)次數(shù)循環(huán)次數(shù) LOP1: LODSW ; LISTA元素送元素送AX ADD AX,ES:DI ;將將LISTB元素加到元素加到AX STOSW ;兩數(shù)之和存入;兩數(shù)之和存入LISTB LOOP LOP1 ;循環(huán)至循環(huán)至CX=0 MOV AH,4CH ;功能調(diào)用號(hào)功能調(diào)用號(hào)4CH送入送入AH INT 21H ;程序結(jié)束后返回程序結(jié)束后返回DOS MAIN ENDP ;過程結(jié)束;過程結(jié)束CSEG ENDS ;代碼段結(jié)束;代碼段結(jié)束 END MAIN ;程序結(jié)束;程序結(jié)束第3章第3章第3章二、分支程序設(shè)計(jì)一般情況下程序按順序方式執(zhí)行,有時(shí)進(jìn)行運(yùn)算一般情況下程序按順序方式執(zhí)行,有時(shí)

51、進(jìn)行運(yùn)算時(shí)要根據(jù)不同的情況選擇不同的處理方法,執(zhí)行時(shí)要根據(jù)不同的情況選擇不同的處理方法,執(zhí)行不同的程序,這就需要分支。如下圖所示不同的程序,這就需要分支。如下圖所示條件程序段2程序段1NY第3章第3章第3章見教材P157頁下面舉例例例 在存儲(chǔ)器中有一個(gè)首地址為在存儲(chǔ)器中有一個(gè)首地址為ARRAY的的N個(gè)字?jǐn)?shù)組,個(gè)字?jǐn)?shù)組,要求測(cè)試其中正數(shù)、要求測(cè)試其中正數(shù)、0、及負(fù)數(shù)的個(gè)數(shù),正數(shù)的個(gè)數(shù)、及負(fù)數(shù)的個(gè)數(shù),正數(shù)的個(gè)數(shù)放在放在DI中中 ,0的個(gè)數(shù)放在的個(gè)數(shù)放在SI中中,并根據(jù)并根據(jù)N 、DI、SI的的值,求得負(fù)數(shù)的個(gè)數(shù)并放在值,求得負(fù)數(shù)的個(gè)數(shù)并放在AX中,如果有負(fù)數(shù)則轉(zhuǎn)中,如果有負(fù)數(shù)則轉(zhuǎn)移到移到NEG_V

52、AL中去執(zhí)行。程序片段如下中去執(zhí)行。程序片段如下 MOV CX,N ;計(jì)數(shù)器置值;計(jì)數(shù)器置值 MOV BX,0 ;BX清零清零 MOV DI,BX ;正數(shù)個(gè)數(shù)計(jì)數(shù)器清零;正數(shù)個(gè)數(shù)計(jì)數(shù)器清零 MOV SI,BX ;零數(shù)個(gè)數(shù)計(jì)數(shù)器清零;零數(shù)個(gè)數(shù)計(jì)數(shù)器清零AGAIN:CMP ARRAYBX,0 ;數(shù)組的元素與數(shù)組的元素與0比較比較 JLE LESS_OR_EQ ;若小于等于若小于等于0則轉(zhuǎn)移則轉(zhuǎn)移 INC DI ;大于大于0則正計(jì)數(shù)器加則正計(jì)數(shù)器加1 JMP SHORT NEXT第3章第3章第3章LESS_OR_EQ: JL NEXT ;若小于若小于0,轉(zhuǎn)移,轉(zhuǎn)移 INC SI ; 0的計(jì)數(shù)器加的計(jì)

53、數(shù)器加1 NEXT: ADD BX,2 ;修改數(shù)組指針;修改數(shù)組指針 DEC CX ;修改循環(huán)計(jì)數(shù)器;修改循環(huán)計(jì)數(shù)器 JNZ AGAIN ;CX0轉(zhuǎn)移,繼續(xù)比較轉(zhuǎn)移,繼續(xù)比較 MOV AX,N SUB AX,DI SUB AX,SI ;數(shù)組中除了正數(shù)個(gè)數(shù)和數(shù)組中除了正數(shù)個(gè)數(shù)和0個(gè)數(shù)就是負(fù)數(shù)個(gè)數(shù)個(gè)數(shù)就是負(fù)數(shù)個(gè)數(shù) JZ SKIP ;累加器結(jié)果為零轉(zhuǎn)移;累加器結(jié)果為零轉(zhuǎn)移 JMP NEAT PTR NEG_VAL SKIP: . . NEG_VAL:第3章第3章第3章三、循環(huán)程序結(jié)構(gòu)在實(shí)際解決問題過程中,往往需要重復(fù)的做一些工作,凡需要重復(fù)做的工作,在實(shí)際解決問題過程中,往往需要重復(fù)的做一些工作,凡

54、需要重復(fù)做的工作,可用循環(huán)結(jié)構(gòu)程序?qū)崿F(xiàn)。循環(huán)程序結(jié)構(gòu)有以下部分組成;可用循環(huán)結(jié)構(gòu)程序?qū)崿F(xiàn)。循環(huán)程序結(jié)構(gòu)有以下部分組成;(1)初始化:建立指針,設(shè)計(jì)計(jì)數(shù)器,設(shè)置變量初值)初始化:建立指針,設(shè)計(jì)計(jì)數(shù)器,設(shè)置變量初值(2)循環(huán)體:放置重復(fù)執(zhí)行的部分)循環(huán)體:放置重復(fù)執(zhí)行的部分(3)修改部分:修改操作數(shù)的地址等,為下次循環(huán)做好準(zhǔn)備)修改部分:修改操作數(shù)的地址等,為下次循環(huán)做好準(zhǔn)備(4)循環(huán)控制:修改計(jì)數(shù)器,判斷循環(huán)控制條件,決定是否繼續(xù)循環(huán)。)循環(huán)控制:修改計(jì)數(shù)器,判斷循環(huán)控制條件,決定是否繼續(xù)循環(huán)。循環(huán)程序有兩種基本結(jié)構(gòu)形式:循環(huán)程序有兩種基本結(jié)構(gòu)形式:1先判斷后執(zhí)行結(jié)構(gòu):先判斷后執(zhí)行結(jié)構(gòu):2先執(zhí)行

55、后判斷結(jié)構(gòu):先執(zhí)行后判斷結(jié)構(gòu):初始化條件程序段NY初始化循環(huán)體修改部分 控制部分(循環(huán)結(jié)束嗎)NY先判斷后執(zhí)行結(jié)構(gòu)先判斷后執(zhí)行結(jié)構(gòu)先執(zhí)行后判斷結(jié)構(gòu)先執(zhí)行后判斷結(jié)構(gòu)第3章第3章第3章先執(zhí)行后判斷結(jié)構(gòu)舉例統(tǒng)計(jì)一個(gè)數(shù)據(jù)塊中負(fù)數(shù)的個(gè)數(shù)程序統(tǒng)計(jì)一個(gè)數(shù)據(jù)塊中負(fù)數(shù)的個(gè)數(shù)程序,即統(tǒng)計(jì)符號(hào)位為即統(tǒng)計(jì)符號(hào)位為1的個(gè)數(shù),先執(zhí)行后判斷循環(huán)程序如下:的個(gè)數(shù),先執(zhí)行后判斷循環(huán)程序如下:DATA SEGMENTD1 DW 14A8H,A6C1H,F10AHRS DD ?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTAT: MOV AX,DATA MOV DS,AX MOV B

56、X, OFFSET D1 ;建數(shù)據(jù)指針建數(shù)據(jù)指針 MOV CX,LENGTH D1 ;置計(jì)數(shù)器初值;置計(jì)數(shù)器初值 初始化初始化 MOV DX,0 :置結(jié)果初值:置結(jié)果初值LOP1: MOV AX,BX CMP AX,0 JGE JUS ;大于或等于;大于或等于0 轉(zhuǎn)移轉(zhuǎn)移 循環(huán)體循環(huán)體 INC DX; 負(fù)數(shù)個(gè)數(shù)增負(fù)數(shù)個(gè)數(shù)增1 JUS: INC BX ;修改部分;修改部分 INC BX;指向下一個(gè)數(shù)據(jù);指向下一個(gè)數(shù)據(jù) DEC CX JNE LOP1 ;控制部分;控制部分 MOV RS, DX ;存結(jié)果;存結(jié)果CODE ENDS END STAT第3章第3章第3章先判斷后執(zhí)行結(jié)構(gòu)上例變成先判斷后執(zhí)

57、行結(jié)構(gòu)程序如下:這種結(jié)構(gòu)特點(diǎn)是進(jìn)入循環(huán)后,上例變成先判斷后執(zhí)行結(jié)構(gòu)程序如下:這種結(jié)構(gòu)特點(diǎn)是進(jìn)入循環(huán)后,先判斷循環(huán)結(jié)束條件,再?zèng)Q定是否執(zhí)行循環(huán)體。如果一進(jìn)入循環(huán)就先判斷循環(huán)結(jié)束條件,再?zèng)Q定是否執(zhí)行循環(huán)體。如果一進(jìn)入循環(huán)就滿足結(jié)束條件,循環(huán)體將一次也不執(zhí)行,即循環(huán)次數(shù)為零滿足結(jié)束條件,循環(huán)體將一次也不執(zhí)行,即循環(huán)次數(shù)為零STAT: MOV BX, OFFSET D1 ;建數(shù)據(jù)指針建數(shù)據(jù)指針 MOV CX, LENGTH D1 ;置計(jì)數(shù)器初值;置計(jì)數(shù)器初值 初始化部分初始化部分 MOV DX,0 :置結(jié)果初值:置結(jié)果初值 INC CXLOOP1: DEC CX ;控制部分控制部分 JZ DNE MO

58、V AX,BX CMP AX,0 JGE JUS ;大于或等于;大于或等于 轉(zhuǎn)移轉(zhuǎn)移 循環(huán)體循環(huán)體 INC DX JUS: INC BX INC BX ;修改部分;修改部分 JMP LOOP1 DNE: MOV RS, DX ;存結(jié)果;存結(jié)果CODE ENDS END STAT第3章第3章第3章四、子程序 一段程序在一個(gè)程序中多次使用或在多個(gè)程序中一段程序在一個(gè)程序中多次使用或在多個(gè)程序中使用,則可將這段程序抽出來放在內(nèi)存某一區(qū)域,每使用,則可將這段程序抽出來放在內(nèi)存某一區(qū)域,每當(dāng)需要執(zhí)行這段程序時(shí),就用調(diào)用指令轉(zhuǎn)到這段程序當(dāng)需要執(zhí)行這段程序時(shí),就用調(diào)用指令轉(zhuǎn)到這段程序去,執(zhí)行完畢再返回原來程

59、序。這段程序就叫子程序去,執(zhí)行完畢再返回原來程序。這段程序就叫子程序或過程。而調(diào)用它的程序?yàn)橹鞒绦??;蜻^程。而調(diào)用它的程序?yàn)橹鞒绦?。調(diào)用子程序用調(diào)用子程序用CALL指令;子程序結(jié)束返回時(shí)用指令;子程序結(jié)束返回時(shí)用RET指令。必須成對(duì)出現(xiàn)。調(diào)用子程序時(shí),必須進(jìn)棧保護(hù)指令。必須成對(duì)出現(xiàn)。調(diào)用子程序時(shí),必須進(jìn)棧保護(hù)斷點(diǎn)和現(xiàn)場(chǎng)(標(biāo)志寄存器和各寄存器內(nèi)容)。當(dāng)返回?cái)帱c(diǎn)和現(xiàn)場(chǎng)(標(biāo)志寄存器和各寄存器內(nèi)容)。當(dāng)返回時(shí)要出棧恢復(fù)現(xiàn)場(chǎng)和彈出斷點(diǎn),使程序能繼續(xù)執(zhí)行。時(shí)要出?;謴?fù)現(xiàn)場(chǎng)和彈出斷點(diǎn),使程序能繼續(xù)執(zhí)行。CALL直接調(diào)用,目標(biāo)地址就在直接調(diào)用,目標(biāo)地址就在CALL指令中。指令中。間接調(diào)用其目標(biāo)地址在由指令指定

60、的寄存器或內(nèi)存單間接調(diào)用其目標(biāo)地址在由指令指定的寄存器或內(nèi)存單元中。元中。如:如:CALL DWORD PTR BX第3章第3章第3章1.子程序說明組成部分(1)功能描述:包括子程序的名稱、功能、)功能描述:包括子程序的名稱、功能、性能指標(biāo)等。性能指標(biāo)等。(2)所有的寄存器和存儲(chǔ)單元)所有的寄存器和存儲(chǔ)單元(3)子程序入口、出口參數(shù)。)子程序入口、出口參數(shù)。(4)子程序又調(diào)用其它子程序。)子程序又調(diào)用其它子程序。(5)調(diào)用實(shí)例(可有可無)調(diào)用實(shí)例(可有可無)第3章第3章第3章2、子程序中參數(shù)傳遞子程序中允許改變的數(shù)據(jù)叫參數(shù),分為入口參數(shù)子程序中允許改變的數(shù)據(jù)叫參數(shù),分為入口參數(shù)和出口參數(shù)兩種,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論