第四章匯編語(yǔ)言及其程序設(shè)計(jì)ppt課件_第1頁(yè)
第四章匯編語(yǔ)言及其程序設(shè)計(jì)ppt課件_第2頁(yè)
第四章匯編語(yǔ)言及其程序設(shè)計(jì)ppt課件_第3頁(yè)
第四章匯編語(yǔ)言及其程序設(shè)計(jì)ppt課件_第4頁(yè)
第四章匯編語(yǔ)言及其程序設(shè)計(jì)ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩134頁(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、1,微機(jī)原理與測(cè)控接口技術(shù),北京郵電大學(xué)自動(dòng)化學(xué)院 葉 平 Email: Ping.YE Tel: 62282571,2,第四章 匯編語(yǔ)言及其程序設(shè)計(jì),3,本章教學(xué)目標(biāo),一、宏匯編 1. 掌握常用的偽指令:DB,DW,DD,EQU,=,ORG, SEGMENT.ENDS,PROCENDP,ASSUME, MACROENDM,LOCAL,END等 2. 如何匯編、連接生成 .EXE文件 二、程序設(shè)計(jì) 1. 能用匯編語(yǔ)言編寫程序(一般約40條左右)。 2. 能熟練運(yùn)用各種偽指令,包括會(huì)用宏指令(宏定義中如 何用LOCAL定義標(biāo)號(hào))。 3. 能對(duì)程序改錯(cuò),查錯(cuò)且會(huì)完善程序(程序填空)。 4. 編程的

2、題型可能有程序改錯(cuò)、查錯(cuò)、完善、編程等。,4,第一節(jié) x86系列匯編語(yǔ)言格式,5,用匯編語(yǔ)言編寫的程序,匯編源程序 必須翻譯成機(jī)器碼表示的程序,計(jì)算機(jī)才能運(yùn)行。 匯編程序是將匯編語(yǔ)言程序翻譯成機(jī)器語(yǔ)言的一種系統(tǒng)程序 匯編格式指令與機(jī)器指令一一對(duì)應(yīng),用機(jī)器碼編程: A0 00 20 02 06 01 20 A2 02 20,用匯編語(yǔ)言編寫的程序段為: MOV AL , var1 ADD AL , var2 MOV var3 , AL,6,例 在內(nèi)存中有一個(gè)數(shù)據(jù)塊,其首地址為buffer (3000H:0200H),其中存放16位的符號(hào)數(shù)20個(gè)?,F(xiàn)要找出其中的最大值,并將其存入MAX字單元(其偏移

3、地址為0228H)。 借助8086匯編指令,可以編寫出如下程序:,MOV AX,3000H MOV DS,AX MOV SI,0200H MOV CX,14H DEC CX MOV AX,SI CHK: ADD SI,2,CMP SI,AX JLE NEXT MOV AX,SI NEXT: LOOP CHK MOV 0228H,AX INT 20H,7,存儲(chǔ)器分段 code segment code ends 偽指令:不是真正的指令代碼;不產(chǎn)生機(jī)器代碼;指示匯編程序做何種操作,定義代碼段、數(shù)據(jù)段在何處。 code segment assume cs: code mov ax, 3000h mo

4、v ds, ax mov si, 0200h mov cx, 14h,段名 segment 定位類型 組合類型 類別 段名 ends ( Page135 段定義語(yǔ)句),dec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov 0228, ax int 20h code ends,8,data segment data ends stack segment stack ends code segment assume cs: code, ds: data, ss:stack mov ax,

5、 3000h mov ds, ax mov si, 0200h mov cx, 14h,dec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov 0228, ax int 20h code ends,1、定義數(shù)據(jù)段和堆棧段 2、定義變量,變量名 DB 表達(dá)式;,DB、DW、DD等,9,data segment buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw

6、32765, -525, 300 count dw 20 max dw ? data ends stack segment stack ends code segment assume cs: code, ds: data, ss:stack mov ax, 3000h mov ds, ax mov si, 0200h mov cx, 14h,dec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov 0228, ax int 20h code ends,10,data segment b

7、uffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ? data ends stack segment stack ends code segment assume cs: code, ds: data, ss:stack mov ax, data mov ds, ax lea si, buffer mov cx, count,dec cx mov ax, si chk: add si, 2 cmp

8、 si, ax jle next mov ax, si next: loop chk mov max, ax int 20h code ends,11,data segment buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ? data ends stack segment db 100 dup (?) stack ends code segment assume cs: code, ds:

9、 data, ss:stack start:mov ax, data mov ds, ax lea si, buffer mov cx, count,dec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov max, ax int 20h code ends end start,12,指令格式 標(biāo)號(hào):(前綴指令) 助記符(操作數(shù));(注釋) 字符集 符號(hào)的第一個(gè)字符必須是字母、“_”(下劃線)、“?”或“”; 從第二個(gè)字符起,除以上字符外,還可以是數(shù)字; 不使用匯編程序中的保留字; (如

10、指令的助記符等) 對(duì)定義的符號(hào)不區(qū)分大小寫; x,pos100,?date,fir都是合法符號(hào); 10by,cas col是非法字符。 操作數(shù): 常數(shù)、寄存器、內(nèi)存操作數(shù)、標(biāo)號(hào)名、過(guò)程名或表達(dá)式等,CHK: ADD SI,2 ; 地址加2,REP MOVSB ;CX-1,13,data segment buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ? data ends stack segm

11、ent db 100 dup (?) stack ends code segment assume cs: code, ds: data, ss:stack start:mov ax, data mov ds, ax lea si, buffer mov cx, count,dec cx mov ax, si chk: add si, 2 cmp si, ax jle next mov ax, si next: loop chk mov max, ax int 20h code ends end start,;max.asm,14,匯編語(yǔ)言中的常量、變量和標(biāo)號(hào) 1、常量 常量可以是二、十、八或

12、十六進(jìn)制數(shù),也可以是字符串。 10100101B ;二進(jìn)常數(shù) 256D 或256 ;十進(jìn)常數(shù)(缺省/默認(rèn)) 356Q 或356O ;八進(jìn)常數(shù) 2AFH ;十六進(jìn)常數(shù) 0ABCDH ;十六進(jìn)常數(shù),但十六進(jìn)常數(shù)的第一個(gè)字符必須是數(shù)字。 ABCD ;字符串常數(shù),匯編后對(duì)應(yīng)為相應(yīng)的ASCII碼:41H44H 1234 ; 數(shù)字字符串常數(shù),字符串需用單引號(hào) ,匯編后為31H34H,15,2、變量 變量實(shí)際上代表著內(nèi)存單元,也稱內(nèi)存變量(內(nèi)存操作數(shù)),它必然具有段基址和段內(nèi)偏移量。 變量有三個(gè)屬性:段基址,段內(nèi)偏移量及類型(字節(jié)數(shù))。 規(guī)定: 字節(jié)變量 1 字節(jié) ; one DB 01h 字變量 2 字節(jié)

13、 ; two DW ? 雙字變量 4 字節(jié) ; three DD 04030201h,16,3、標(biāo)號(hào) 實(shí)際上是代碼段中某一指令的地址,同樣具有三個(gè)屬性:段基址、段內(nèi)偏移量與類型。 類型有:FAR、NEAR、SHORT FAR (段間引用) NEAR(段內(nèi)引用) 注意:常量、變量的名字以及標(biāo)號(hào)不能用匯編語(yǔ)言的保留字, 即:(指令助記符,CPU的寄存器名,偽指令的符號(hào)等) 例如: AAA: MOV AX, DATA ;錯(cuò)誤,AAA不能做標(biāo)號(hào) DAA DB ? , ? ; 錯(cuò)誤,DAA不能做變量名,CMP AX, BX JGE great XCHG AX, BX great: MOV max, AX

14、,17, CS:0109 80FA3ACMP DL, 3AH CS:010C 7E03JLE 0111 CS:010E 80EA07SUB DL, 07 CS:0111 B104MOV CL, 04 CS:0113 D0E2SHL DL, 1 ,MOV DL, 04,B204,18, CS:0109 B204 MOV DL, 04 CS:010B 80FA3ACMP DL, 3A CS:010E 7E03JLE 0111 CS:0110 80EA07SUB DL, 07 CS:0113 B104 MOV CL, 04 CS:0115 D0E2SHL DL, 1 ,jLess:,jLess,19

15、,4、表達(dá)式 (page 129) 由常量、標(biāo)號(hào)、變量和一些操作符(運(yùn)算符)構(gòu)成。 匯編程序?qū)Ρ磉_(dá)式進(jìn)行運(yùn)算后,得到一個(gè)確定的數(shù)值,再把這個(gè)數(shù)值匯編到指令中。 據(jù)表達(dá)式所表示的內(nèi)容分為:數(shù)字表達(dá)式、地址表達(dá)式。 表達(dá)式是指令的操作數(shù); 表達(dá)式中的操作符由匯編程序完成計(jì)算。 例 MOV AX, 12 - 4 ; MOV AX, 8 ; 數(shù)字表達(dá)式 LEA BX, string + 4 ; 地址表達(dá)式,20,例: 1. 算術(shù)運(yùn)算符 ( +、-、*、/、MOD(%) ) MOV AX, 6 8 MOV AX, 48 MOV AX, 100 MOD 13 MOV AX, 9 2. 邏輯運(yùn)算符 (AND

16、、OR、NOT、XOR) 位操作 MOV AX, 80h OR 70h MOV AX,0F0h 3. 關(guān)系運(yùn)算符 ( EQ、NE、GT、GE、LT、LE ) 真:FFFFH; 假: 0 MOV AX, 1 GE 2 MOV AX, 0,21,4. 分析運(yùn)算符 TYPE,LENGTH,SIZE ,OFFSET,SEG 操作數(shù)必須是內(nèi)存操作數(shù),即變量或標(biāo)號(hào) TYPE 格式:TYPE variable 變量 或 label 標(biāo)號(hào) 回送變量以字節(jié)數(shù)表示的類型 (DB為1,DW為2,DD為4,DQ為8,DT為10) 回送標(biāo)號(hào)類型數(shù)值(NEAR為,F(xiàn)AR為2) 例: ARRAY DW 1,2,3 ADD

