第四章匯編語言及其程序設計ppt課件_第1頁
第四章匯編語言及其程序設計ppt課件_第2頁
第四章匯編語言及其程序設計ppt課件_第3頁
第四章匯編語言及其程序設計ppt課件_第4頁
第四章匯編語言及其程序設計ppt課件_第5頁
已閱讀5頁,還剩134頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1,微機原理與測控接口技術,北京郵電大學自動化學院 葉 平 Email: Ping.YE Tel: 62282571,2,第四章 匯編語言及其程序設計,3,本章教學目標,一、宏匯編 1. 掌握常用的偽指令:DB,DW,DD,EQU,=,ORG, SEGMENT.ENDS,PROCENDP,ASSUME, MACROENDM,LOCAL,END等 2. 如何匯編、連接生成 .EXE文件 二、程序設計 1. 能用匯編語言編寫程序(一般約40條左右)。 2. 能熟練運用各種偽指令,包括會用宏指令(宏定義中如 何用LOCAL定義標號)。 3. 能對程序改錯,查錯且會完善程序(程序填空)。 4. 編程的

2、題型可能有程序改錯、查錯、完善、編程等。,4,第一節(jié) x86系列匯編語言格式,5,用匯編語言編寫的程序,匯編源程序 必須翻譯成機器碼表示的程序,計算機才能運行。 匯編程序是將匯編語言程序翻譯成機器語言的一種系統(tǒng)程序 匯編格式指令與機器指令一一對應,用機器碼編程: A0 00 20 02 06 01 20 A2 02 20,用匯編語言編寫的程序段為: MOV AL , var1 ADD AL , var2 MOV var3 , AL,6,例 在內存中有一個數(shù)據(jù)塊,其首地址為buffer (3000H:0200H),其中存放16位的符號數(shù)20個?,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,存儲器分段 code segment code ends 偽指令:不是真正的指令代碼;不產生機器代碼;指示匯編程序做何種操作,定義代碼段、數(shù)據(jù)段在何處。 code segment assume cs: code mov ax, 3000h mo

4、v ds, ax mov si, 0200h mov cx, 14h,段名 segment 定位類型 組合類型 類別 段名 ends ( Page135 段定義語句),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 表達式;,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,指令格式 標號:(前綴指令) 助記符(操作數(shù));(注釋) 字符集 符號的第一個字符必須是字母、“_”(下劃線)、“?”或“”; 從第二個字符起,除以上字符外,還可以是數(shù)字; 不使用匯編程序中的保留字; (如

10、指令的助記符等) 對定義的符號不區(qū)分大小寫; x,pos100,?date,fir都是合法符號; 10by,cas col是非法字符。 操作數(shù): 常數(shù)、寄存器、內存操作數(shù)、標號名、過程名或表達式等,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,匯編語言中的常量、變量和標號 1、常量 常量可以是二、十、八或

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

