匯編語言及偽指令打印5章_第1頁
匯編語言及偽指令打印5章_第2頁
匯編語言及偽指令打印5章_第3頁
匯編語言及偽指令打印5章_第4頁
匯編語言及偽指令打印5章_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章 匯編語言及偽指令教學(xué)要求:本章以微軟宏匯編程序MASM 5.x為藍(lán)本,學(xué)習(xí)匯編語言源程序的格式、常用偽指令與操作符;同時,介紹匯編語言源程序的匯編、連接、運行過程,以及修改和調(diào)試方法。 重點難點:源程序格式,常量表達,變量定義及屬性、段定義、過程定義第1節(jié) 匯編程序一、 匯編程序的功能 1.檢查源程序,找出語法錯誤,給出出錯信息。 2.產(chǎn)生目標(biāo)文件(.obj)和列表文件(.lst)。 3.展開宏指令;數(shù)制轉(zhuǎn)換 4.存儲單元分配(變量);段基地址分配第2節(jié) 偽指令一、概述1.語句一般是由分隔符分成的四個部分組成,它們有兩種格式。(1)執(zhí)行性語句由硬指令構(gòu)成的語句,它通常對應(yīng)一條

2、機器指令:       標(biāo)號:   硬指令助記符  操作數(shù),操作數(shù)   ;注釋(2)說明性語句由偽指令構(gòu)成的語句,它通常指示匯編程序如何匯編源程序:          名字    偽指令助記符  參數(shù),參數(shù),.   ;注釋·  標(biāo)號和名字是符合匯編語法的用戶自定義的標(biāo)識符,每個標(biāo)識符的定義是唯一的。標(biāo)識符(I

3、dentifier)一般最多由31個字母、數(shù)字及規(guī)定的特殊符號(如 _、$、?、)組成,不能以數(shù)字開頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識符中的字母大小寫,即大小寫不敏感。·  硬指令助記符可以是任何一條處理器指令,也可以是一條宏指令。偽指令助記符主要將在本章和下一章學(xué)習(xí)。·  處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲單元。偽指令的參數(shù)可以是常數(shù)、變量名、表達式等,可以有多個,參數(shù)之間用逗號分隔。·  語句中由分號“;”開始的部分為注釋內(nèi)容,用以增加源程序的可讀性。·  語句的4個組成部分要用分隔符分開。標(biāo)號后的冒

4、號、注釋前的分號是規(guī)定采用的分隔符,操作數(shù)之間和參數(shù)之間一般使用逗號分隔,其他部分通常采用空格或制表符作為分隔符。多個空格和制表符的作用與一個相同。另外,MASM也支持續(xù)行符“”。偽操作是匯編程序?qū)υ闯绦蜻M行匯編時處理的操作,完成處理器選擇、存儲模式定義、數(shù)據(jù)定義、存儲器分配、指示程序開始結(jié)束等功能。 處理器選擇偽操作(.386) 段定義偽操作 程序開始和結(jié)束偽操作 數(shù)據(jù)定義及存儲器分配偽操作 表達式賦值偽操作 地址計數(shù)器與對準(zhǔn)偽操作 基數(shù)控制偽操作2.程序分段完整的匯編語言源程序也由段組成。    一個匯編語言源程序可以包含若干個代碼段、數(shù)據(jù)段、附加段

5、或堆棧段,段與段之間的順序可隨意排列。      需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點。      所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi)。通常,程序還需要一個堆棧段。二、段的定義1.完整段定義的源程序格式    段名 segment 定位 組合 段字 類別       . ;語句序列(指令、偽指令) &#

6、160;  段名 ends     SEGMENT偽指令定義一個邏輯段的開始,ENDS偽指令表示一個段的結(jié)束。段定義指令后的4個關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類型,代碼段應(yīng)具有code類別,其他為可選屬性參數(shù)。如果不指定,則采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序。 (1) 段定位(align)屬性指定邏輯段在主存儲器中的邊界:        BYTE:段開始為下一個可用的字節(jié)地址(xxxx xxxxb),屬性值為1  

