




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第四章匯編語言程序設(shè)計(jì)方法本章學(xué)習(xí)目標(biāo)熟練掌握匯編語言常用的語法知識(shí)和編程技巧;熟練使用DOS和BIOS提供的中斷調(diào)用,解決 實(shí)際的問題;提示:在學(xué)習(xí)中可以參考C語言的功能用法,看看匯編中有什么一樣和不一樣的地方。內(nèi)容分布4.1 匯編語言基本概念4.2 8086/8088 指令系統(tǒng)4.3匯編語言程序設(shè)計(jì)的基本方法4.4匯編語言程序的編輯、 匯編與連接4.1匯編語言基本概念4.1.1 匯編語言與機(jī)器語言4.1.2 匯編語言中語句的組成4.1.3 匯編語言中的常數(shù)與表達(dá)式4.1.4 變量定義4.1.1匯編語言與機(jī)器語言匯編語言與高級語言的區(qū)別:匯編語言中的語句與機(jī)器的種類和型號(hào)密切相關(guān);使用匯編語
2、言需要對處理器的結(jié)構(gòu)有更加深入的了解;機(jī)器語言:它的每條語句是計(jì)算機(jī)可以直接執(zhí)行的一條指令, 這些指令以二進(jìn)制碼的形式表示。匯編語言:采用一組字母、數(shù)字或符號(hào)來代替一條二進(jìn)制碼表示的指令。匯編語言的特點(diǎn):依賴具體機(jī)器:不同的計(jì)算機(jī)系統(tǒng)有各自的匯編語言;助記符語言:要記住指令符號(hào)的意義,熟悉語法規(guī)則;指令具體化:操作的每一個(gè)步驟要干什么及怎么干都要一一詳細(xì)用指令說明;細(xì)致全面:對計(jì)算機(jī)硬件必須全面了解(如CPU,內(nèi)存組織,I/O組織等);匯編語言指令組成(以8086宏匯編為例):指令:用以指示計(jì)算機(jī)完成的具體操作,具有可操作性,將被匯編成機(jī)器指令;偽指令:用以指示系統(tǒng)如何進(jìn)行匯編,不形成機(jī)器指令
3、;宏指令:將若干指令組織在一起構(gòu)成的一種新指令。 返回本節(jié)首頁4.1.2匯編語言中語句的組成名稱或標(biāo)號(hào) 空格或: 操作助記符 空格 操作數(shù);注釋 例如: CYCLE: ADD AX, 02; (AX)(AX)+2 DATA1 DB 20H, 30H, 40H, 50H 1. 名稱或標(biāo)號(hào) 名稱不是所有語句都必需的,但若語句帶有名稱,通常都表示該名稱后面的部分存儲(chǔ)在內(nèi)存中的第一個(gè)存儲(chǔ)單元的地址。 名稱的命名規(guī)則:可由字母(a、b、c、z),數(shù)字(0、9)以及特殊符號(hào)(?、-、$)組成。2. 操作助記符(或稱助記符) 操作助記符是匯編語言中規(guī)定了明確含義的一組符號(hào),所以不能隨意使用; 例如:ADDA
4、X,53. 操作數(shù) 操作數(shù)不是每條語句所必須的;當(dāng)語句中具有2個(gè)以上的操作數(shù)時(shí),操作數(shù)之間應(yīng)用逗號(hào)“,”分隔,而操作數(shù)與操作助記符之間必須以空格分隔。4. 注釋 匯編語言的注釋是單行注釋,注釋必須以分號(hào)“;”開頭,它不是程序的可執(zhí)行部分,匯編時(shí)不形成任何目標(biāo)碼。返回本節(jié)首頁返回本節(jié)首頁 5、標(biāo)號(hào)屬性: 標(biāo)號(hào)是由標(biāo)識(shí)符表示的指令名稱,用以指示對應(yīng)指令的位置(地址)。它有三個(gè)屬性:段地址、偏移地址和類型; 標(biāo)號(hào)的類型屬性有兩種,即NEAR和FAR; 標(biāo)號(hào)的基本定義方法是在指令的操作助記符前加上標(biāo)識(shí)符和冒號(hào),該標(biāo)識(shí)符就是我們所要定義的標(biāo)號(hào)。 例如: START: PUSH DS 4.1.3匯編語言中
5、的常數(shù)與表達(dá)式1. 常數(shù)-數(shù)值和字符 數(shù)值常數(shù) B: 表示二進(jìn)制數(shù)。 例如, 10110011B。 D: 表示十進(jìn)制數(shù)。 例如, 179D或 179。 O: 表示八進(jìn)制數(shù)。 例如, 263O。 H: 表示十六進(jìn)制數(shù)。 例如, B3H。 當(dāng)一個(gè)數(shù)值數(shù)據(jù)后面沒有后綴時(shí),將默認(rèn)為十進(jìn)制數(shù)。 匯編語言中的數(shù)值常數(shù)的第一位必須是數(shù)字,否則匯編時(shí)將被看成是標(biāo)識(shí)符。例如十六進(jìn)制數(shù)FFH應(yīng)表示成 0FFH。 字符常量:A 41H 65 01000001B 字符串常數(shù): 是由單引號(hào)“”括起來的一串字符。 THIS IS A SUBROUTINE 179 此處的179并不代表十進(jìn)制179,而是字符1、7、9的AS
6、CII碼,即31H,37H和39H。提示:這里的數(shù)據(jù)類型和C語言中有什么不同?2. 表達(dá)式(非重點(diǎn)) 表達(dá)式由操作數(shù)和操作符組成,操作數(shù)可以是常數(shù)或標(biāo)識(shí)符,也可以是子表達(dá)式。算術(shù)操作符: +, -, *, /, MOD; 算術(shù)運(yùn)算都是雙操作數(shù),操作數(shù)必須為數(shù)字操作數(shù),例如:59 其中MOD運(yùn)算的兩個(gè)操作數(shù)必須都為正整數(shù),該運(yùn)算是取兩數(shù)相除的余數(shù),例如:79 MOD 16150B5H MOD 10H05H邏輯操作符:AND、OR、NOT、XOR; 邏輯運(yùn)算的兩個(gè)操作數(shù)的值也應(yīng)為數(shù)字,兩數(shù)進(jìn)行邏輯運(yùn)算的時(shí)候按位進(jìn)行。 邏輯操作符同時(shí)又是邏輯運(yùn)算指令的操作助記符,只有當(dāng)它們出現(xiàn)在指令的操作數(shù)部分時(shí),
7、才是操作符。 AND AL, 0CH OR 0FH關(guān)系操作符:EQ、EN、LT、 GT、 LE、 GE; 關(guān)系運(yùn)算的操作數(shù)也必須是數(shù)字。當(dāng)關(guān)系成立時(shí),其結(jié)果為全1;否則,其結(jié)果為全0。提示: 匯編語言中的表達(dá)式不能構(gòu)成單獨(dú)語句,只能是語句的一個(gè)部分,例如: MOV AX, BUF+2 ADD AL, VAL AND 0FH JMP AGAIN+3 MOV BL, VB LE VA 語句中表達(dá)式的求值不是在執(zhí)行指令時(shí)完成的,而是在對源程序進(jìn)行匯編連接時(shí)完成的;返回本節(jié)首頁4.1.4變量定義1、數(shù)值變量定義 匯編語言的變量定義是通過偽指令定義的,其格式如下: 變量名 DB 表達(dá)式; 定義字節(jié)變量
8、變量名 DW 表達(dá)式; 定義字變量 變量名 DD 表達(dá)式; 定義雙字變量 變量名 DQ 表達(dá)式; 定義長字變量 變量名 DT 表達(dá)式; 定義一個(gè)十字節(jié)變量 DATA1 DB 20H DATA2 DW 0204H, 1000H; DATA3 DB (-1*3),(15/3); DATA4 DD 12345H; DATA5 DB 0123; DATA6 DW AB,C,D; DATA7 DB ?; DATA8 DD ?; DATA9 DB 5 DUP(00); DATA10 DW 3 DUP(?)提示:對比C語言中的變量、方式數(shù)組的定義2、地址變量定義 地址表達(dá)式(只適用DW和DD兩個(gè)偽指令) 如
9、果該地址表達(dá)式為一變量(或標(biāo)號(hào))名,用DW偽指令則是取它的偏移地址來初始化變量,用DD偽指令則是取它的段首址和偏移地址來初始化變量。 例如: A1 DB 12H B2 DW 5DUP(0) BUF1DWA 1 BUF2DDB 23、 變量的屬性 (1) 段地址(SEG): 變量所在段的段地址; (2) 偏移地址(OFFSET): 變量所在段內(nèi)的偏移地址; (3) 類型(TYPE): 變量所占據(jù)的字節(jié)數(shù); (4) 長度(LENGTH):一個(gè)變量名所定義的變量個(gè)數(shù)。在含有DUP操作符的變量定義中,變量名所定義的變量個(gè)數(shù)為定義格式中的重復(fù)次數(shù)。在其它各種變量定義中,每個(gè)變量名所定義的變量個(gè)數(shù)均為 1
10、。 (5) 大小(SIZE): 分配給同一變量名的所有變量的總的字節(jié)數(shù);變量的部分屬性值DATA101000000111DATA201000001212DATA301000005111DATA401000007414DATA50100000B111DATA60100000F212DATA100100001F236變量名段地址偏移地址類型長度大小返回本節(jié)首頁4. 獲取屬性的操作符提示:哪些C語言中有,哪些沒有?例如我們可以有: MOV AX,SIZE DATA9 MOV AX,SEG DATA1 MOV BL, TYPE DATA9我們還可以有如下的變量定義: DAT1 DB 02H DAT2
11、DW 0F00H DAT3 DW 5 DUP(?) DAT4 DB LENGTH DAT3 DAT5 DW DAT3 5. PTR操作符 格式: 類型 PTR 表達(dá)式 格式中的類型可以是:BYTE、WORD、DWORD、 NEAR和FAR。 PTR操作符的功能是用來重新定義已定義的變量或標(biāo) 號(hào)的類型。 MOV BYTE PTR DAT3, AL 變量DAT3 僅在該語句中作為字節(jié)變量使用,DAT3 原來定義的字變量類型并沒有修改。提示:此操作相當(dāng)于C語言中的什么運(yùn)算?返回本節(jié)首頁4.2 8086/8088 指令系統(tǒng)8086/8088 CPU指令系統(tǒng)可分成下面幾類: (1) 數(shù)據(jù)傳送指令; (2
12、) 算術(shù)運(yùn)算指令; (3) 邏輯運(yùn)算指令; (4) 移位指令; (5) 標(biāo)志處理指令和CPU控制指令; (6) 轉(zhuǎn)移和循環(huán)控制指令; (7) 調(diào)用和返回指令; (8) 字符串操作指令; (9) 輸入、 輸出指令。 提示:記住哪一類指令用于哪些編程應(yīng)用,可以對照C語言。各就各位數(shù)值運(yùn)算序列調(diào)整中斷設(shè)置分支循環(huán)子程序數(shù)組移動(dòng)針對接口縮寫與符號(hào)縮寫與符號(hào)意義OPR操作數(shù)SRC源操作數(shù)DST目的操作數(shù)REG寄存器RSRC源寄存器RDST目的寄存器CNT計(jì)數(shù)DISP位移量D88位位移量D1616位位移量ADDR地址縮寫與符號(hào)意義EA有效地址SEG段DATA立即數(shù)互相交換替代(X)X的內(nèi)容邏輯與邏輯或異或
13、XX的反碼4.2.1數(shù)據(jù)傳送類指令 1. 通用傳送指令(MOV) 該類指令的功能是在CPU中的寄存器之間,或者寄存器與存儲(chǔ)單元之間傳送數(shù)據(jù)。 MOV DST,SRC立即數(shù)存儲(chǔ)器寄存器AXBXCXDXSIDISPBPAXBXCXDXSIDISPBP段寄存器DSESSSCS 提示:指令操作數(shù)的多種書寫形式 立即尋址 MOV AX, 1234H MOV AX, OFFSET 變量 MOV AX, TYPE 變量 寄存器間接尋址 寄存器相對尋址和寄存器基址變址相對尋址方式中的位移量DISP可以是常量,也可以是變量,并且可以有多種書寫格式: MOV AX, DISPBX MOV AX, BX+DISP
14、MOV AX, BX.DISP MOV AX, BX+DISPMOV AX,12H MOV AH,12H MOV DI,ES:3SI MOV BP,3BX+SIMOV BUFA,DL MOV BP,AX MOV DS:BP,DLMOV BUF,DS MOV AX,BXMOV DATA1,BL MOV DATA2,BX MOV AX,WORD PTR VALUE;VALUE為字節(jié)變量MOV BX,DX MOV DS,AX提示:注意段地址的默認(rèn)和類型匹配。提示:找出下列指令錯(cuò)誤原因MOV BX,SI MOV 3000H,2000HMOV 34H,ALMOV CS,AXMOV AL,2000HMOV
15、 DS,1234H MOV BX,2000H MOV BXSI,23H MOV AH,3064H MOV BX,AHMOV AX,DATA1 ;DATA1為字節(jié)變量MOV AX, CX MOV AX, BXBP MOV AX, SI+DI MOV DS,ESMOV DATA3SI, 02MOV 4DI, 02 DATA1 DW 05H, 15H, 20H DATA2 DB 0FH, 10H, 0AH DATA3 DB 5 DUP(?) MOV AX, BL MOV AL, DATA1 MOV BX, DATA3SI MOV AL, BYTE PTR DATA1 2. 取有效地址指令(LEA)
16、LEA DST,SRC 指令的功能是將源操作數(shù)SRC的有效地址(偏移地址)送入寄存器REG中。這里的REG不允許是段寄存器,源操作數(shù)的尋址方式不允許是立即數(shù)和寄存器方式。 LEA DI, DATA1 LEA BX, AGAIN MOV AX, OFFSET DATA1 LEA AX, DATA1提示:相當(dāng)于C語言中的什么運(yùn)算?3. 取地址指針指令(LDS, LES) LDS DST,SRC LES DST,SRC 該指令的功能是將源操作數(shù)SRC的有效地址所對應(yīng)的內(nèi)存單元中的 32 位內(nèi)容分別送入DS(或ES)和指令中所指出的寄存器REG中。同樣,這里的REG不允許為段寄存器,源操作數(shù)的尋址方式
17、不允許是立即數(shù)和寄存器方式。例1. LDS DI,2130H 設(shè)(DS)=3000H 32130H DI DS 偏移量 段基址 TABLE DB 10H, 20H, 30H, 40H, 50H POINT1 DD 02001000H POINT2 DD TABLE LDS DI, POINT1 LES SI, POINT2MOV BX, TABLE MOV BX, OFFSET TABLELEA BX, TABLE LDS BX, TABLE LES BX, TABLEBX=?40H00H00H30HTABLEDS:1000H4. 堆棧操作指令 1) 堆棧 當(dāng)信息存入堆棧時(shí),堆棧指針將自動(dòng)減量
18、并將信息存入堆棧指針?biāo)赋龅拇鎯?chǔ)單元,當(dāng)需要從堆棧中取出信息時(shí),也將從堆棧指針?biāo)赋龅拇鎯?chǔ)單元中讀取信息,并自動(dòng)將堆棧指針增量。所以,堆棧指針始終指向堆棧中最后存入信息的那個(gè)單元,我們稱該單元為堆棧頂。在信息的存與取的過程中,棧頂是不斷移動(dòng)的,也稱它為堆棧區(qū)的動(dòng)端,而堆棧區(qū)的另端則是固定不變的,這端我們又稱其為棧底。堆棧示意圖08070605040302010000H00F8H00F9H00FAH00FBH00FCH00FDH00FEH00FFH0100H堆棧區(qū)SP棧底 2) 堆棧操作指令(1)壓入指令 PUSH OPR ; (SP)(SP)2, PUSHF; (SP)1,(SP)(SRC)/
19、(FLAG) MOV AX,8000H MOV SS,AX MOV SP,2000H MOV DX,3E4AH PUSH DX PUSH AX MOV AX, 0FFFFH PUSH AX(2) 彈出指令 POP OPR; (DST)/(FLAG)(SP)+1,(SP) POPF; SPSP+2 MOV SP, 0100H PUSH AX PUSH BX POP AX POP BX返回本節(jié)首頁4.2.2算術(shù)運(yùn)算類指令1. 加法與減法指令 ADD DST, SRC (DST)(SRC)+(DST) ADC DST, SRC (DST)(SRC)+(DST)+CF SUB DST, SRC (DS
20、T)(DST)-(SRC) SBB DST, SRC (DST)(DST)-(SRC)-CF NEG DST(DST)0-(DST)加、減運(yùn)算操作數(shù)之間的關(guān)系 ADD AL, BL ADD CX, 08H ADD AX, SI ADD AX, BXDI SUB AL, CL SUB BX, DX ADC AX, 0 SBB CX, DATA1 帶進(jìn)位的加、減法指令主要用于多位數(shù)的加、減運(yùn)算。例如在內(nèi)存中偏移地址為ADR1 開始的連續(xù)單元中存放著兩個(gè) 4 字節(jié)操作數(shù)A和B, 求該兩數(shù)之和 C, 并將結(jié)果存放于偏移地址為ADR2 開始的連續(xù)單元中,如圖所示。 假設(shè)操作數(shù)由變量定義的方式存入內(nèi)存,并
21、且其段地址已送入DS,偏移地址ADR1 已送入寄存器DI。 2. 比較指令 CMP DST, SRC 比較指令執(zhí)行后的結(jié)果僅僅體現(xiàn)在標(biāo)志寄存器中, 它是為后面的具有判別功能的指令提供條件的。3. 增量和減量指令 INC DST DEC DST 其操作數(shù)的尋址方式可采用除立即數(shù)外的各種尋址方式,但不能是段寄存器。指令的功能是對目的操作數(shù)加 1 或減 1。指令除對進(jìn)位標(biāo)志CF不影響外,其余標(biāo)志都受影響。 INC AL INC WORD PTR 4BX DEC CX4 . 乘法指令與除法指令5. 符號(hào)擴(kuò)展指令 為了保證參加運(yùn)算的兩個(gè)操作數(shù)的類型是一致的,有時(shí)需要將一個(gè) 8 位或 16 位數(shù)進(jìn)行擴(kuò)展。
22、對于一個(gè)無符號(hào)數(shù)來說,這種擴(kuò)展是簡單的,只要將其高位補(bǔ)“0”就可以,但對一個(gè)帶符號(hào)數(shù)來說就不一樣了,擴(kuò)展時(shí)高位補(bǔ)“0”還是補(bǔ)“1”取決于被擴(kuò)展數(shù)的符號(hào)位,也就是,當(dāng)被擴(kuò)展數(shù)是正數(shù)時(shí)高位應(yīng)補(bǔ) 0, 為負(fù)數(shù)時(shí)高位應(yīng)補(bǔ) 1。 CBW 用于將AL擴(kuò)展到AX CWD 用于將AX擴(kuò)展到DX+AX 6. BCD數(shù)調(diào)整指令4.2.3邏輯運(yùn)算類指令 除了NOT指令對標(biāo)志位不產(chǎn)生影響外,其余指令將使CF、OF置 0,并以正常規(guī)則設(shè)置SF、ZF和PF的狀態(tài)。 (AX)=5555H(BX)=0FF00H 邏輯運(yùn)算指令可以通過選用不同的源操作數(shù)的各位代碼, 使目的操作數(shù)的某些位置位、清零和測試目的操作數(shù)的某些位。例如:
23、 OR CL, 03H AND AL, 0F5H XOR AH, 0FH TEST AL, 02H JZ ZER XOR AL, TEST-CODE JZ PROC1返回本節(jié)首頁4.2.4移位指令和循環(huán)移位指令 CNT可以是立即數(shù)或寄存器CL。當(dāng)CNT為立即數(shù)時(shí),其值只能為1;當(dāng)移位的次數(shù)超過1時(shí),CNT應(yīng)為寄存器CL,CL中的內(nèi)容為移位次數(shù)。1.移位指令 (1) SAL/SHL指令 這兩條指令的操作結(jié)果是完全一樣的。每移位一次在右面最低位補(bǔ)一個(gè)0,而左面的最高位則移入標(biāo)志位CF,如圖所示。 (2) SAR指令 該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,但符號(hào)位保持不變,而最低位移至標(biāo)志位
24、CF,如圖所示。(3) SHR指令 該指令每執(zhí)行一次移位操作,就使操作數(shù)右移一位,最低位移至標(biāo)志位CF中。與SAR不同的是,左面的最高位將補(bǔ)0,如圖所示。2. 循環(huán)移位指令4.2.5處理器控制指令與標(biāo)志處理指令返回本章首頁4.3匯編語言程序設(shè)計(jì)的基本方法4.3.1 匯編語言程序設(shè)計(jì)的基本步驟4.3.2 IBM PC匯編語言源程序的完整結(jié)構(gòu)及偽指令4.3.3 程序流程控制4.3.4 系統(tǒng)功能調(diào)用4.3.8 字符串處理4.3.9 宏指令 4.3.1匯編語言程序設(shè)計(jì)的基本步驟 1.分析問題 明確求解問題的意義和任務(wù),經(jīng)過詳細(xì)地了解和分析,將一個(gè)實(shí)際問題轉(zhuǎn)換成計(jì)算機(jī)可以處理的問題。 2.確定算法 確定
25、計(jì)算機(jī)能夠?qū)崿F(xiàn)的有限的解題步驟,即算法。一般可以使用自然語言、類程序設(shè)計(jì)語言或流程圖來描述。 3.編寫程序采用程序設(shè)計(jì)語言來實(shí)現(xiàn)上面確定的算法。采用匯編語言應(yīng)注意以下幾個(gè)問題:詳細(xì)了解所用CPU的編程模型、指令系統(tǒng)、尋 址方式及有關(guān)的偽指令;進(jìn)行存儲(chǔ)空間和工作單元的合理分配;多次使用的程序段可采用子程序或宏指令;盡可能采用標(biāo)號(hào)或變量來代替絕對地址和常數(shù)。4.程序的檢驗(yàn)程序編好以后,必須通過書面的檢查和上機(jī)調(diào)試。5.編寫說明文件完整的說明文件,不僅便于用戶使用,也便于對程序的維護(hù)和擴(kuò)充。返回本節(jié)首頁4.3.2 IBM PC匯編語言源程序的完整結(jié)構(gòu)及偽指令1. 段定義偽指令 段名 SEGMENT定
26、位類型組合類型類別 指令語句或偽指令語句 段名 ENDS 段名是為該段起的名字,用來指出匯編程序?yàn)樵摱畏峙涞拇鎯?chǔ)區(qū)起始位置。 一個(gè)源程序中典型的段結(jié)構(gòu):STACK SEGMENTSTACK ENDS定義堆棧段DATA SEGMENTDATA ENDS定義數(shù)據(jù)段DATA1 SEGMENTDATA1 ENDS定義堆棧段CODE SEGMENTCODE ENDS定義代碼段定義變量與數(shù)組DATA SEGMENT A1 DB A A2 DW 1234H B1 DB 100DUP(?) B2 DW 10DUP(0) C1 DB I am a student!$DATA ENDS定義堆棧 STACK SEG
27、MENT PARA STACK STACK DB 256 DUP(?) TOP LABEL WORD STACK ENDS定義主程序 CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFEST TOP MOV AH, 4CH INT 21H CODE ENDS END START定義子程序(與主程序同段或異段)CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,
28、DATA CALL P1 ;子程序調(diào)用 MOV AH, 4CH INT 21H P1 PROC NEAR MOV AL, BL RET ;返回主程序 P1 ENDP CODE ENDS END STARTCODE1 SEGMENT ASSUME CS:CODE1 P1 PROC NEAR MOV AL, BL RET P1 ENDP CODE1 ENDS4.3.2程序流程控制語句 順序程序 是指程序中每一條指令都是按指令的排列順序執(zhí)行的,是最簡單的一種程序結(jié)構(gòu)。 例 1 寫出計(jì)算y=a*b+c-18 的程序。 題中a=2, b=32, c=-3。 STACK SEGMENT STACK DW
29、256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT a DB 2 b DB 20H c DB 0FDH y DW ? DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP MOV AL, a MOV BL, b IMUL BL MOV BX, AX MOV AL, c CBW ADD AX, BX SUB AX, 18 MOV y, AX MO
30、V AH, 4CH INT 21H CODE ENDS END START 程序的分支結(jié)構(gòu)開始結(jié)束ANP1P2P3單分支結(jié)構(gòu)開始結(jié)束P1P2P3P49B015B10多分支結(jié)構(gòu)無條件轉(zhuǎn)移指令:(范圍大) JMP A1 ;A1為同一段內(nèi)的指令標(biāo)號(hào) JMP FAR PTR B1 ;B1為異段內(nèi)指令標(biāo)號(hào) 條件轉(zhuǎn)移指令:(距離短)條件轉(zhuǎn)移指令只有當(dāng)指令中給定的條件滿足時(shí)才發(fā)生轉(zhuǎn)移,條件判定的依據(jù)是F寄存器的標(biāo)志位當(dāng)前狀態(tài),這些標(biāo)志位的狀態(tài)是由其他指令運(yùn)行時(shí)產(chǎn)生的。條件轉(zhuǎn)移指令的格式及轉(zhuǎn)移條件列表如下: 條件轉(zhuǎn)移指令的尋址方式只有一種,即位移量為8位的相對尋址方式。當(dāng)程序中要求轉(zhuǎn)移的范圍超出-128+12
31、7個(gè)字節(jié)時(shí)需將條件轉(zhuǎn)移與無條件轉(zhuǎn)移結(jié)合使用。指令助記符格式條件說明測試標(biāo)志JZ/JE OPRJNZ/JNE OPRJS OPRJNS OPRJP/JPE OPRJNP/JPO OPRJO OPRJNO OPRJB/JNAE,JC OPRJNB/JAE,JNC OPR結(jié)果為零結(jié)果不為零結(jié)果為負(fù)結(jié)果為正結(jié)果中1個(gè)數(shù)為偶數(shù)結(jié)果中1個(gè)數(shù)為奇數(shù)結(jié)果溢出結(jié)果無溢出結(jié)果低于/不高于或不等于(無符號(hào))結(jié)果不低于/大于或等于(無符號(hào))ZF1ZF0SF1SF0PF1PF0OF1OF0CF1CF0指令助記符格式條件說明測試標(biāo)志JBE/JNA OPRJNBE/JA OPRJL/JNGE OPRJNL/JGE OPRJ
32、LE/JNG OPRJNLE/JG OPR結(jié)果低于或等于/不高于(無符號(hào))結(jié)果不低于或不等于/高于(無符號(hào))小于/不大于或不等于(帶符號(hào))不小于/大于或等于(帶符號(hào))小于或等于/不大于(帶符號(hào))不小于或等于/大于(帶符號(hào))CFZF1(CF0)(ZF=0)SFOF1SFOF0(SFOF)ZF1(SFOF)ZF0分支程序設(shè)計(jì)時(shí)必須注意下面幾個(gè)要點(diǎn):正確選擇判定條件和相應(yīng)的條件轉(zhuǎn)移指令;編程時(shí)必須保證每條分支都能有完整的結(jié)果;在檢查和調(diào)試時(shí)必須逐條分支進(jìn)行,一條或其中幾條分支正確還不足以說明整個(gè)程序正確。例2求某數(shù)X的絕對值,并送回原處。則有公式如下:XX 0XX 0F開始結(jié)束X0FXYN DATA
33、 SEGMENT XADR DW 3456H, 8192H DATA ENDS CODE SEGMENT ASSUME S:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV AX, XADR AND AX, AX ;由于MOV不影響標(biāo)志位 JNS DONE NEG AX MOV XADR, AX DONE: MOV AH, 4CH INT 21H CODE ENDS END STARTCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX, DATA MOV DS, AX MOV AX,
34、 STACK MOV SS, AX MOV SP, OFFEST TOP MOV AX, XADR AND AX, AX JS NEGX ;對照用JNS的差別 JMP DONE NEGX: NEG AX MOV XADR, AX DONE: MOV AH, 4CH INT 21H CODE ENDS END START 例: 寫出將一位十六進(jìn)制數(shù)轉(zhuǎn)換成對應(yīng)的ASCII碼的程序(只考慮大寫字母)。ASCII碼表如下:十六進(jìn)制數(shù)ASCII碼0123456730H31H32H33H34H35H36H37H十六進(jìn)制數(shù)ASCII碼89ABCDEF38H39H41H42H43H44H45H46H流程圖:開
35、始結(jié)束N(AL)(AL)0(AL)9(AL)15(AL)7(AL)(AL)30(AL)0FFH(AL)YYYNNN STACK SEGMENT STACK DW 256 DUP(?) TOP LAEBL WORD STACK ENDS DATA SEGMENT N DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFEST TOP MOV AL, N CMP AL, 0 JL G1 ;小于 CMP
36、 AL, 09 JLE D1 ;小于等于 CMP AL, 15 JA G1 ;大于 ADD AL, 07 ;字符A到9的距離 D1: ADD AL, 30H DONE: MOV AH, 4CH INT 21H G1: MOV AL, 0FFH JMP SHORT DONE CODE ENDS END START返回本節(jié)首頁循環(huán)程序循環(huán)程序的基本結(jié)構(gòu):開始結(jié)束準(zhǔn)備部分循環(huán)工作部分循環(huán)調(diào)整部分出口判定YN循環(huán)控制指令:助記符格式功能說明LOOP OPRLOOPZ/LOOPE OPRLOOPNZ/LOOPNE OPRJCXZ(CX)(CX)1,(CX)0時(shí),轉(zhuǎn)到OPR(CX)(CX)1,(CX)0且
37、ZF1時(shí),轉(zhuǎn)到OPR(CX)(CX)1,(CX)0且ZF0時(shí),轉(zhuǎn)到OPR(CX)0時(shí)轉(zhuǎn)到OPR 指令的尋址方式均為相對尋址方式,且相對位移量為 8 位, 所以其轉(zhuǎn)移范圍不能超過 -128+127。指令中的OPR指出指令的轉(zhuǎn)向地址,它可以為語句標(biāo)號(hào)或語句標(biāo)號(hào)加常量。 單重循環(huán): LEA SI, ADRS LEA DI, ADRD MOV CX, 100;循環(huán)次數(shù) AGAIN: MOV AL, SI MOV ES:DI, AL INC SI INC DI LOOP AGIAN 多重循環(huán): MOV CX, 100;大循環(huán)次數(shù) AGAIN1: MOV AL, AH MOV BL,20;小循環(huán)次數(shù) AG
38、AIN2:MOV SI,DI DEC BL CMP BL, 0 JNZ AGAIN2;小循環(huán)返回 LOOP AGIAN1;大循環(huán)返回 多重循環(huán): MOV CX, 100;大循環(huán)次數(shù) AGAIN1: MOV AL, AH PUSH CX;大循環(huán)次數(shù)保護(hù) MOV CX,20;小循環(huán)次數(shù) AGAIN2:MOV SI,DI LOOP AGAIN2;小循環(huán)返回 POP CX ;大循環(huán)次數(shù)恢復(fù) LOOP AGIAN1;大循環(huán)返回 要求將ADRS開始存放的100個(gè)字節(jié)的數(shù)據(jù)傳送到ADRD開始的連續(xù)內(nèi)存區(qū),假設(shè)它們的段地址分別存放在DS和ES中,程序如下: LEA SI, ADRS LEA DI, ADRD
39、MOV CX, 100 AGAIN: MOV AL, SI MOV ES:DI, AL INC SI INC DI LOOP AGIAN 如上例要求,并稍作改變,即要求最多送100個(gè)字節(jié),當(dāng)傳送過程中出現(xiàn)時(shí),則隨時(shí)結(jié)束傳送 LEA SI, ADRS LEA DI, ADRD MOV CX, 100 MOV AL, SI CMP AL, # JE PEND AGAIN: MOV ES:DI, AL INC SI INC DI MOV AL, SI CMP AL, # LOOPNE AGAIN PEND: 要求比較ADRS和ADRD兩個(gè)數(shù)據(jù)區(qū)中的數(shù)據(jù)是否相等,如果相等則執(zhí)行SAME,否則執(zhí)行NOT
40、_SAME; LEA SI, ADRS LEA DI, ADRD MOV CX, 100 AGAIN: MOV AL, SI MOV BL, ES:DI INC SI INC DI CMP AL, BL LOOPE AGAIN CMP CX, 0 JNZ NOT_SAME SAME: NOT_SAME: 4.3.4 系統(tǒng)功能調(diào)用 在我們的程序中,總會(huì)有數(shù)據(jù)的輸入和輸出。實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出將涉及輸入與輸出設(shè)備的管理,而對輸入、輸出設(shè)備管理的具體操作是十分繁瑣的,好在系統(tǒng)為我們提供了方便。PC DOS系統(tǒng)將輸入、輸出管理程序編寫成一系列子程序,不僅系統(tǒng)可以使用,用戶也可以像調(diào)子程序一樣方便的使用
41、它們。在系統(tǒng)的ROM中也有一組輸入、輸出管理程序可供用戶使用,這組程序通常稱為ROM BIOS(ROM Input/Output System)。 調(diào)用系統(tǒng)提供的子程序,通常稱為系統(tǒng)功能調(diào)用。 功能調(diào)用的基本方法是采用一條軟中斷指令I(lǐng)NT n。所謂軟中斷是以指令的方式產(chǎn)生的中斷,當(dāng)CPU執(zhí)行該指令時(shí),就像響應(yīng)外部中斷一樣的方式轉(zhuǎn)入中斷處理程序,中斷處理程序結(jié)束后又返回到INT指令的下一條指令處。指令中的n為中斷類型號(hào),不同的n將轉(zhuǎn)入不同的中斷處理程序。所以,系統(tǒng)所提供的處理輸入、輸出的子程序是以中斷處理程序的方式編寫的。 DOS系統(tǒng)功能調(diào)用主要是由軟中斷指令I(lǐng)NT 21H實(shí)現(xiàn)的。當(dāng)累加器AH中
42、設(shè)置不同的值時(shí), 指令將完成不同的功能,我們稱AH中設(shè)置的內(nèi)容為功能號(hào)。 該指令的功能大體可分為輸入、輸出設(shè)備管理、 文件管理及目錄管理三個(gè)方面。 DOS系統(tǒng)功能調(diào)用的方法一般可分為以下幾步: 設(shè)置所要調(diào)用功能的入口參數(shù)。 在AH寄存器中存入所要調(diào)用功能的功能號(hào)。 INT 21H指令自動(dòng)轉(zhuǎn)入中斷子程序入口。 相應(yīng)中斷子程序運(yùn)行完畢,可按規(guī)定取得出口參數(shù)。返回本節(jié)首頁 返回本節(jié)首頁MOV AH,1 INT 21H讀鍵盤返回值在ALMOV DL, AMOV AH, 2INT 21H顯示器輸出字符MOV AH,4CHINT 21H返回DOS MOV DX,OFFSET STRINGMOV AH,09
43、HINT 21H將字符數(shù)組STRING輸出顯示器MOV AH, 0AHINT 21H從鍵盤讀入字符串,放在DS:DXMOV AH, 01INT 16H中斷調(diào)用,有鍵按下ZF=0 例 4.3.8 求一字符串的長度, 并要求濾去第一個(gè)非空格字符之前的所有空格。字符串以結(jié)束。 LEA DI, STRING MOV BX, 0 AGAIN1: MOV AL, DI INC DI CMP AL, 20H JE AGAIN1 AGAIN2: CMP AL, JE DONE INC BX MOV AL, DI INC DI JMP AGAIN2 DONE:MOV SLEN, BX 返回本節(jié)首頁例 4.3.1
44、9 從鍵盤上輸入一字符串, 將其送入輸入緩沖區(qū), 并顯示這組字符串。STACK SEGMENT STACK DW 40 DUP(?) TOP LABEL WORDSTACK ENDS;定義堆棧段 DATA SEGMENTSTRING1 DB DO YOU WANT TO INPUT STRING? Y/N):$ CRLF DB 0DH, 0AH, $;回車換行 STRING2 DB PLEASE INPUT STRING., 0DH, 0AH, $ BUFIN DB 20H DB ? BUFIN1 DB 20H DUP(?) DATA ENDS ;定一數(shù)據(jù)段CODE SEGMENT ASSUM
45、E CS:CODE, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP LEA DX, STRING1 MOV AH, 09H INT 21H MOV AH, 01 INT 21H CMP AL, Y JE INPUT CMP AL, y JNE DONEINPUT:LEA DX, CRLF MOV AH, 09H INT 21H LEA DX, STRING2 MOV AH, 09H INT 21H LEA DX, BUFIN MOV AH, 0AH INT
46、 21H MOV AL, BUFIN+1 CBW LEA SI, BUFIN+2 ADD SI, AX MOV BYTE PTR SI, $ LEA DX, CRLF MOV AH, 09 INT 21H LEA DX, BUFIN+2 MOV AH, 09 INT 21HDONE:MOV AH, 4CH INT 21HCODE ENDS END START返回本節(jié)首頁BIOS功能調(diào)用 教材8.3節(jié)顯示系統(tǒng)及其編程本節(jié)自學(xué)實(shí)驗(yàn)一相關(guān)注意下列細(xì)節(jié): 1.系統(tǒng)的顯示方式單色/彩色、字符/圖形 2.如何確定字符或像素位置 3.如何設(shè)置顏色 4.實(shí)現(xiàn)上述功能的調(diào)用命令BIOS功能調(diào)用舉例(第二版P14
47、8)DATA SEGMENTSTRING1 DBHitting any key, the program is finished. C1 DB ADATA ENDSSTACK SEGMENT STACK DW 30H DUP(?)STACK ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES: DATA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV AX, 03H;彩色8025 INT 10H MOV AX, 0600H MOV BH, 07 MOV CX, 0 MOV DX, 184FH
48、 INT 10H MOV AH, 02 MOV BX, 07 MOV DX, 0A0AH INT 10H MOV AX, DATA MOV ES, AX PUSH BP MOV AH, 13H MOV AL, 01 MOV CX, 52 MOV BL, 074H LEA BP, STRING1 INT 10H POP BP MOV C1, A AGAINF:MOV AX, 0601H MOV BH, 3CH MOV CX, 1400H MOV DX, 174FH INT 10H MOV AH, 01 INT 16H JNE DOWN MOV AL, C1 MOV AH, 02 MOV BX,
49、0 MOV DX, 171CH INT 10H MOV AL, C1 MOV AH, 09H MOV BL, 3CH MOV CX, 015 INT 10HDELAY:MOV BX, 400AGAIND:MOV CX, 28000DLOOP:LOOP DLOOP DEC BX CMP BX, 0 JNE AGAIND CMP AL, Z JE D1 INC C1 JMP AGAINFDOWN: MOV AX, 03H INT 10H MOV AH, 4CH INT 21HCODE ENDS END START 返回本節(jié)首頁程序舉例:遞歸子程序, 實(shí)現(xiàn)N!的運(yùn)算。 N!=N*(N-1)!=N*(
50、N-1)*(N-2)!=0!=1 STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT N DW ? RESULT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS;STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP LEA AX,RESULT PUSH AX MOV AX,N PUSH AX CALL FAR PTR FACT MOV AH,4C
51、H INT 21H CODE ENDS CODES SEGMENT ASSUME CS:CODES FACT PROC FAR PUSH BP MOV BP,SP PUSH BX PUSH AX MOV BX,BP+8 MOV AX,BP+6 CMP AX ,0 JE DONE PUSH BX DEC AX CALL FACT MOV BX,BP+8 MOV AX,BX MUL WORD PTR BP+6 JMP SHORT RETURN DONE: MOV AX,01 RETURN:MOV BX,AX POP AX POP BX POP BP RET 4 FACT ENDP CODES EN
52、DS END STARTN1(2)RESULTAXBXBPIPCSN1(1)RESULTAXBXBP1IPCSN1(0)RESULTAXBXBP2IPCSBP1BP2BP3SPRESULT存儲(chǔ)單元?12在N2時(shí)的遞歸調(diào)用過程中堆棧的內(nèi)容:返回程序舉例 編一子程序,實(shí)現(xiàn)給輸出緩沖區(qū)BUFOUT中的一組字符的ASCII碼加偶校驗(yàn)。 作為子程序,緩沖區(qū)的首址一般應(yīng)由主程序提供, 并假設(shè)緩沖區(qū)中的字符個(gè)數(shù)由緩沖區(qū)中的第一個(gè)字節(jié)給出。 CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK STEV PROC NEAR PUSH DS PUSH DI PUSH CX
53、 PUSH AX MOV CL, DI MOV CH, 0 INC DI L1:MOV AL, DI OR AL, 80H JNP L2 MOVDI, AL L2:INC DI LOOP L1 POP AX POP CX POP DI POP DS RET STEV ENDPSTART:MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP LEA DI, BUFOUT CALL STEV MOV AH, 4CH INT 21HCODE ENDSSTACK SEGMENT STACK DW 256 DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENTBUFOUT DB 30H DUP(?)DATA ENDSEND START 返回本節(jié)首頁4.3.5字符串處理(非重點(diǎn))1)字符串傳送指令MOVS 地址指針DI和SI的修正可以是遞增的也可以是遞減的, 當(dāng)標(biāo)志寄存器中方向標(biāo)志位DF=0 時(shí),地址指針以遞增方式修正,反之,則以遞減方式修正。遞增或遞減的值將根據(jù)指令是字操作還是字節(jié)操作而定。 LENG DW
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025海運(yùn)運(yùn)輸合同范本
- 2025翻譯服務(wù)的合同范本
- 2025標(biāo)準(zhǔn)資產(chǎn)管理合同范本
- 2025年國內(nèi)貿(mào)易公司與外籍船員雇傭合同
- 2025年公司與個(gè)人借款合同范本標(biāo)準(zhǔn)版
- 5.2 做自強(qiáng)不惜的中國人 課件 2024-2025學(xué)年統(tǒng)編版道德與法治七年級下冊
- 《課堂互動(dòng)》課件
- 《當(dāng)代臨床輸血技術(shù)》課件
- (63)-考點(diǎn)63 課外-名著閱讀
- (10)-專題10 議論文閱讀
- 美容師考試相關(guān)法律法規(guī)的知識(shí)要點(diǎn)試題及答案
- 《運(yùn)動(dòng)處方》課件-高血壓人群運(yùn)動(dòng)處方案例
- 人工智能技術(shù)與知識(shí)產(chǎn)權(quán)保護(hù)
- 2025年中國數(shù)控轉(zhuǎn)臺(tái)行業(yè)市場規(guī)模及投資前景預(yù)測分析報(bào)告
- 建筑工程技術(shù)畢業(yè)實(shí)踐報(bào)告3000字
- 中國加速康復(fù)外科臨床實(shí)踐指南2021
- 山東省大教育聯(lián)盟學(xué)校2024-2025學(xué)年高三下學(xué)期開學(xué)檢測化學(xué)試題(原卷版+解析版)
- 2025教科版六年級科學(xué)下冊全冊教案【含反思】
- DB43T-稻-再-油生產(chǎn)技術(shù)規(guī)程
- 中國慢性冠脈綜合征患者診斷及管理指南2024版解讀
- 課件:《科學(xué)社會(huì)主義概論(第二版)》第五章
評論
0/150
提交評論