17、SI,TYPE ARRAY 經(jīng)匯編程序后的形式:ADD SI,2,; express.asm,22, LENGTH 格式:LENGTH variable 對(duì)于變量中使用DUP,匯編回送分配給變量單元數(shù),其他情況回送1。 例: FESS DD 100 DUP(1) 對(duì)于 MOV CX,LENGTH FESS 匯編后的形式:MOV CX,100 SIZE 格式:SIZE variable 回送分配給該變量的字節(jié)數(shù) LENGTH * TYPE 例:FEES DD 100 DUP(1) MOV CX,SIZE FEES 將形成:MOV CX,400,23,例如 M1 DW 1, 2, 3 匯編后形成指

18、令: M2 DB ABCD MOV BL, LENGTH M1 MOV BL, 1 MOV AL, LENGTH M2 MOV AL, 1 MOV CL, SIZE M1 MOV CL, 2 MOV CH, SIZE M2 MOV CH, 1,24,OFFSET 格式: OFFSET variable 變量 或 label 標(biāo)號(hào) 取出變量或標(biāo)號(hào)所在段的偏移地址 例 MOV BX , OFFSET yy ; MOV BX, 100H 等價(jià)于LEA BX, yy SEG 格式: SEG variable 變量 或 label 標(biāo)號(hào) 取出變量或標(biāo)號(hào)所在段的段基址 例 MOV AX , SEG yy,

