匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩127頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、LINK連接連接編輯編輯源程序源程序PROGR.ASM文件文件PROGR.OBJ文件文件PROGR.EXE文件文件MASM匯編匯編例例4.1 編寫一個(gè)兩個(gè)字相加的程序編寫一個(gè)兩個(gè)字相加的程序 ; *定義數(shù)據(jù)段定義數(shù)據(jù)段DSEG SEGMENT DATA1 DW 0F865H DATA2 DW 360CHDSEG ENDS ;* 定義附加段定義附加段 ESEG SEGMENT SUM DW 2DUP(?)ESEG ENDS CSEG SEGMENTASSUME CS:CSEG,DS:DSEG,ES:ESEGSTART: MOV AX, DSEG MOV DS, AX MOV AX, ESEG M

2、OV ES, AX LEA SI,SUM MOV AX,DATA1 ADD AX,DATA2 MOV ES:SI,AX HLTCSEG ENDS END START標(biāo)號(hào)標(biāo)號(hào):是某指令代碼存放單元的符號(hào)地址是某指令代碼存放單元的符號(hào)地址, 標(biāo)號(hào)后標(biāo)號(hào)后必須有一個(gè)冒號(hào)必須有一個(gè)冒號(hào):。標(biāo)號(hào)的屬性段,偏移量,標(biāo)號(hào)的屬性段,偏移量, 類型(類型(FAR,NEAR)變量變量(名名)某個(gè)存儲(chǔ)器中數(shù)據(jù)單元或數(shù)據(jù)區(qū)的符號(hào)某個(gè)存儲(chǔ)器中數(shù)據(jù)單元或數(shù)據(jù)區(qū)的符號(hào)地址地址, 它代表數(shù)據(jù)單元或數(shù)據(jù)區(qū)。它代表數(shù)據(jù)單元或數(shù)據(jù)區(qū)。變量有三種屬性:段,偏移量,類型變量有三種屬性:段,偏移量,類型 (BYTE,WORD,DWORD

3、,QWORD)例例4.1MOV DX , BLOCK(61)2 該指令語(yǔ)句等價(jià)于該指令語(yǔ)句等價(jià)于MOV DX , BLOCK10它們只能用于數(shù)字表達(dá)式中它們只能用于數(shù)字表達(dá)式中例例4.5: MOV AX , 4 EQ 3; 結(jié)果為假結(jié)果為假等價(jià)于等價(jià)于MOV AX , 0MOV AX , 4 NE 3; 結(jié)果為真結(jié)果為真等價(jià)于等價(jià)于MOV AX , 0FFFFH例例4.6 MOV BX , (PORT_VAL LT 5)AND 20) OR (PORT_VAL GE 5)AND 30)當(dāng)當(dāng) PORT_VAL5時(shí)時(shí), 匯編結(jié)果為匯編結(jié)果為 MOV BX , 30否則,匯編結(jié)果為:否則,匯編結(jié)果為

4、:MOV BX , 20uSEG格式:格式:SEG 變量變量(名名)功能:取變量所在段的段基址功能:取變量所在段的段基址例例4.7MOV AX , SEG ARRAY; (AX) ARRAY的段基址的段基址MOV DS , AX ; (DS) (AX)uOFFSET格式:格式:OFFSET 變量變量/標(biāo)號(hào)標(biāo)號(hào)功能:取變量或標(biāo)號(hào)的偏移地址功能:取變量或標(biāo)號(hào)的偏移地址例例4.7MOV DI , OFFSET DATA1 ;; (DI) DATA1的偏移地址的偏移地址uTYPE格式:格式:TYPE 變量變量/標(biāo)號(hào)標(biāo)號(hào)功能:取變量或標(biāo)號(hào)的功能:取變量或標(biāo)號(hào)的類型值類型值例例4.9 : VARDW ?;