13、 ; two DW ? 雙字變量 4 字節(jié) ; three DD 04030201h,16,3、標號 實際上是代碼段中某一指令的地址,同樣具有三個屬性:段基址、段內偏移量與類型。 類型有:FAR、NEAR、SHORT FAR (段間引用) NEAR(段內引用) 注意:常量、變量的名字以及標號不能用匯編語言的保留字, 即:(指令助記符,CPU的寄存器名,偽指令的符號等) 例如: AAA: MOV AX, DATA ;錯誤,AAA不能做標號 DAA DB ? , ? ; 錯誤,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、表達式 (page 129) 由常量、標號、變量和一些操作符(運算符)構成。 匯編程序對表達式進行運算后,得到一個確定的數(shù)值,再把這個數(shù)值匯編到指令中。 據(jù)表達式所表示的內容分為:數(shù)字表達式、地址表達式。 表達式是指令的操作數(shù); 表達式中的操作符由匯編程序完成計算。 例 MOV AX, 12 - 4 ; MOV AX, 8 ; 數(shù)字表達式 LEA BX, string + 4 ; 地址表達式,20,例: 1. 算術運算符 ( +、-、*、/、MOD(%) ) MOV AX, 6 8 MOV AX, 48 MOV AX, 100 MOD 13 MOV AX, 9 2. 邏輯運算符 (AND

16、、OR、NOT、XOR) 位操作 MOV AX, 80h OR 70h MOV AX,0F0h 3. 關系運算符 ( EQ、NE、GT、GE、LT、LE ) 真:FFFFH; 假: 0 MOV AX, 1 GE 2 MOV AX, 0,21,4. 分析運算符 TYPE,LENGTH,SIZE ,OFFSET,SEG 操作數(shù)必須是內存操作數(shù),即變量或標號 TYPE 格式:TYPE variable 變量 或 label 標號 回送變量以字節(jié)數(shù)表示的類型 (DB為1,DW為2,DD為4,DQ為8,DT為10) 回送標號類型數(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 對于變量中使用DUP,匯編回送分配給變量單元數(shù),其他情況回送1。 例: FESS DD 100 DUP(1) 對于 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 標號 取出變量或標號所在段的偏移地址 例 MOV BX , OFFSET yy ; MOV BX, 100H 等價于LEA BX, yy SEG 格式: SEG variable 變量 或 label 標號 取出變量或標號所在段的段基址 例 MOV AX , SEG yy,

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

20、TR F2 ;轉換成字節(jié)類型與BL匹配,28,THIS 用來規(guī)定所指變量或標號的類型屬性或距離屬性; 類型: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 (自學),30,第二節(jié) 偽指令語句,31, 宏匯編語言中包括如下偽指令語句 數(shù)據(jù)定義語句 (Data definition ) 符

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

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

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

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

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

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

27、空格分開。,41, 定位類型 表示此段的起始邊界要求,可以是PAGE,PARA,WORD或BYTE之一。表示如下的地址要求: PAGE = 0000 0000 B PARA = 0000 B (默認值) WORD = 0B BYTE = B 它們分別表示以頁、節(jié)、字、字節(jié)為段的地址邊界,若此 項省略,則默認值為PARA(paragraph)。,42, 類別 需用單引號括起來,可以是任何合法的名稱;如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進行符號調試(源代碼), 則必須有 CODE,段名 SEGMENT 定位類型 組合類型 類別 段名 ENDS,data segment DATA lista db 55h listb db 55h data ends,43, 組合類型 用來告訴連接程序(LINK)本段與其他段的關系。 NONE:本段與其他段邏輯上沒有關系,每段都有自己的基地址。(默認值) PUBLIC 把本段與同名同類別的其他段連接成一個段。 COMMON 為本段和同名同類型的其他段指定相同的基址

29、。各段會產生覆蓋。 AT表達式 把本段放在表達式的值所指定的地址上(偏移量按 0 處理), STACK 此段為堆棧段,LINK要求被連接的程序至少有一個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,段尋址語句(ASSUME) 格式:ASSUME 段寄存器:段名, 由于段名是任意的 ,匯編程序并不知道哪個段名對應哪個 段,所以要用ASSUME偽指令來指明段寄存器與段名之間 的關系。 必須寫在代碼段中,一般在段定義語句之后。 段寄存器可以是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,對DS和ES,需要使用寄存器賦值語句,例如: 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,對于SS寄存器,有兩種情況。一是在程序中定義了組合類型是STACK的

37、段,并在ASSUME語句中建立了該段與SS寄存器的聯(lián)系。例如: stack segment stack db 256 dup (?) stack ends code segment assume cs: code , ds: data , ss: stack code ends 在這種情況下,程序執(zhí)行時,SS會自動裝入STACK段的地址,SP也會自動裝入,因此不必用指令語句進行賦值。,51,另一種情況,如果沒有定義stack組合類型的段,就需要用與DS和ES段同樣的方式進行賦值,而且,還要對SP進行賦值,如: 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,定義偏移地址語句(ORG-origin) 格式:ORG 表達式 該語句指定了在它之后的程序段或數(shù)據(jù)塊存放的起始地址的偏移量,語句中表達式的值就是起始地址,從該地址連續(xù)存放程序或數(shù)據(jù),除非遇到一個新的ORG語句。 例如 DATA SEGMENT ORG 1000H BUF DB 10 DUP (20H) DATA ENDS,53,地址記數(shù)器( $ ) 用來標

39、識匯編程序當前的位置 例 在數(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、分組語句 格式:組名 GROUP 段名,段名, 說明: 該語句又稱為群偽指令。它可以將若干段說明為使用同一 物理段,以組名表示其段基址。由段定義偽指令定義的各個 邏輯段各有不同的

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

41、果幾個模塊連接在一起,則只能指定主模塊的起始地址。 其他模塊不能有起始地址。 如果不使用選擇項表達式,則沒有起始地址傳遞給LINK。 程序就不知道從何處啟動。 例如 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ù), 語句(系列) 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,宏定義,宏調用,61, code segment CODE assume cs:code,ds:data,ss:

45、stack start: shift 3, bx shift 2, ax code ends ,宏展開, 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ù)目,多余的實參被忽略,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,宏定義,宏調用,64,宏運算符: 定義堆棧段,默認值為1024Byte .CODE 名字 ; 定義代碼段, .DATA ; 定義數(shù)據(jù)段 說明:若用簡化的段定義定義各段,前面的偽指令dosseg和 .mo

47、del不能省略。其他段用 . 打頭,遇到下一個 . 時,此段結束。,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,簡化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,完整段定義的匯編程序設計框架,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,完整段定義的匯編程序設計框架,74,dosseg .model small .data .stack 100 .code start: end start,簡化DOS段定義的匯編程序設計框架,dosseg .model s

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

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

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

53、分配、釋放、置時間日期、建網(wǎng)絡參數(shù)等) 功能調用方法 按要求設置入口參數(shù) 調用編號送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碼 調用格式:MOV DL, ? MOV AH, 02H INT 21H 功能:顯示DL寄存器的字符(ASCII碼表示)。 入口:DL中存放要顯示的字符或命令的ASCII碼。 出口:無,84, 顯示字符串 入口:AH = 09 DS:DX = 要顯示的字符串在內存的首址, 字符串需用$作結束符 調用格式: MOV DX, OFFSET STRING MOV AH, 09H INT 21H 功能: 在屏幕上輸出內存中以 符結束的字符串。 入口:DS : DX指向字符串首地址。 出口:無

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論