19、25,TYPE變量的返回值是類型的字節(jié)數(shù): DB為1,DW為2,DD為4,DQ為8,DT為10; 2. TYPE標(biāo)號(hào)的返回值是: NEAR為-1,F(xiàn)AR為-2。 3. LENGTH變量返回: DUP分配的單元數(shù),對(duì)于其他情況則返回1。 SIZE返回值是: LENGTH和TYPE值的乘積,即變量的字節(jié)數(shù)。,26,27,5. 合成運(yùn)算符 PTR、THIS、HIGH、LOW、SHORT PTR用來(lái)給已分配的存儲(chǔ)單元賦予新的屬性,以保證操作數(shù)的匹配。 例:F1 DB 16H,18H F2 DW 1234H MOV AX , WORD PTR F1 ;轉(zhuǎn)換成字類型與AX匹配 MOV BL, BYTE P

20、TR F2 ;轉(zhuǎn)換成字節(jié)類型與BL匹配,28,THIS 用來(lái)規(guī)定所指變量或標(biāo)號(hào)的類型屬性或距離屬性; 類型:BYTE,WORD,DWORD;距離:NEAR、FAR 例 FIRST EQU THIS BYTE ;將字節(jié)屬性賦予FIRST TABLE DW 200 DUP(?) MOV AX, TABLE + 2 MOV TABLE,0100H MOV byte ptr TABLE, 01h MOV FIRST,01h,與PTR類似,29,HIGH、LOW、SHORT (自學(xué)),30,第二節(jié) 偽指令語(yǔ)句,31, 宏匯編語(yǔ)言中包括如下偽指令語(yǔ)句 數(shù)據(jù)定義語(yǔ)句 (Data definition ) 符