5、 VAR為字變量為字變量ARRAYDD 10 DUP(?);ARRAY為雙字變量為雙字變量STRDB THIS IS TEST ; STR為字節(jié)變量為字節(jié)變量 MOVAX , TYPE VAR; (AX) 2MOVBX , TYPE ARRAY; (BX) 4MOVCX , TYPE STR; (CX) 1例例4.8ARRAY DW 1 , 2 , 3 : ADD SI , TYPE ARRAY匯編后:匯編后: ADD SI , 2 uLENGTH格式:格式:LENGTH 變量(名)變量(名)功能:取重復(fù)定義功能:取重復(fù)定義(DUP)的復(fù)制次數(shù)的復(fù)制次數(shù), 若不若不是是DUP定義,則取數(shù)值定義

6、,則取數(shù)值1。例例4.9 若若: FEES DW 100 DUP (?)對(duì)于指令對(duì)于指令:MOV CX , LENGTH FEES匯編后匯編后:MOV CX , 100例例4.10 若若:ARRAY DW 1 , 2 , 3對(duì)于指令對(duì)于指令:MOV CX , LENGTH ARRAY匯編后為:匯編后為: MOV CX , 1uSIZE格式:格式:SIZE 變量(名)變量(名)功能:取功能:取LENGTH值與值與TYPE值的乘積值的乘積例例4.11 若有若有FEES DW 100 DUP (?)則則TYPE FEES = 2 LENGTH FEES = 100 SIZE FEES = (LENG

7、TH FEES) (TYPE FEES) = 1002 = 200所以所以 MOV CX , SIZE FEES匯編后匯編后: MOV CX , 200表達(dá)式表達(dá)式例例4.12 : INC BX; 操作數(shù)的類型不明確操作數(shù)的類型不明確可用可用PTR操作符對(duì)操作數(shù)明確定義:操作符對(duì)操作數(shù)明確定義: INC WORD PTR BX ;字操作數(shù);字操作數(shù)TWO_BYTE DW ?可用以下語(yǔ)句對(duì)這兩個(gè)字節(jié)賦予另一種類型定義可用以下語(yǔ)句對(duì)這兩個(gè)字節(jié)賦予另一種類型定義ONE_BYTE EQU BYTE PTR TWO_BYTEOTHER_BYTE EQU BYTE PTR (TWO_BYTE+1)OTHE

8、R_BYTE EQU BYTE PTR ONE_BYTE 1ONE_BYTE與與TWO_BYTE 皆為符號(hào)地址皆為符號(hào)地址它們的它們的段段和和偏移量偏移量屬性相同,但屬性相同,但類型類型屬性不同屬性不同前者是前者是BYTE類型,后者是類型,后者是WORD類型。類型。例例4.13 設(shè)已有數(shù)據(jù)定義設(shè)已有數(shù)據(jù)定義如下例例4.14 FIRST_TYPE EQU THIS BYTE WORD_TABLE DW 100 DUP (?)FIRST_TYPE與與WORD_TABLE的段,偏移地址均相的段,偏移地址均相同,但前者是同,但前者是BYTE類型,后者是類型,后者是WORD類型。類型。例例4.15L1E

9、QU THIS FARL:MOV CX ,100L標(biāo)號(hào)與標(biāo)號(hào)與L1標(biāo)號(hào)的段、偏移地址一樣,但類標(biāo)號(hào)的段、偏移地址一樣,但類型不同。型不同。L是是NEAR類型,類型,L1是是FAR類型,允許其他類型,允許其他段的轉(zhuǎn)移指令調(diào)用。段的轉(zhuǎn)移指令調(diào)用。例如例如 : JMP SHORT TAG TAG: 例例4.16STUFF EQU 0ABCDH語(yǔ)句:語(yǔ)句: MOV AH , HIGH STUFF 匯編后:匯編后: MOV AH , 0ABH語(yǔ)句:語(yǔ)句: MOV AL , LOW STUFF 匯編后:匯編后:MOV AL , 0CDH例例4.17DATA_BYTEDB 10 , 4 , 10HDATA_