7、;      WORD:段開始為下一個可用的偶數(shù)地址(xxxx xxx0b),屬性值為2        DWORD:段開始為下一個可用的4倍數(shù)地址(xxxx xx00b),屬性值為4        PARA:段開始為下一個可用的節(jié)地址(xxxx 0000b),屬性值為16        PAGE:段開始為下一個可用的頁地址(0000 00

8、00b),屬性值為256      簡化段定義偽指令的代碼和數(shù)據(jù)段默認(rèn)采用WORD定位,堆棧段默認(rèn)采用PARA定位。完整段定義偽指令的默認(rèn)定位屬性是PARA。 (2) 段組合(Combine)屬性指定多個邏輯段之間的關(guān)系:        PRIVATE:本段與其他段沒有邏輯關(guān)系,不與其他段合并。這是完整段定義偽指令默認(rèn)的段組合方式。        PUBLIC:連接程序把本段與所有同名同類型的其他

9、段相鄰地連接在一起,指定一個共同的段地址。這是簡化段定義偽指令默認(rèn)的段組合。        STACK:本段是堆棧的一部分,這是堆棧段必須具有的段組合。 (3) 段字(Use)屬性這是為支持32位段而設(shè)置的屬性。        對于16位x86 CPU來說,它默認(rèn)是16位段,即USE16。而對于匯編32位x86 CPU指令時,它默認(rèn)采用32位段,即USE32;但可以使用USE16指定標(biāo)準(zhǔn)的16位段。編寫運行于實地址方式(8086工作方式)的匯編語

10、言程序,必須采用16位段。 (4) 段類別(Class)屬性當(dāng)連接程序組織段時,將所有的同類別段相鄰分配。         段類別可以是任意名稱,但必須位于單引號中;大多數(shù)MASM程序使用code、data和stack來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)。例如:;lt301b.asm(文件名)stack segment stack ;定義堆棧段stack           dw 5

11、12 dup(?) ;堆棧段的大小是1024字節(jié)(512字)空間stack ends ;堆棧段結(jié)束data segment ;定義數(shù)據(jù)段datastring db Hello,Everybody !,0dh,0ah,$ ;在數(shù)據(jù)段定義要顯示的字符串data ends ;數(shù)據(jù)段結(jié)束code segment code ;定義代碼段code           assume cs:code,ds:data,ss:stack ;確定CS、DS、SS指向的邏輯段start: mov ax,data ;設(shè)置

12、數(shù)據(jù)段的段地址DS           mov ds,ax           mov dx,offset string ;利用功能調(diào)用顯示信息           mov ah,9          

13、; int 21h           mov ax,4c00h ;利用系統(tǒng)功能調(diào)用返回DOS           int 21hcode ends ;代碼段結(jié)束           end start ;匯編結(jié)束,同時表明程序起始點為標(biāo)號start處的指令   

14、60;   完整段定義格式的段定義由SEGMENT和ENDS這一對偽操作實現(xiàn),由代碼段的assume偽指令指定用途。2.指定段寄存器偽指令:  ASSUME  段寄存器:段名 ,段寄存器名:段名, .     ASSUME偽指令通知MASM用指定的段寄存器來尋址對應(yīng)的邏輯段,即建立段寄存器與段的缺省關(guān)系。在明確了程序中各段與段寄存器之間的關(guān)系后,匯編程序會根據(jù)數(shù)據(jù)所在的邏輯段,在需要時自動插入段超越前綴。這是ASSUME偽指令的主要功能。  &#

15、160;  ASSUME偽指令并不為段寄存器設(shè)定初值,連接程序LINK將正確設(shè)置CS : IP和SS : SP。由于數(shù)據(jù)段通常都需要,所以在樣板源程序中,首先為DS賦值;如果使用附加段,還要賦值ES。3.簡化段定義格式:.STACK 大小堆棧段偽指令.STACK創(chuàng)建一個堆棧段,段名是:stack。它的參數(shù)指定堆棧段所占存儲區(qū)的字節(jié)數(shù),默認(rèn)是1KB(= 1024 = 400h字節(jié))。        .DATA數(shù)據(jù)段偽指令.DATA創(chuàng)建一個數(shù)據(jù)段,段名是:_DATA。它用于定義具有初值的變量,當(dāng)然也允許定義無初值的變量