21、號(hào)定義語(yǔ)句 (Symbol definition) 過(guò)程定義語(yǔ)句 (Procedure definition) 段定義語(yǔ)句 (Segmentation definition) 分組定義語(yǔ)句 (Group) 結(jié)束定義語(yǔ)句 (Termination) 主要介紹常用的基本的一些偽指令:即符號(hào)、數(shù)據(jù)、段、過(guò)程、結(jié)束等偽指令。,32,1、數(shù)據(jù)定義語(yǔ)句 格式:符號(hào)名 DB 表達(dá)式 字節(jié) 表達(dá)式可以是下列情況之一: 一個(gè)或多個(gè)字符的字符串(只限于DB類型); 重復(fù)子句:重復(fù)次數(shù) DUP (表達(dá)式) (DUPlicate) ONE DB 1,2,3,4,5 ;定義了5個(gè)常數(shù) TWO DB A ; 定義了一個(gè)字

22、符 THREE DB Welcome you! ; 定義了一個(gè)字符串 FOUR DB ?,? ; 預(yù)置兩個(gè)不確定的值 SIX DB 16 DUP (5,6,7) ;占用48個(gè)內(nèi)存單元,33,BUF DW 1122,3344,5566 ;定義了3個(gè)字(16位)常數(shù) BUF1 DW 128*4 ; 定義了一個(gè)常數(shù)表達(dá)式,由匯編來(lái)運(yùn)算 BUF2 DW 100 DUP (?) 定義雙字(DD),四個(gè)字(DQ),10個(gè)字節(jié)(DT) DD(Define Doubleword);定義雙字(4個(gè)字節(jié)) DQ(Define Quadword ) ;定義4個(gè)字(8個(gè)字節(jié)) DT (Define Tenbyte)

23、;定義10個(gè)字節(jié) DD、DQ、DT與DB/DW語(yǔ)句類似,但不能定義字符串。 THREE DB Welcome to Beijing! ; 定義了一個(gè)字符串,34,字節(jié)變量 1 字節(jié) ; array DB 01h,02h,03h,04h 字變量 2 字節(jié) ; array DW 0201h,0403h 雙字變量 4 字節(jié) ; array DD 04030201h,35,2、符號(hào)定義語(yǔ)句 賦值語(yǔ)句: 符號(hào)名 EQU 表達(dá)式 給符號(hào)定義一個(gè)值或其他符號(hào)名,甚至定義一條可執(zhí)行指令等。EQU對(duì)一個(gè)符號(hào)名只許定義一次。匯編時(shí)用語(yǔ)句中的表達(dá)式代替程序中符號(hào)所在的地方。 例如 COUNT EQU 20 ;把常數(shù)

24、 20 賦給 COUNT BLOCK EQU $-BUF ; 把$-BUF 的值賦給BLOCK,36,B EQU 2BX P8 EQU ES:2BX CBD EQU ADD 定義符號(hào)常量,方便修改程序; 某表達(dá)式多次出現(xiàn)時(shí),用等值操作可以方便編程; 匯編時(shí)不給符號(hào)常量分配內(nèi)存。,37,等號(hào)語(yǔ)句(=) 格式:符號(hào)名 = 表達(dá)式 說(shuō)明:此語(yǔ)句的功能與 EUQ 類似,但該語(yǔ)句在一個(gè)程序中可以對(duì)同一符號(hào)名多次再定義。 例如 A1 = 10 ; A1 定義為 10 A1 = 100 ; A1重定義為100 A1 EQU 20 ; 出錯(cuò),因?yàn)锳1已定義過(guò), ; 不能再用EQU重新定義。,38,標(biāo)號(hào)定義語(yǔ)句