10、WORDDW 100 , 100H , -5 DATA_DWDDD 320 , 0FFFDHDATA_BYTE 是是字節(jié)字節(jié)類型類型, 其后每個(gè)操作數(shù)占一個(gè)字節(jié)單元。其后每個(gè)操作數(shù)占一個(gè)字節(jié)單元。DATA_WORD 是是字字類型類型, 其后每個(gè)操作數(shù)占兩個(gè)字節(jié)單元。其后每個(gè)操作數(shù)占兩個(gè)字節(jié)單元。DATA_DWD 是是雙字雙字類型類型, 其后每個(gè)操作數(shù)占四個(gè)字節(jié)單元。其后每個(gè)操作數(shù)占四個(gè)字節(jié)單元。例例4.18MESSAGE DBHELLO ABDBAB BADW AB字符串必須用單引號(hào)字符串必須用單引號(hào) 包封包封超過(guò)兩個(gè)字符的字符串只能用超過(guò)兩個(gè)字符的字符串只能用DB定義。定義。例例4.19AB

11、C DB0 , ? , ? , ? , 0DEF DW ? , 52 , ?例例4.21 DUP操作可以嵌套操作可以嵌套, 如以下兩語(yǔ)句等價(jià)。如以下兩語(yǔ)句等價(jià)。ARY3 DB 100 DUP(0, 2 DUP(1, 2), 0, 3)ARY3 DB 0, 1, 2, 1, 2, 0, 3, 0, 1, 2, 1, 2, 0, 3, 100組組例例4.20ARY1 DB 2 DUP (0, 3) 等價(jià)于等價(jià)于ARY1 DB 0, 3, 0, 3, ARY2 DB 50 DUP (1, 2DUP (3, 4), 0)等價(jià)于等價(jià)于ARY2 DB 1, 3, 4, 3, 4, 0, 1, 3, 4,

12、3, 4, 0,50組組例例4.22PAR1DB 1, 2, 3, 4PAR2DB ABCD PAR3DW 0, 1, ? DATA1DB 100 DUP(?) DATA2DW 200 DUP(0)PARM_TABLEDW PAR1 DW PAR2 DW PAR3INTSEG_DATA DD DATA1 DD DATA2例例4.23:CREQU 256; 數(shù)賦于符號(hào)名數(shù)賦于符號(hào)名DATAEQU HIGHT+12 ; 地址表達(dá)式賦予符號(hào)名地址表達(dá)式賦予符號(hào)名LFEQU ASC_TABLE ; 變量賦新符號(hào)名變量賦新符號(hào)名BEQU BP+8 ; 變址方式引用賦于符號(hào)變址方式引用賦于符號(hào)BCBDEQ

13、U AAM; CBD等價(jià)于指令等價(jià)于指令A(yù)AM例例4.24COUNT=10 MOV CX , COUNT; (CX) 10 COUNT = COUNT1 MOV BX , COUNT; (BX) 9 例例4.25AGAINFLABLEFAR AGAIN:PUSHAX AGAIN的類型為的類型為NEAR,允許在本段內(nèi)調(diào)用;,允許在本段內(nèi)調(diào)用;AGAINF的類型為的類型為FAR,允許被其他段調(diào)用;,允許被其他段調(diào)用;AGAIN與與AGAINF的段、偏移屬性均相同。的段、偏移屬性均相同。BYTE: 字節(jié)邊界字節(jié)邊界, 即從任意邊界開始即從任意邊界開始WORD: 字邊界字邊界, 即本段的起始地址必須是

14、偶數(shù)即本段的起始地址必須是偶數(shù)PARA: 節(jié)節(jié)(Paragraph)的邊界開始的邊界開始, 16個(gè)字節(jié)為個(gè)字節(jié)為一個(gè)節(jié)一個(gè)節(jié), 節(jié)邊界的地址應(yīng)為節(jié)邊界的地址應(yīng)為0HPAGE: 頁(yè)頁(yè)(Page)邊界,邊界,256個(gè)字節(jié)為一頁(yè)個(gè)字節(jié)為一頁(yè), 頁(yè)邊頁(yè)邊界起始地址應(yīng)為界起始地址應(yīng)為00H若省略若省略定位類型定位類型 , 則默認(rèn)其為則默認(rèn)其為PARA定位類型定位類型對(duì)本邏輯段邊界定位對(duì)本邏輯段邊界定位例例4.28 SEGMENT偽操作的定位類型應(yīng)用舉例偽操作的定位類型應(yīng)用舉例STACKSEGMENT STACK; STACK段段, PARA邊界邊界 DB 100 DUP(?) ; 長(zhǎng)度為長(zhǎng)度為100字節(jié)