16、。        .CODE 段名.CODE偽指令創(chuàng)建一個代碼段,它的參數(shù)指定該代碼段的段名。 使用簡化段定義,各段名稱和其他用戶所需的信息可以使用MASM預(yù)定義的符號,例如:CODE表示.CODE偽指令定義的段名DATA表示由.DATA、.DATA?等定義的數(shù)據(jù)段的段名4.程序開始與結(jié)束偽指令:.STARTUP .STARTUP偽指令按照給定的CPU類型,根據(jù).MODEL語句選擇的存儲模式、操作系統(tǒng)和堆棧類型,產(chǎn)生程序開始執(zhí)行的代碼;同時還指定了程序開始執(zhí)行的起始點。在DOS下,.STARTUP語句還將

17、初始化DS值,調(diào)整SS和SP值。 如果不使用.STARTUP語句,我們可以用下面2條指令代替(沒有調(diào)整堆棧SS : SP): start: mov ax,data ;data表示數(shù)據(jù)段的段地址           mov ds,ax ;設(shè)置DS  .EXIT 返回數(shù)碼       .EXIT語句產(chǎn)生終止程序執(zhí)行返回操作系統(tǒng)的指令代碼。它的可選參數(shù)是一個返回的數(shù)碼,通常用0表示沒有錯誤。例如.exi

18、t 0對應(yīng)的代碼是:            mov ax,4c00h           int 21h       這是利用了DOS功能調(diào)用的4ch子功能(返回DOS功能:AH = 4ch)實現(xiàn)的,它的入口參數(shù)就是AL = 返回數(shù)碼。5. 匯編結(jié)束偽指令:  END 標(biāo)號    

19、;   END偽指令指示匯編程序MASM到此結(jié)束匯編過程。源程序的最后必須有一條END語句??蛇x的標(biāo)號用于指定程序開始執(zhí)行點,例如start。連接程序據(jù)此設(shè)置CS : IP值。   注意:匯編結(jié)束不同于程序執(zhí)行終止。 過程名稱 PROC 屬性 指令序列 過程名稱 ENDP 屬性: FAR、 NEAR源程序格式:對于大多數(shù)小型MASM程序,采用簡化段定義偽指令,整個源程序格式表達如下:            .model small ;定義程序的存

20、儲模式(一般采用small)           .stack ;定義堆棧段           .data ;定義數(shù)據(jù)段           . ;數(shù)據(jù)定義           .code ;定義代

21、碼段           .startup ;程序起始點,并建立DS、SS內(nèi)容           . ;程序代碼           .exit 0 ;程序結(jié)束點,返回DOS           .

22、 ;子程序代碼           end ;匯編結(jié)束三、變量定義格式  變量定義(Define)偽指令為變量申請固定長度的存儲空間,并可以同時將相應(yīng)的存儲單元初始化。該類偽指令是最經(jīng)常使用的偽指令,它的匯編格式為:           變量名  偽指令  表達式列表      ·

23、0; 變量名為用戶自定義標(biāo)識符,表示初值表首元素的邏輯地址,即用這個符號表示地址,常稱為符號地址。變量名可以沒有,這種情況,匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g,無符號地址。設(shè)置變量名是為了方便存取它指示的存儲單元。     ·  表達式表:是用逗號分隔的參數(shù),主要由數(shù)值常數(shù)、表達式或?、DUP組成。其中?表示初值不確定,即未賦初值;重復(fù)初值可以用DUP進行定義。DUP的格式為:            重復(fù)次數(shù)  DUP(

24、重復(fù)項)     ·  變量定義偽指令有DB / DW / DD / DF / DQ / DT,它們根據(jù)申請的主存空間單位分類。1.字節(jié)定義偽指令DB,用于分配一個或多個字節(jié)單元,并可以將它們初始化為指定值。初值表中每個數(shù)據(jù)一定是字節(jié)量(Byte),可以是0255的無符號數(shù)或是-128+127帶符號數(shù),也可以是字符串常數(shù)。 例如:data segment ;數(shù)據(jù)段X db a,-5Y db ABC,?,4*6Z DB 0,0,0,0,0,0,0,0,0,0R DB 10 DUP(0)data ends  61HFB