25、(LABEL) 標(biāo)號(hào)名 LABEL 屬性(NEAR/FAR) 用冒號(hào)定義標(biāo)號(hào)(標(biāo)號(hào)名: ),只能定義NEAR屬性 使用LABEL偽指令定義標(biāo)號(hào),可定義NEAR或FAR屬性 NEXT: CALL N-STEP ;定義NEXT為NEAR屬性的標(biāo)號(hào)。 FIRST LABEL FAR ;定義FIRST為FAR標(biāo)號(hào)。其地址為該 MOV AX,CX ;語(yǔ)句的下一條語(yǔ)句的地址。,39,3、過(guò)程定義語(yǔ)句 (Page 139) 格式:過(guò)程名 PROC ( NEAR /FAR ) ;缺省值為NEAR RET 過(guò)程名 ENDP 說(shuō)明: 該語(yǔ)句的PROC與ENDP必須成對(duì)出現(xiàn),過(guò)程名前后必須一致。 屬性可以是NEAR

26、或FAR,表示該過(guò)程可以被段內(nèi)調(diào)用或段間調(diào)用。 例如 SUBPROG PROC FAR 主程序如下 CODE SEGMENT RETF ASSUME CS:CODE,DS:DATA SUBPROG ENDP CALL SUBPROG CODE ENDS,40,4、段定義語(yǔ)句 (Page 135) 格式:段名 SEGMENT 定位類型 組合類型 類別 段名 ENDS 說(shuō)明: 這兩個(gè)偽操作總是一起出現(xiàn)。該語(yǔ)句將匯編語(yǔ)言源程序分成段,由該語(yǔ)句規(guī)定哪個(gè)段是代碼段,哪個(gè)段是數(shù)據(jù)段或堆棧段。 段名不能省略,由程序員指定段名,兩處段名必須一致。 方括號(hào)中的三項(xiàng)是可選項(xiàng),是賦給段名的屬性。各項(xiàng)順序不能錯(cuò),且用

27、空格分開(kāi)。,41, 定位類型 表示此段的起始邊界要求,可以是PAGE,PARA,WORD或BYTE之一。表示如下的地址要求: PAGE = 0000 0000 B PARA = 0000 B (默認(rèn)值) WORD = 0B BYTE = B 它們分別表示以頁(yè)、節(jié)、字、字節(jié)為段的地址邊界,若此 項(xiàng)省略,則默認(rèn)值為PARA(paragraph)。,42, 類別 需用單引號(hào)括起來(lái),可以是任何合法的名稱;如STACK, DATA, CODE code segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si,

28、 offset lista mov di, offset listb main endp code ends 若采用CodeView進(jìn)行符號(hào)調(diào)試(源代碼), 則必須有 CODE,段名 SEGMENT 定位類型 組合類型 類別 段名 ENDS,data segment DATA lista db 55h listb db 55h data ends,43, 組合類型 用來(lái)告訴連接程序(LINK)本段與其他段的關(guān)系。 NONE:本段與其他段邏輯上沒(méi)有關(guān)系,每段都有自己的基地址。(默認(rèn)值) PUBLIC 把本段與同名同類別的其他段連接成一個(gè)段。 COMMON 為本段和同名同類型的其他段指定相同的基址

29、。各段會(huì)產(chǎn)生覆蓋。 AT表達(dá)式 把本段放在表達(dá)式的值所指定的地址上(偏移量按 0 處理), STACK 此段為堆棧段,LINK要求被連接的程序至少有一個(gè)STACK段。 MEMORY 把本段定位在所有其他段之上。,44,data segment DATA listax db 55h listbx db 55h data ends public read code segment CODE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endp code ends end,data seg

30、ment DATA lista db 55h listb db 55h data ends stack segment stack stack dw 6 dup(?) stack ends extrn read: far code segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset lista mov di, offset listb main endp code ends end main,4_2.asm,4_3.asm,45,data segment public DATA

31、listax db 55h listbx db 55h data ends public read code segment CODE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endp code ends end,data segment public DATA lista db 55h listb db 55h data ends stack segment stack stack dw 6 dup(?) stack ends extrn read: far code segm

32、ent CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset lista mov di, offset listb main endp code ends end main,4_2.asm,4_3.asm,46,data segment common DATA listax db 55h listbx db 55h data ends public read code segment CODE read proc far mov si, offset listax mov di, offset l

33、istbx mov cx,100 ret read endp code ends end,data segment common DATA lista db 55h listb db 55h data ends stack segment stack stack dw 6 dup(?) stack ends extrn read: far code segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset lista mov di, offset listb main endp cod