15、字節(jié)STACKENDS ; STACK段結(jié)束段結(jié)束DATA1SEGMINT BYTE; DATA1段段, BYTE邊界邊界STRINGDB this is an example! ; 定義字符串定義字符串DATA1ENDS ; DATA1段結(jié)束段結(jié)束DATA2SEGMINT WORD; DATA2段,段,WORD邊界邊界BUFFERDW 40 DUP(0); 長(zhǎng)度為長(zhǎng)度為40個(gè)字個(gè)字 DATA2ENDS ; DATA2段結(jié)束段結(jié)束CODE1SEGMINT PAGE ; CODE1段段, PAGE邊界邊界 :CODE1ENDS ; CODE1段結(jié)束段結(jié)束CODE2SEGMENT ; CODE2段

16、段, PAGE邊界邊界 :START:MOV AX , STACKMOV SS , AX :CODE2ENDS ; CODE2段結(jié)束段結(jié)束 END START ; 源程序結(jié)束源程序結(jié)束本例的源程序中共有五個(gè)邏輯段,段名和定位類型分別本例的源程序中共有五個(gè)邏輯段,段名和定位類型分別為:為:STACK段段, PARA邊界邊界: 段長(zhǎng)度為段長(zhǎng)度為100個(gè)字節(jié)個(gè)字節(jié)(64H)DATA1段段, BYTE邊界邊界: 段長(zhǎng)度為段長(zhǎng)度為19個(gè)字節(jié)個(gè)字節(jié)(13H)DATA2段段, WORD邊界邊界: 段長(zhǎng)度為段長(zhǎng)度為80個(gè)字節(jié)個(gè)字節(jié)(50H)CODE1段段, PAGE邊界邊界: 段占用段占用13個(gè)字節(jié)個(gè)字節(jié)(0

17、DH)CODE2段段, PARA邊界邊界: 段占用段占用52個(gè)字節(jié)個(gè)字節(jié)(34H)例例4.29 假設(shè)一個(gè)主程序中有五個(gè)邏輯段,段名和類別為:假設(shè)一個(gè)主程序中有五個(gè)邏輯段,段名和類別為:STK1段段 STACK CODE1段段 無(wú)無(wú) DATA1 段段 BUFFER DATA2 段段 TABLE DATA3 段段 BUFFER一個(gè)子程序,有四個(gè)邏輯段,段名和類型分別為:一個(gè)子程序,有四個(gè)邏輯段,段名和類型分別為: DATA4 段段 TABLE DATA5 段段 BUFFER STK2 段段 STACK CODE2 段段 無(wú)無(wú)當(dāng)將主程序和子程序進(jìn)行連接時(shí),兩個(gè)程序模塊中各邏輯段裝入當(dāng)將主程序和子程序

18、進(jìn)行連接時(shí),兩個(gè)程序模塊中各邏輯段裝入內(nèi)存的順序見(jiàn)圖內(nèi)存的順序見(jiàn)圖4.5 DATA3 BUFFERDATA2 TABLE DATA1 BUFFER CODE1 無(wú)無(wú)STK1 STACK段名段名 類別名類別名主程序主程序STK1DATA3DATA5DATA2DATA4CODE1CODE2DATA1STK2STACK無(wú)類別名無(wú)類別名BUFFER TABLE 子程序子程序段名段名 類別名類別名DATA4 TABLE DATA5 BUFFERSTK2 STACK CODE2 無(wú)無(wú)圖圖4.5 邏輯段按類別裝入內(nèi)存示意邏輯段按類別裝入內(nèi)存示意例例4.30 定義各邏輯段之例定義各邏輯段之例data1 seg

19、ment data1 ends ; * data2 segment data2 ends 通常給段寄存器賦值語(yǔ)句為:通常給段寄存器賦值語(yǔ)句為: mov ax ,段名,段名 mov 段寄存器段寄存器 ,axcodesegment assume cs: code, ds: data1, es: data2start:mov ax ,data1 mov ds ,ax mov ax ,data2 mov es ,ax codeends end start例例4.31name1proc far call name2 ret name2 proc near ret name2 endp name1 end