25、 41H 42H 43H - 18H利用它們的匯編指令示例: mov al,X ;此處X表示它的第1個數(shù)據(jù),故ALadec X+1 ;對X為始的第2個數(shù)據(jù)減1,故成為-6mov Y,al ;現(xiàn)在Y這個字符串成為 aBC2.字定義偽指令DW字節(jié)定義偽指令DW,用于分配一個或多個字單元,并可以將它們初始化為指定值。初值表中每個數(shù)據(jù)一定是字量(Word),一個字單元可用于存放任何16位數(shù)據(jù),如一個段地址、一個偏移地址、兩個字符、0 65535之間的無符號數(shù)或-32768 +32767之間的帶符號數(shù)。 例如: data segment ;數(shù)據(jù)段count  &#

26、160;   dw 8000h, ?,ABnumber     dw 32array      dw 128 dup(0)data ends3. 雙字定義偽指令DD,用于分配一個或多個雙字單元,并可以將它們初始化為指定值。初值表中每個數(shù)據(jù)是一個32位的雙字量(Double Word),可以是有符號或無符號的32位整數(shù),也可以用來表達16位段地址(高位字)和16位的偏移地址(低位字)的遠(yuǎn)指針。 例如:Var1      DD 0, ? ,

27、 12345678hfarpoint   DD 00400078h4. 定義3字偽指令DF用于為一個或多個6字節(jié)變量分配空間及初始化。       定義4字偽指令DQ用于為一個或多個8字節(jié)變量分配空間及初始化。     定義10字節(jié)偽指令DT用于為一個或多個10字節(jié)變量分配空間及初始化。5.實例:(1).model small           .stack

28、0;          .databvar       DB 16wvar       DW 4*3dvar       DD 4294967295 ;2321FFFFFFFFHqvar DQ ?           DB 1,2

29、,3,4,5tvar       DT 2345abc DB a,b,cmsg DB Hello,13,10,$bbuf       DB 12 DUP(month)dbuf       DD 25 DUP(?)CALLDOS EQU            .code    &#

30、160;      .startup ;建立DS           mov bl,bvar           mov ax,word ptr dvar0 ;取雙字到DX.AX           mov dx,word ptr dvar2

31、0;          mov dx,offset msg           mov ah,09h           CALLDOS           .exit 0 ;返回操作系統(tǒng)  

32、;         end ;匯編結(jié)束四、定位偽指令用數(shù)據(jù)定義偽指令分配的數(shù)據(jù)是按順序一個接著一個存放在數(shù)據(jù)段中的。但有時,我們希望能夠控制數(shù)據(jù)的偏移地址。        ORG 參數(shù) 使它后面的數(shù)據(jù)或指令從參數(shù)指定的地址開始 ORG偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達的偏移地址。例如:           ORG

33、100h ;從100h處安排數(shù)據(jù)或程序           ORG $+10 ;使偏移地址加10,即跳過10個字節(jié)空間匯編語言程序中,符號“$”表示當(dāng)前偏移地址值。例如:在偏移地址100H單元開始定義“dw 1,2,$+4,$+4”,那么在104H單元的值為108H、106H單元的值為10aH。又如:array  DB  12,23,34      len    EQU $-array 那么len