34、e ends end main,4_2.asm,4_3.asm,47,段尋址語(yǔ)句(ASSUME) 格式:ASSUME 段寄存器:段名, 由于段名是任意的 ,匯編程序并不知道哪個(gè)段名對(duì)應(yīng)哪個(gè) 段,所以要用ASSUME偽指令來(lái)指明段寄存器與段名之間 的關(guān)系。 必須寫在代碼段中,一般在段定義語(yǔ)句之后。 段寄存器可以是CS,DS,SS,ES 之一。 ASSUME CS:CODE, DS:DATA, SS:STACK, ES:DATA,48,code segment common DATA listax db 55h listbx db 55h code ends public read data se

35、gment CODE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endp data ends end,code segment common DATA lista db 55h listb db 55h code ends stack segment stack stack dw 6 dup(?) stack ends extrn read: far data segment CODE assume cs:data,ds:code,ss:stack main proc far ca

36、ll read mov si, offset lista mov di, offset listb main endp data ends end main,4_2.asm,4_3.asm,49,對(duì)DS和ES,需要使用寄存器賦值語(yǔ)句,例如: code segment assume cs: code , ds: data , es: edata , ss: stack start: mov ax , seg data mov ds , ax mov ax , seg edata mov es , ax code ends,50,對(duì)于SS寄存器,有兩種情況。一是在程序中定義了組合類型是STACK的

37、段,并在ASSUME語(yǔ)句中建立了該段與SS寄存器的聯(lián)系。例如: stack segment stack db 256 dup (?) stack ends code segment assume cs: code , ds: data , ss: stack code ends 在這種情況下,程序執(zhí)行時(shí),SS會(huì)自動(dòng)裝入STACK段的地址,SP也會(huì)自動(dòng)裝入,因此不必用指令語(yǔ)句進(jìn)行賦值。,51,另一種情況,如果沒(méi)有定義stack組合類型的段,就需要用與DS和ES段同樣的方式進(jìn)行賦值,而且,還要對(duì)SP進(jìn)行賦值,如: stack segment st db 256 dup (?) stack ends

38、 code segment assume cs: code , ds: data , ss: stack start: mov ax , seg stack mov ss , ax mov sp , size st code ends,52,定義偏移地址語(yǔ)句(ORG-origin) 格式:ORG 表達(dá)式 該語(yǔ)句指定了在它之后的程序段或數(shù)據(jù)塊存放的起始地址的偏移量,語(yǔ)句中表達(dá)式的值就是起始地址,從該地址連續(xù)存放程序或數(shù)據(jù),除非遇到一個(gè)新的ORG語(yǔ)句。 例如 DATA SEGMENT ORG 1000H BUF DB 10 DUP (20H) DATA ENDS,53,地址記數(shù)器( $ ) 用來(lái)標(biāo)

39、識(shí)匯編程序當(dāng)前的位置 例 在數(shù)據(jù)段定義的常量和變量如下 W1 DW 0B3H C4 EQU $ - W1 B1 DB ABC C0 EQU $-B1 W2 DW -4,1234H,0F4ADH,923FH C1 EQU($-W2)/2 C2 EQU ($-W2),B3,00,41,42,43,W1,B1,FB,FF,34,12,F4,W2,000,001,002,003,004,005,3F,92,$,AD,54,5、分組語(yǔ)句 格式:組名 GROUP 段名,段名, 說(shuō)明: 該語(yǔ)句又稱為群偽指令。它可以將若干段說(shuō)明為使用同一 物理段,以組名表示其段基址。由段定義偽指令定義的各個(gè) 邏輯段各有不同的

40、物理段基址。 當(dāng)段的數(shù)量較多時(shí),而段寄存器只有四個(gè),為避免進(jìn)行段寄 存器的切換,用GROUP偽指令即可實(shí)現(xiàn)。 組名與段名具有相同的屬性,且可以直接作為段超越符使 用。段名可以是已定義的段名,也可以由“SEG 變量名”或 “SEG 標(biāo)號(hào)”等表達(dá)式取代。,55,數(shù)據(jù)段:64K,data1,data2,data3,data1,data2,data3,64K,data GROUP data1,data2,data3,數(shù)據(jù)段:64K,數(shù)據(jù)段:64K,56,6、結(jié)束語(yǔ)句 格式:END 表達(dá)式 說(shuō)明: 該語(yǔ)句表示整個(gè)源程序的結(jié)束,它告訴匯編程序匯編任務(wù)到此結(jié)束。 表達(dá)式必須是源程序的起始地址或入口地址。 如