20、pname1、 name2是兩個(gè)是兩個(gè)過(guò)程過(guò)程name1本身是一個(gè)可以被調(diào)用的過(guò)程,而它也可本身是一個(gè)可以被調(diào)用的過(guò)程,而它也可以再調(diào)用其他的過(guò)程。以再調(diào)用其他的過(guò)程。例例4.32 偽操作示意偽操作示意title absolt; data_seg segment; define data segmentoper1dw 12oper2 dw 230resultdw ?data_seg ends; code_seg segment ; define code segment assume cs: code_seg, ds: data_seg start:mov ax , data_seg ; da

21、tarea segment addrmov ds , ax; into DS register; main part of program goes here mov ax , oper1 add ax , oper2 jge store neg axstore: mov result , ax hltcode_seg ends ; end of code segment; end startIF-THEN-ELSE結(jié)構(gòu)結(jié)構(gòu)判定條件判定條件程序程序1YN判定條件判定條件程序程序1CASE結(jié)構(gòu)結(jié)構(gòu)程序程序2程序程序2程序程序 n例例4.34 給定以下符號(hào)函數(shù):給定以下符號(hào)函數(shù):并設(shè)任意給定的并設(shè)

22、任意給定的x值存放在值存放在x單元中,單元中,y存放于存放于y單單元,根據(jù)元,根據(jù)x值確定函數(shù)值確定函數(shù)y的值的值通常用條件轉(zhuǎn)移指令來(lái)產(chǎn)生分枝通常用條件轉(zhuǎn)移指令來(lái)產(chǎn)生分枝y = 1 , 當(dāng)當(dāng) x 0 0 , 當(dāng)當(dāng) x = 0-1 , 當(dāng)當(dāng) x 0開始開始AL0?y -1AL= 0?y 0y 1AL x結(jié)束結(jié)束a. 例例4.34 的流程圖的流程圖YNYNdatax segmentxdb -25ydb ?datax endscodex segmentmainproc far assume cs: codex , dx: dataxstart:push ds movax , 0 push ax mo

23、vax , datax movds , dxmoval , x ; (AL) xb. 編寫程序如下編寫程序如下cmpal , 0jgeloop1 moval , 0ffh; x 0 時(shí)時(shí) moval , 1; y 1 movy , al retloop2: moval , 0; x=0時(shí)時(shí) movy , al; y 0 retmainendpcodex ends end start 例例4.35 設(shè)有首地址為設(shè)有首地址為array的字?jǐn)?shù)組,已按升序排好,的字?jǐn)?shù)組,已按升序排好,數(shù)組長(zhǎng)度為數(shù)組長(zhǎng)度為n=15,且數(shù)據(jù)段與附加段占同一個(gè)段。在該書且數(shù)據(jù)段與附加段占同一個(gè)段。在該書組中查找數(shù)組中查找數(shù)

24、number(如如83), 若找到它,則從數(shù)組中將其若找到它,則從數(shù)組中將其刪掉;若找不到,則把它插入正確位置,且變化后的數(shù)組刪掉;若找不到,則把它插入正確位置,且變化后的數(shù)組長(zhǎng)度在長(zhǎng)度在DX中。中。編程如下:編程如下:datasegmentdw ?ndw 15 numberdw 83 arraydw 5 , 10 , 17 , , 150dataendscodesegmentmainproc far assume cs:code , ds:data , es:datastart: push ds movax , 0 push ax push es movax , data movds , a

25、x moves , ax movax , number; (AX) 待查數(shù)待查數(shù) movdx , n ; 初始化初始化DX movcx , n; 設(shè)置計(jì)數(shù)器設(shè)置計(jì)數(shù)器CX movdi , offset array ; 建立指針建立指針 cld ; 增量方向增量方向repnescasw ;串掃描查找串掃描查找 jedelete decdxmovsi , dx addsi , dxtt3:cmpax , arraysi jltt1 movarraysi+2 , ax; 若未查到,將此數(shù)若未查到,將此數(shù) jmptt2 ; 插入正確位置插入正確位置tt1: movbx , arraysi movarr

