版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 平房買賣合同范例
- 農(nóng)村活體運輸合同范例
- 短期個人借款合同范例
- 個人創(chuàng)業(yè)簽約合同范例
- 安全隱患合同范例
- 租賃房房產(chǎn)合同范例
- 廠房倉儲服務(wù)合同范例
- 教師轉(zhuǎn)正勞務(wù)合同范例
- 股商業(yè)合同范例
- 外貿(mào)合同范例俄羅斯
- 軸線翻身課件講稿
- 【企業(yè)盈利能力探析的國內(nèi)外文獻綜述2400字】
- 全國職業(yè)院校技能大賽高職組(智慧物流賽項)備賽試題庫(含答案)
- 2024年新人教版三年級數(shù)學(xué)上冊《第7單元第2課時 周長》教學(xué)課件
- 【核心素養(yǎng)目標(biāo)】浙教版勞動一年級上項目四 任務(wù)一《瓶瓶罐罐做花瓶》教案
- 2024年事業(yè)單位公開選調(diào)工作人員報名及資格審查表
- 2024年全國(保衛(wèi)管理員安全及理論)知識考試題庫與答案
- 幼兒園冬至主題班會課件
- 畜禽解剖生理第八章生殖系統(tǒng)資料教學(xué)課件
- 《2008遼寧省建設(shè)工程計價依據(jù)執(zhí)行標(biāo)準(zhǔn)》大建委發(fā)200875號
- 清潔灌腸護理
評論
0/150
提交評論