41、果幾個(gè)模塊連接在一起,則只能指定主模塊的起始地址。 其他模塊不能有起始地址。 如果不使用選擇項(xiàng)表達(dá)式,則沒(méi)有起始地址傳遞給LINK。 程序就不知道從何處啟動(dòng)。 例如 END START ;START為源程序的起始地址。,57,data segment DATA listax db 55h listbx db 55h data ends public read code segment CODE read proc far mov si, offset listax mov di, offset listbx mov cx,100 ret read endp code ends end,data

42、 segment DATA lista db 55h listb db 55h data ends stack segment stack stack dw 6 dup(01) stack ends extrn read: far code segment CODE assume cs:code,ds:data,ss:stack main proc far call read mov si, offset listaa mov di, offset listb main endp code ends end main,4_2.asm,4_3.asm,58,第三節(jié) 宏匯編和宏指令,59, cod

43、e segment CODE assume cs:code,ds:data,ss:stack start: mov cl, 3 shl bx, cl and bx, 0fh mov cl, 2 shl ax, cl and ax, 0fh code ends ,名字 MACRO 參數(shù),參數(shù), 語(yǔ)句(系列) ENDM shift macro x, y ; 定義的宏名shift mov cl, x ; x,y為形式參數(shù) shl y, cl and y, 0fh endm,60, code segment CODE assume cs:code,ds:data,ss:stack start: mov

44、 cl, 3 shl bx, cl and bx, 0fh mov cl, 2 shl ax, cl and ax, 0fh code ends , code segment CODE assume cs:code,ds:data,ss:stack start: shift 3, bx shift 2, ax code ends ,shift macro x, y ; 定義的宏名shift mov cl, x ; x,y為形式參數(shù) shl y, cl and y, 0fh endm,宏定義,宏調(diào)用,61, code segment CODE assume cs:code,ds:data,ss:

45、stack start: shift 3, bx shift 2, ax code ends ,宏展開(kāi), shift 3, bx B1 03 1 mov cl, 3 D3 E3 1 shl bx, cl 83 E3 0F 1 and bx, 0fh shift 2, ax B1 02 1 mov cl, 2 D3 E0 1 shl ax, cl 25 000F 1 and ax, 0fh ,62,實(shí)參與形參 實(shí)參數(shù)目=形參數(shù)目,則一一對(duì)應(yīng) 實(shí)參數(shù)目形參數(shù)目,多余的實(shí)參被忽略,shift macro x, y ; 定義的宏名shift mov cl, x ; x,y為形式參數(shù) shl y, cl

46、 and y, 0fh endm, code segment CODE assume cs:code,ds:data,ss:stack start: shift 3, bx shift 2, ax code ends ,63,形參不僅可以是操作數(shù),還可以是指令。 addec macro op, x mov al, x op al endm addec inc, 3 addec dec, 34H,宏定義,宏調(diào)用,64,宏運(yùn)算符: 定義堆棧段,默認(rèn)值為1024Byte .CODE 名字 ; 定義代碼段, .DATA ; 定義數(shù)據(jù)段 說(shuō)明:若用簡(jiǎn)化的段定義定義各段,前面的偽指令dosseg和 .mo

47、del不能省略。其他段用 . 打頭,遇到下一個(gè) . 時(shí),此段結(jié)束。,71,dosseg .model small .data buffer dw 0, 1, -5, 10, 256, -128, -100, 45, 6 dw 3, -15, -67, 39, 4, 20, -1668,-32766 dw 32765, -525, 300 count dw 20 max dw ? .stack 100 .code start: mov ax, data mov ds, ax lea si, buffer mov cx, count,dec cx mov ax, si chk: add si, 2

48、 cmp si, ax jle next mov ax, si next: loop chk mov max, ax int 20h end start,簡(jiǎn)化DOS段定義,72,data segment DATA data ends stack segment stack STACK db 100 dup (?) stack ends code segment CODE assume cs:code, ds:data, ss:stack start: mov ax, data mov ds, ax code ends end start,完整段定義的匯編程序設(shè)計(jì)框架,73,data segme

49、nt DATA data ends stack segment stack STACK db 100 dup (?) stack ends code segment CODE assume cs:code, ds:data, ss:stack main proc far mov ax, data mov ds, ax main endp code ends end main,完整段定義的匯編程序設(shè)計(jì)框架,74,dosseg .model small .data .stack 100 .code start: end start,簡(jiǎn)化DOS段定義的匯編程序設(shè)計(jì)框架,dosseg .model s