26、aysi+2 , bx subsi , 2 jmptt3 tt2:adddx , 2; 修改數(shù)組長(zhǎng)度修改數(shù)組長(zhǎng)度 jmpfandelete: jcxznextloopt: movbx , di; 若查到,從數(shù)組中若查到,從數(shù)組中 movdi-2 , bx; 刪除此數(shù)刪除此數(shù) adddi , 2 looplooptnext : decdx; 修改數(shù)組長(zhǎng)度修改數(shù)組長(zhǎng)度f(wàn)an : popes retmain endp code ends endstart循環(huán)初始狀態(tài)循環(huán)初始狀態(tài)循環(huán)控制條件循環(huán)控制條件循環(huán)體循環(huán)體循環(huán)初始狀態(tài)循環(huán)初始狀態(tài)循環(huán)體循環(huán)體循環(huán)控制條件循環(huán)控制條件YNNY DO_WHILE

27、結(jié)構(gòu)結(jié)構(gòu)DO_UNTIL 結(jié)構(gòu)結(jié)構(gòu)例例4.36 從從xx單元開始的單元開始的30個(gè)連續(xù)單元中存放有個(gè)連續(xù)單元中存放有30個(gè)無(wú)符號(hào)數(shù)個(gè)無(wú)符號(hào)數(shù), 從中找出最大者送入從中找出最大者送入yy單元。單元。編程如下編程如下:dataspsegmentxxdb 73, 59, 61, 45, 81, 107, 14, 64, 54 db 3, 17, 9, 33, 55, 79, 115, 78, 132 db 234, 37, 76, 43, 98, 251, 9, 0, 62 db 9, 145, 54yy db ?datasp ends; codespsegmentassume cs: codesp

28、, ds: dataspmainproc farstart:push ds mov ax , 0 push ax mov ax , datasp mov ds , ax mov al , xx mov bx , offset xx mov cx , 29Loop1: inc bx開始開始AL XX , CX 29BX XX 的有效地址的有效地址BX BX + 1AL BXCX CX 1YY ALCX = 0?AL, BX數(shù)據(jù)交換數(shù)據(jù)交換結(jié)束結(jié)束YNYNcmpal , bx jaeloop2 ; jae:大于等于轉(zhuǎn)移大于等于轉(zhuǎn)移 xchg al , bxLoop2: deccx jnz loop

29、1 movyy , al retmainendpcodesp ends end startuRET (Return) 過(guò)程返回過(guò)程返回例例4.37 調(diào)用程序和子程序在同一代碼段中。調(diào)用程序和子程序在同一代碼段中。MAINPROCFAR;定義主過(guò)程為;定義主過(guò)程為FAR類型類型 ;它視為它視為DOS調(diào)用的子程序調(diào)用的子程序 CALL SUBR1 RETMAIN ENDPSUBR1PROCNEAR RETSUBR1ENDPMAINPROCFAR;定義主過(guò)程為;定義主過(guò)程為FAR類型,指示類型,指示 ;為為DOS調(diào)用的子程序調(diào)用的子程序 CALL SUBR1 RETSUBR1 PROCNEAR RE

30、TSUBR1ENDP MAINENDP 過(guò)程定義可以嵌套,例過(guò)程定義可以嵌套,例4.37可用以下形式:可用以下形式:例例4.38 調(diào)用程序和子程序不在同一代碼段。調(diào)用程序和子程序不在同一代碼段。segxsegment surtproc far ret surt endp call surt segxendssegy segment call subt segy ends例例4.39 把一個(gè)把一個(gè)2位壓縮的位壓縮的BCD碼轉(zhuǎn)換成二進(jìn)制數(shù)。碼轉(zhuǎn)換成二進(jìn)制數(shù)。程序編寫如下:程序編寫如下:data_bin segmentbcd_indb ?; 存放存放bcd值值valuedb ?; 存放二進(jìn)制值存放二