34、的值就是array變量所占的字節(jié)數(shù)。五、地址操作符標(biāo)號和名字一經(jīng)定義便具有以下兩類(地址和類型)三種屬性:      段值:標(biāo)號和名字對應(yīng)存儲單元所在段的段地址;      偏移值:標(biāo)號和名字對應(yīng)存儲單元所在段的段內(nèi)偏移地址;      類型:標(biāo)號、子程序名的類型可以是NEAR(近)和FAR(遠(yuǎn)),分別表示段內(nèi)或段間;變量名的類型可以是BYTE(字節(jié))、WORD(字)和DWORD(雙字)等。    

35、0;       地址操作符取得名字或標(biāo)號的段地址和偏移地址兩個屬性值。例如已經(jīng)熟悉的中括號 表示將括起的表達式作為存儲器地址指針;符號 $ 表示當(dāng)前偏移地址;段前綴的冒號:也是一種地址操作符,它表示采用指定的段地址寄存器。另外,還有兩個經(jīng)常應(yīng)用的地址操作符,就是:         OFFSET 名字/標(biāo)號 ;返回名字或標(biāo)號的偏移地址        SEG 名字/標(biāo)號 ;返回名字或標(biāo)號的段地址&#

36、160;把字節(jié)變量ARRAY的段地址和偏移地址送入DS和BX就可用下列指令序列實現(xiàn):           mov ax,seg array           mov ds,ax           mov bx,offset array ;等價于lea bx,array 在前面學(xué)習(xí)的加、

37、減運算符同樣可以用于地址表達式,例如:       mov cl,array+4       ;等效于mov cl,array4,這里的4表示4個字節(jié)單元。六、類型操作符類型操作符對名字或標(biāo)號的類型屬性進行有關(guān)設(shè)置。        類型名 PTR 名字/標(biāo)號 使名字或標(biāo)號具有指定的類型 PTR操作符中的“類型名”可以是BYTE/WORD/DWORD/FWOR

38、D/QWORD/TBYTE,或者是NEAR/FAR,還可以是由STRUCT、RECORD、UNION以及TYPEDEF定義的類型。使用PTR操作符,可以臨時改變名字或標(biāo)號的類型。     THIS 類型名 創(chuàng)建采用當(dāng)前地址,但為指定類型的操作數(shù) 利用THIS說明的操作數(shù)具有匯編時的當(dāng)前邏輯地址,但具有指定的類型。類型名同PTR操作符中的類型一樣。      TYPE 名字/標(biāo)號 返回一個字量數(shù)值,表明名字或標(biāo)號的類型 另外,操

39、作符SIZEOF和LENGTHOF具有類似TYPE的功能,分別返回整個變量占用的字節(jié)數(shù)和整個變量的數(shù)據(jù)項數(shù)(即元素數(shù))。實際上:           SIZEOF返回值LENGTHOF返回值×TYPE返回值七、應(yīng)用.model small           .stack          

40、; .datav_byte equ this byte           ;v_byte是字節(jié)類型的變量,但與變量v_word地址相同v_word     dw 3332h,3735h ;v_word是字類型的變量target     dw 5 dup (20h) ;分配數(shù)據(jù)空間2×510個字節(jié)crlf       db 0dh,0ah,$fla

41、g       db 0n_point    dw offset s_label ;取得標(biāo)號s_label的偏移地址           .code           .startup           m

42、ov al,byte ptr v_word           ;用ptr改變w_word的類型,否則與AL寄存器類型不匹配           dec al           mov v_byte,al ;對v_word的第一個字節(jié)操作,原來是32H,現(xiàn)在是31Hn_label: cmp fla

43、g,1           jz s_label ;flag單元為1,則轉(zhuǎn)移           inc flag           jmp n_label ;短轉(zhuǎn)移s_label: cmp flag,2        

44、;   jz next ;flag單元為2轉(zhuǎn)移           inc flag           jmp n_point ;段內(nèi)的存儲器間接尋址,轉(zhuǎn)移到標(biāo)號s_label處next: mov ax,type v_word ;匯編結(jié)果為mov ax,2           mov cx,lengthof target ;匯編結(jié)果為mov cx,5           mov si,offset targetw_again: mov si,ax ;對字單元操作           inc si ;SI指針加2  

溫馨提示

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

評論

0/150

提交評論