50、mall .data .stack 100 .code main proc far main endp end main,75,第四節(jié) DOS與BIOS功能調(diào)用,76, 程序控制PC硬件的四種方式,PC硬件,BIOS,DOS,高級(jí)語(yǔ)言,應(yīng)用程序, 直接訪問(wèn)硬件 (用IN, OUT指令) BIOS中斷調(diào)用 DOS 功能調(diào)用 高級(jí)語(yǔ)言調(diào)用 ( printf ),77, BIOS中斷調(diào)用 BIOS:與硬件相關(guān)的基本輸入輸出系統(tǒng),直接與硬件打交道,駐留在ROM中。BIOS提供的服務(wù)程序稱為BIOS中斷調(diào)用。提供底層的服務(wù)程序,與操作系統(tǒng)無(wú)關(guān)。 DOS中斷調(diào)用/功能調(diào)用 為編程人員提供了豐富的服務(wù)程序,

51、程序員在編程時(shí)可直接調(diào)用。DOS提供的服務(wù)程序就稱為DOS功能調(diào)用。DOS調(diào)用與操作系統(tǒng)有關(guān)。,78,DOS中斷調(diào)用 INT n(n20H 27H),中斷指令 INT n,(page 112),79, DOS中斷調(diào)用 (表 4.5 page 151 / 附錄E page382) INT 20H ;程序正常退出 INT 22H ; 程序結(jié)束退出 INT 23H ;Ctrl-break退出 INT 21H ;DOS功能調(diào)用 INT 24H ;嚴(yán)重錯(cuò)誤退出 INT 27H ;程序駐留退出 INT 25H ; 絕對(duì)磁盤讀。入口參數(shù):AL=盤號(hào),CX=讀入扇區(qū)數(shù) DX=起始邏輯扇區(qū)號(hào) DS:BX=緩沖區(qū)

52、地址 出口參數(shù):CF=1 出錯(cuò)(CF為進(jìn)位標(biāo)志) INT 26H ; 絕對(duì)磁盤寫。入口參數(shù):AL=盤號(hào),CX=寫入扇區(qū)數(shù) DX=起始邏輯扇區(qū)號(hào) DS:BX=緩沖區(qū)地址 出口參數(shù):CF=1 出錯(cuò),80,DOS中斷調(diào)用 INT n(n20H 27H) DOS功能調(diào)用:系統(tǒng)功能調(diào)用 提供一組常用子程序 入口參數(shù)設(shè)置 AH = 功能編號(hào) INT 21H,中斷指令 INT n,(page 112),81, DOS 功能調(diào)用 附錄E P382 設(shè)備管理(鍵盤、顯示器、磁盤、串口等) 文件管理(文件建立、打開(kāi)、關(guān)閉、刪除、讀/寫、復(fù)制等) 目錄管理(目錄與子目錄創(chuàng)建、刪除、重新命名、查找等) 其它管理(內(nèi)存

53、分配、釋放、置時(shí)間日期、建網(wǎng)絡(luò)參數(shù)等) 功能調(diào)用方法 按要求設(shè)置入口參數(shù) 調(diào)用編號(hào)送AH 執(zhí)行 INT 21H,mov dx, offset msg mov ah, 09h int 21h,82,data segment public DATA msg db Hello world! $ data ends stack segment stack stack dw 6 dup(?) stack ends code segment CODE assume cs:code,ds:data,ss:stack main proc far mov ax, data mov ds,ax mov dx,of

54、fset msg mov ah,09h int 21h,mov ah,01 int 21h mov ah,4ch int 21h main endp code ends end main,dosint_1.asm,83, 顯示字符 入口:AH = 02 DL = 要顯示的字符的ASCII碼 調(diào)用格式:MOV DL, ? MOV AH, 02H INT 21H 功能:顯示DL寄存器的字符(ASCII碼表示)。 入口:DL中存放要顯示的字符或命令的ASCII碼。 出口:無(wú),84, 顯示字符串 入口:AH = 09 DS:DX = 要顯示的字符串在內(nèi)存的首址, 字符串需用$作結(jié)束符 調(diào)用格式: MOV DX, OFFSET STRING MOV AH, 09H INT 21H 功能: 在屏幕上輸出內(nèi)存中以 符結(jié)束的字符串。 入口:DS : DX指向字符串首地址。 出口:無(wú)

溫馨提示

  • 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)論