31、進(jìn)制值data_bin endscodesegment assume cs: code; ds: data_binmainproc far push ds mov ax , 0 push axmov ax , data_bin mov ds , ax mov al , bcd_in; 待轉(zhuǎn)換的待轉(zhuǎn)換的 BCD碼碼 callbcd_binary ; 送入送入al寄存器寄存器 movvalue , al retmainendpbcd_binary proc near pushf; 保存狀態(tài)字保存狀態(tài)字 push bx; 保護(hù)保護(hù)bx和和cx push cx movah , al ; BCD數(shù)送入數(shù)

32、送入ah andah , 0fh; 分離分離BCD數(shù)的低位數(shù)數(shù)的低位數(shù) movbl , ah andal , 0f0h; 分離分離BCD數(shù)的高位數(shù)數(shù)的高位數(shù) movcl , 04h; 把把BCD數(shù)高位數(shù)字?jǐn)?shù)高位數(shù)字 roral , cl; 循環(huán)右移,移到低位循環(huán)右移,移到低位 movbh , 0ah; 將轉(zhuǎn)換因子將轉(zhuǎn)換因子10送入送入bh mulbh; BCD數(shù)的高位數(shù)字乘數(shù)的高位數(shù)字乘0ahaddal , bl; 乘積與乘積與BCD數(shù)的低位數(shù)數(shù)的低位數(shù); 相加,結(jié)果送入相加,結(jié)果送入al中中popcx; 恢復(fù)被保護(hù)的寄存器恢復(fù)被保護(hù)的寄存器 popbx popf retbcd_binary

33、endpcode ends end main2.DOS系統(tǒng)功能調(diào)用系統(tǒng)功能調(diào)用例例4.40 顯示字符串顯示字符串: Good morning!MSGDB Good morning!, $ MOV DX , OFFSET MSG MOV AH , 9 INT 21H例例4.41 退回到退回到DOSMOV AH , 4CHINT 21HAL=字符字符從鍵盤輸入一個(gè)字符并從鍵盤輸入一個(gè)字符并回顯在屏幕上回顯在屏幕上1AL=鍵盤功能號(hào)鍵盤功能號(hào)(1, 6, 7, 8, A)清鍵盤緩沖區(qū)清鍵盤緩沖區(qū), 并調(diào)用并調(diào)用一種鍵盤功能一種鍵盤功能CAL=0FFH( 有鍵入有鍵入)AL=00H (無(wú)鍵入無(wú)鍵入)讀

34、鍵盤狀態(tài)讀鍵盤狀態(tài)BDS:DX=緩沖區(qū)首址緩沖區(qū)首址輸入字符串到緩沖區(qū)輸入字符串到緩沖區(qū)AAL=字符字符從鍵盤輸入一個(gè)字符從鍵盤輸入一個(gè)字符, 不回顯不回顯, 檢測(cè)檢測(cè)Ctrl_Break8AL=字符字符從鍵盤輸入一個(gè)字符從鍵盤輸入一個(gè)字符, 不回顯不回顯7AL= 字符字符(若準(zhǔn)備好若準(zhǔn)備好)AL=0 (未準(zhǔn)備好未準(zhǔn)備好)DL=0FFH讀鍵盤字符讀鍵盤字符6功能功能返回參數(shù)返回參數(shù)調(diào)用參數(shù)調(diào)用參數(shù)AH例例4.42 程序顯示一串信息,要求回答程序顯示一串信息,要求回答Y或或 N,回答,回答Y,程序轉(zhuǎn)標(biāo)號(hào)為,程序轉(zhuǎn)標(biāo)號(hào)為YES程序段,而程序段,而N使程序轉(zhuǎn)標(biāo)號(hào)為使程序轉(zhuǎn)標(biāo)號(hào)為 NO程序段。編程如下

35、:程序段。編程如下:gat_key:movah , 1; read a key withint21h; echocmpal , y; is it y ?jeyes; if so, jump to yescmpal , n; is it n ?jeno; if so, jump to nojneget_key; otherwise, ; wait for y or n例例4.43 要求程序在按下要求程序在按下Return鍵后才繼續(xù)運(yùn)行。鍵后才繼續(xù)運(yùn)行。程序段為:程序段為:WAIT_HERE: MOVAH , 7 ; Wait for enterINT21HCMPAL , 0DH ; ASCII

36、code ofJNEWAIT_HERE; Return例如例如 緩沖區(qū)為緩沖區(qū)為10個(gè)字節(jié),若鍵盤輸入字符串個(gè)字節(jié),若鍵盤輸入字符串0D!olleH610例例4.44 設(shè)置一個(gè)緩沖區(qū),并接收字符串設(shè)置一個(gè)緩沖區(qū),并接收字符串 Hello .; 字符串緩沖區(qū)定義如下:字符串緩沖區(qū)定義如下:MAXLENDB 10ACTLEN DB ?STRING DB 10 DUP (?); 輸入字符串的指令如下:輸入字符串的指令如下:MOVAX , SEG STRING ; Initialize DSMOVDS , AXLEADX , MAXLEN;Make DX point;to bufferMOVAH ,

37、0AH ; Input the stringINT21H例例4.45 清除鍵盤緩沖區(qū),然后執(zhí)行清除鍵盤緩沖區(qū),然后執(zhí)行8號(hào)功能。號(hào)功能。MOV AH , 0CHMOV AL , 08H INT 21H例例4.46 檢驗(yàn)鍵盤是否按下,只要任意鍵按下,程檢驗(yàn)鍵盤是否按下,只要任意鍵按下,程序就退出循環(huán)并返回。序就退出循環(huán)并返回。SOUNDER:; sound the toneMOVAH ,0BH ; get keyboard statusINT21H; call DOSINCAL; if al not 0ffh , thenJNZSOUNDER; no key pressed RET; key p

38、ressed return光標(biāo)跟隨字符移動(dòng)光標(biāo)跟隨字符移動(dòng)DL= 字符字符顯示一個(gè)字符顯示一個(gè)字符2字符串必須以字符串必須以$結(jié)結(jié)束,光標(biāo)跟隨字符束,光標(biāo)跟隨字符移動(dòng)移動(dòng)DS:DX=串地址串地址顯示字符串顯示字符串9光標(biāo)跟隨字符移動(dòng)光標(biāo)跟隨字符移動(dòng)DL= 字符字符顯示一個(gè)字符顯示一個(gè)字符6功能功能說(shuō)明說(shuō)明調(diào)用參數(shù)調(diào)用參數(shù)AHDATA SEGMENT MESSAGE DB HOW DO YOU DO ?, 0DH, 0AH, $DATA ENDSCODE SEGMENT MOV AX , DATA MOV DS , AX MOV DX , OFFSET MESSAGE MOV AH , 9 IN

39、T 21H 例例4.47 4.47 在屏幕上顯示一個(gè)字符串。在屏幕上顯示一個(gè)字符串。datasegmentparsdb 100 db ? db 100 dup (?)mesg db what is your name ?db 0dh, 0ah, $data endsstack segment para stack stack db 100 dup (?)stack endscodesegmet assume cs: code, ds: data, ss: stackstartproc far pushds mov ax , 0 pushax mov ax , data mov ds , axd

40、isp: mov dx , offset mesg mov ah , 09 ; 9號(hào)功能顯示提示信息號(hào)功能顯示提示信息 int21hkeybd:mov dx , offset pars mov ah , 10; 10號(hào)功能輸入字符串號(hào)功能輸入字符串 int 21h retstart endpcode segment end start例例4.49 清除左上角清除左上角(0, 0), 右下角右下角(24, 39)的窗口,的窗口,初始化為反相顯示,該窗口相當(dāng)于全屏幕的左半部分。初始化為反相顯示,該窗口相當(dāng)于全屏幕的左半部分。movah , 7; scroll downward functionmo

41、val , 0; code to blank screenmovbh , 70h; reverse video attributemovch , 0; upper left rowmovcl , 0; upper left columnmovdh , 24; lower right rowmovdl , 39; lower right columint10h; video rom calln外部符號(hào)外部符號(hào):在某模塊中定義,而在另一模塊中引用:在某模塊中定義,而在另一模塊中引用的符號(hào)的符號(hào);模塊模塊1extrnvar3: word , ex1: nearextrnex2: farpublicvar1, var2datasegmentvar1db ?var2dw ? dataendscodesegment public code codeendsend 例例4.50 三個(gè)模塊(三個(gè)模塊(module)的連接定義)的連

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論