版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、教學(xué)重點學(xué)習(xí)了8086硬指令,接著介紹MASM基本的偽指令。重點掌握:程序的格式、開發(fā)方法參數(shù)的表達、變量的定義變量和標(biāo)號的屬性硬指令和偽指令硬指令使CPU產(chǎn)生動作、并在程序執(zhí)行時才處理的語句,就是我們剛剛學(xué)習(xí)的處理器指令偽指令(Directive)不產(chǎn)生CPU動作、在程序執(zhí)行前由匯編程序處理的說明性語句,例如,數(shù)據(jù)說明、變量定義等等偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān) 本課程采用微軟宏匯編程序 MASM 6.11匯編語言程序的開發(fā)本節(jié)從匯編語言程序的語句格式出發(fā),給出第一個示范性的匯編語言源程序,并演示匯編語言程序的過程:編輯 匯編 連接 調(diào)試即匯編語言程序的開發(fā)方法語句格式
2、 執(zhí)行性語句由硬指令構(gòu)成的語句,它通常對應(yīng)一條機器指令,出現(xiàn)在程序的代碼段中:標(biāo)號: 硬指令助記符 操作數(shù),操作數(shù);注釋 說明性語句由偽指令構(gòu)成的語句,它通常指示匯編程序如何匯編源程序:名字 偽指令助記符 參數(shù),參數(shù),;注釋MOV CX,0;傳送指令,具有2個操作數(shù)DELAY:NOP;空操作指令,沒有操作數(shù),帶有標(biāo)號LOOP DELAY;循環(huán)指令,標(biāo)號DELAY說明轉(zhuǎn)移位置BUFFERDB 1,2,3,4,5,6,7;數(shù)據(jù)定義偽指令,在主存中開辟7個連續(xù)的字節(jié)單元,初值依次為17,BUFFER表示首地址匯編語言語句實例標(biāo)號、名字與標(biāo)識符標(biāo)號是反映硬指令位置(邏輯地址)的標(biāo)識符,后跟一個冒號分隔
3、名字是反映偽指令位置(邏輯地址)和屬性的標(biāo)識符,后跟空格或制表符分隔,沒有一個冒號標(biāo)識符(Identifier)一般最多由31個字母、數(shù)字及規(guī)定的特殊符號(如 _、$、?、)組成,不能以數(shù)字開頭。默認(rèn)情況下,匯編程序不區(qū)別標(biāo)識符中的字母大小寫一個程序中,每個標(biāo)識符的定義是唯一的,還不能是匯編語言采用的保留字保留字保留字(Reserved Word)是匯編程序已經(jīng)利用的標(biāo)識符,主要有:硬指令助記符例如:MOV、ADD偽指令助記符例如:DB、EQU操作符例如:OFFSET、PTR寄存器名例如:AX、CS預(yù)定義符號例如:data助記符硬指令助記符可以是任何一條處理器指令,也可以是一條宏指令偽指令助記
4、符將在本節(jié)學(xué)習(xí)定義字節(jié)數(shù)據(jù)和字符串的DB就是偽指令操作數(shù)與參數(shù)處理器指令的操作數(shù)可以是立即數(shù)、寄存器和存儲單元偽指令的參數(shù)可以是常數(shù)、變量名、表達式等,可以有多個,參數(shù)之間用逗號分隔注釋語句中由分號“;”開始的部分為注釋內(nèi)容,用以增加源程序的可讀性必要時,一個語句行也可以由分號開始作為階段性注釋匯編程序在翻譯源程序時將跳過該部分,不對它們做任何處理分隔符語句的4個組成部分要用分隔符分開標(biāo)號后用冒號,注釋前用分號操作數(shù)之間和參數(shù)之間使用逗號分隔其他部分通常采用空格或制表符多個空格和制表符的作用與一個相同MASM支持續(xù)行符 “”匯編語言源程序的組成原則完整的匯編語言源程序由段組成一個匯編語言源程序
5、可以包含若干個代碼段、數(shù)據(jù)段、附加段或堆棧段,段與段之間的順序可隨意排列需獨立運行的程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點所有的可執(zhí)行性語句必須位于某一個代碼段內(nèi),說明性語句可根據(jù)需要位于任一段內(nèi)通常,程序還需要一個堆棧段匯編語言源程序源程序分別用兩種格式書寫第一種格式從MASM 5.0開始支持簡化段定義格式第二種格式MASM 5.0以前就具有完整段定義格式Hello, Everybody !程序功能;test1.asm(文件名).model small;定義程序的存儲模式.stack;定義堆棧段.data;定義數(shù)據(jù)段stringdb Hello, Everyb
6、ody !,0dh,0ah,$;在數(shù)據(jù)段定義要顯示的字符串.code;定義代碼段.startup;程序起始點,建立DS、SSmov dx,offset string;指定字符串mov ah,9int 21h;利用功能調(diào)用顯示信息.exit 0;程序結(jié)束點,返回DOSend;匯編結(jié)束例1a:簡化段定義格式抽象;SampleA.ASM.model small.stack.data.;在數(shù)據(jù)段定義數(shù)據(jù).code.startup;(注1).;在代碼段填入指令序列.exit 0;(注2).;子程序代碼end;(注3)簡化段定義格式 MASM 6.x支持;test2.asm(文件名)stacksegmen
7、t stack;定義堆棧段dw 512 dup(?);堆棧段有512字(1024字節(jié))空間stackends;堆棧段結(jié)束datasegment;定義數(shù)據(jù)段stringdb Hello, Everybody !,0dh,0ah,$dataendscodesegment code;定義代碼段assume cs:code,ds:data,ss:stackstart:mov ax,data;建立DS段地址mov ds,ax例1b:完整段定義格式mov dx,offset stringmov ah,9int 21hmov ax,4c00hint 21h;利用功能調(diào)用返回DOScodeends;代碼段結(jié)束
8、end start;匯編結(jié)束,同時指明程序起始點例1b:完整段定義格式抽象匯編語言程序的開發(fā)過程編輯文本編輯器,如 EDIT.COM源程序:文件名.asm匯編匯編程序,如 ML.EXE目標(biāo)模塊:文件名.obj連接連接程序,如 LINK.EXE可執(zhí)行文件:文件名.exe調(diào)試調(diào)試程序,如 DEBUG.EXE應(yīng)用程序錯誤錯誤錯誤錯誤開發(fā)過程1:源程序的編輯源程序文件要以ASM為擴展名源程序文件的形成(編輯)可以通過任何一個文本編輯器實現(xiàn):DOS中的全屏幕文本編輯器EDIT其他程序開發(fā)工具中的編輯環(huán)境MASM程序員工作平臺PWB中的編輯環(huán)境EDIT test1.asm開發(fā)過程2:源程序的匯編匯編是將源
9、程序翻譯成由機器代碼組成的目標(biāo)模塊文件的過程MASM 6.x提供的匯編程序是ML.EXE:ML /c test1.asm如果源程序中沒有語法錯誤,MASM將自動生成一個目標(biāo)模塊文件(TEST1.obj);否則MASM將給出相應(yīng)的錯誤信息這時應(yīng)根據(jù)錯誤信息,重新編輯修改源程序后,再進行匯編開發(fā)過程3:目標(biāo)模塊的連接連接程序能把一個或多個目標(biāo)文件和庫文件合成一個可執(zhí)行程序(.EXE、.COM文件):LINK test1.obj如果沒有嚴(yán)重錯誤,LINK將生成一個可執(zhí)行文件(test1.exe);否則將提示相應(yīng)的錯誤信息這時需要根據(jù)錯誤信息重新修改源程序后再匯編、鏈接,直到生成可執(zhí)行文件匯編和連接的
10、依次自動實現(xiàn)ML匯編程序可自動調(diào)用LINK連接程序,實現(xiàn)匯編和連接的依次進行ML test1.asm匯編程序ML.EXE可帶其他參數(shù),常用ML /Fl /Sg test1.asm該命令除產(chǎn)生模塊文件test1.obj和可執(zhí)行文件test1.exe外,還將生成列表文件test1.lst列表文件是一種文本文件,含有源程序和目標(biāo)代碼,對我們學(xué)習(xí)匯編語言程序設(shè)計和發(fā)現(xiàn)錯誤很有用。采用/Sg選項,將在列表文件中得到有些偽指令相應(yīng)的硬指令開發(fā)過程4:可執(zhí)行程序的調(diào)試經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運行:test1操作系統(tǒng)裝載該文件進入主存,并開始運行如果出現(xiàn)運行錯誤,可以從源程
11、序開始排錯,也可以利用調(diào)試程序幫助發(fā)現(xiàn)錯誤采用DEBUG.EXE調(diào)試程序:DEBUG test1.exe2.3.1 參數(shù)、變量和標(biāo)號詳細(xì)討論匯編語言程序語句主要部分 參數(shù) 變量名 標(biāo)號并引出相關(guān)的偽指令和操作符本節(jié)重點掌握:常數(shù)的表達、變量定義偽指令DB/DW/DD、地址操作符和類型操作符一、數(shù)值型參數(shù)在源程序語句格式的4個組成部分中,參數(shù)是指令的操作對象(在學(xué)習(xí)硬指令時被稱為操作數(shù)),參數(shù)之間用逗號分隔參數(shù)根據(jù)指令不同可以沒有,可以有1個、2個或多個匯編語言程序中,指令參數(shù)有數(shù)值型,它的主要形式是常數(shù)和數(shù)值表達式;硬指令的操作數(shù)有立即數(shù);立即數(shù)就要用數(shù)值型參數(shù)表達1、常數(shù)常數(shù)(常量)表示一個
12、固定的數(shù)值它又分成多種形式:(1)十進制常數(shù)(2)十六進制常數(shù)(3)二進制常數(shù)(4)八進制常數(shù)(5)字符串常數(shù)(6)符號常數(shù)十進制常數(shù)由0 9數(shù)字組成,以字母D或d結(jié)尾缺省情況下,后綴D或d可以省略匯編語言大小寫不敏感,D和d通用例如:100、255D十六進制常數(shù)由09、AF組成,以字母H或h結(jié)尾以字母AF開頭的十六進制數(shù),前面要用0表達,以避免與其他符號混淆匯編語言大小寫不敏感, H和h 通用例如:64H、0FFh、0B800H二進制常數(shù)由0或1兩個數(shù)字組成,以字母B或b結(jié)尾匯編語言大小寫不敏感,B和b通用例如:01101100B八進制常數(shù)由0 7數(shù)字組成,以字母Q或q結(jié)尾匯編語言大小寫不敏
13、感,Q和 q 通用例如:144Q各種進制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進制數(shù)MASM提供基數(shù)控制.RADIX偽指令可以改變默認(rèn)進制,其格式是:.RADIX n 字符串常數(shù)用單引號或雙引號括起來的單個字符或多個字符,其數(shù)值是每個字符對應(yīng)的ASCII碼的值例如:d = 64HAB= 4142HHello, Everybody !符號常數(shù)利用一個標(biāo)識符表達的一個數(shù)值MASM提供等價機制,用于常量定義符號定義偽指令:等價EQU偽指令符號名 EQU 數(shù)值表達式符號名 EQU 等號=偽指令符號名 = 數(shù)值表達式常數(shù)若使用有意義的符號名來表示,可以提高程序的可讀性,同時更具有通用性實例2、數(shù)值
14、表達式數(shù)值表達式一般是指由運算符連接的各種常數(shù)所構(gòu)成的表達式匯編程序在匯編過程中計算表達式,最終得到一個數(shù)值程序運行之前,就已經(jīng)計算出了表達式;所以,程序運行速度沒有變慢,但增強程序的可讀性MASM對除偽指令外各種匯編時處理的指令統(tǒng)稱為操作符(Operator)運算符算術(shù)運算符+ - * / MOD邏輯運算符AND OR XOR NOT移位運算符SHL SHR關(guān)系運算符EQ NE GT LT GE LE高低分離符HIGH LOW HIGHWORD LOWWORD算術(shù)運算符實現(xiàn)加、減、乘、除、取余的算術(shù)運算mov ax,3*4+5;等價于 mov ax,17其中MOD也稱為取模,它產(chǎn)生除法之后的
15、余數(shù),如19 mod 7 = 5加+和減-運算符還可以用于地址表達式除加、減外,其他運算符的參數(shù)必須是整數(shù)邏輯運算符實現(xiàn)按位相與、相或、異或、求反的邏輯運算or al,03h AND 45h;等價于 or al,01h移位運算符實現(xiàn)對數(shù)值的左移、右移的邏輯操作;移入低位或高位的是0格式為:數(shù)值表達式 SHL/SHR 移位次數(shù)mov al,0101b SHL (2*2);等價于 mov al,01010000b關(guān)系運算符用于比較和測試符號數(shù)值MASM用0FFFFH(補碼 -1)表示條件為真MASM用0000H表示條件為假mov bx,(PORT LT 5)AND 20)OR(PORT GE 5)
16、AND 30);當(dāng)PORT5時,匯編結(jié)果為mov bx,20;否則,匯編結(jié)果為mov bx,30高低分離符取數(shù)值的高半部分或低半部分HIGH、LOW從一個字?jǐn)?shù)值或符號常量中得到高、低字節(jié)mov ah,HIGH 8765h;等價于mov ah,87h從MASM 6.0引入的HIGHWORD、LOWWORD取一個符號常量(不能是其他常數(shù))的高字或低字部分dd_value equ 0ffff1234h;定義一個符號常量mov ax,LOWWORD dd_value;等價于mov ax,1234h操作符的優(yōu)先級1() LENGTH SIZE WIDTH MASK2PTR OFFSET SEG TPYE
17、 THIS :3HIGE LOW4* / MOD SHL SHR5+ -6EQ NE GT LT GE LE7NOT8AND9OR XOR10SHORT 建議采用圓括號“( )”顯式表達,它可以極大地提高程序的可閱讀性地址型參數(shù)匯編語言程序中,指令參數(shù)還有地址型,它的主要形式是標(biāo)號和名字(變量名、段名、過程名等)硬指令的操作數(shù)有存儲單元;存儲單元就應(yīng)該用地址型參數(shù)(存儲器操作數(shù))表達二、變量定義偽指令變量定義(Define)偽指令為變量申請固定長度的存儲空間,并可同時將相應(yīng)的存儲單元初始化變量名 偽指令助記符 初值表 變量定義偽指令最常使用變量名變量名為用戶自定義標(biāo)識符,表示初值表首元素的邏輯
18、地址;用這個符號表示地址,常稱為符號地址變量名可以沒有。這種情況,匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g,無符號地址設(shè)置變量名是為了方便存取它指示的存儲單元初值表初值表是用逗號分隔的參數(shù)主要由數(shù)值常數(shù)、表達式或?、DUP組成?表示初值不確定,即未賦初值;DUP表示重復(fù)初值DUP的格式為:重復(fù)次數(shù) DUP(重復(fù)參數(shù))變量定義偽指令助記符變量定義偽指令根據(jù)申請的主存空間單位分類DB定義字節(jié)偽指令DW定義字偽指令DD定義雙字偽指令DF定義3字偽指令DQ定義4字偽指令DT定義10字節(jié)偽指令還有定位偽指令定義字節(jié)單元偽指令DBDB偽指令用于分配一個或多個字節(jié)單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)一定是
19、字節(jié)量(Byte),存放一個8位數(shù)據(jù): 可以是0255的無符號數(shù) 或是128127帶符號數(shù) 也可以是字符串常數(shù)實例datasegment;數(shù)據(jù)段Xdb a,-5db 2 dup(100),?Ydb ABCdataends字節(jié)單元定義實例應(yīng)用mov al,X;此處X表示它的第1個數(shù)據(jù),故ALadec X+1;對X為始的第2個數(shù)據(jù)減1,故成為-6mov Y,al;現(xiàn)在Y這個字符串成為 aBC字節(jié)變量的應(yīng)用定義字單元偽指令DWDW偽指令用于分配一個或多個字單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)一定是字量(Word),一個字單元可用于存放任何16位數(shù)據(jù): 一個段地址一個偏移地址 兩個字符 0
20、65535之間的無符號數(shù) 3276832767之間的帶符號數(shù)實例datasegment;數(shù)據(jù)段countdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)dataends字單元定義實例字變量和字常量的定義:WNUMEQU 5678H;定義WNUM為常量COUNTDW 20H;定義COUNT變量,假設(shè)在數(shù)據(jù)段的偏移地址為10H字變量和字常量的應(yīng)用:MOV AX,BX+SI+WNUM; MOV AX,BX+SI+5678HMOV AX,COUNT; MOV AX,0010HMOV AX,SI+COUNT; MOV AX,CO
21、UNTSI; MOV AX,SI+10HLEA BX,COUNT; LEA BX,0010HMOV BX,OFFSET COUNT; MOV BX,0010H字變量和字常量定義雙字單元偽指令DDDD偽指令用于分配一個或多個雙字單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)是一個32位的雙字量(Double Word): 可以是有符號或無符號的32位整數(shù) 也可以用來表達16位段地址(高位字)和16位的偏移地址(低位字)的遠指針varddDD 0,?,12345678hfarpointDD 00400078h其他數(shù)據(jù)單元定義偽指令定義3字偽指令DF用于為一個或多個6字節(jié)變量分配空間及初始化6字節(jié)
22、常用在32位CPU中表示一個48位遠指針(16位段選擇器:32位偏移地址)定義4字偽指令DQ用于為一個或多個8字節(jié)變量分配空間及初始化8字節(jié)變量可以表達一個64位整數(shù)定義10字節(jié)偽指令DT用于為一個或多個10字節(jié)變量分配空間及初始化10字節(jié)變量可以表達擴展精度浮點數(shù)例2:數(shù)據(jù)定義綜合應(yīng)用1/2.model small.stack.databvarDB 16wvarDW 4*3dvarDD 4294967295;2321qvarDQ ?DB 1,2,3,4,5tvarDT 2345;定義了BCD碼2345HabcDB a,b,cmsgDB Hello,13,10,$bbufDB 12 DUP(m
23、onth)dbufDD 25 DUP(?)CALLDOSEQU 例2:數(shù)據(jù)定義綜合應(yīng)用2/2.code.startupmov bl,bvarmov ax,word ptr dvar0mov dx,word ptr dvar2;取雙字到DX.AXmov dx,offset msgmov ah,09hCALLDOS.exit 0end例3:數(shù)據(jù)復(fù)制和顯示1/2.model small.stack.datasource db 33h,34h,35h,36h;定義4個字符數(shù)據(jù)target db 80 dup(?);分配數(shù)據(jù)空間420=80.code.startupmov ax,dsmov es,ax;
24、data也作為附加段cldmov si,offset sourcemov di,offset targetmov cx,80例3:數(shù)據(jù)復(fù)制和顯示2/2rep movsb;串傳送mov si,0;顯示mov bx,offset targetagain:mov dl,bx+si mov ah,2int 21hinc sicmp si,80jb again.exit 0end定位偽指令定位偽指令控制數(shù)據(jù)的偏移地址ORG 參數(shù)ORG偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達的偏移地址:ORG 100h;從100h處安排數(shù)據(jù)或程序ORG $+10;使偏移地址加10,即跳過10個字節(jié)空間MASM中,符號“$”
25、表示當(dāng)前偏移地址值EVEN;從偶地址開始ALIGN n;從n的整數(shù)倍地址開始變量和標(biāo)號的屬性標(biāo)號和名字一經(jīng)定義便具有以下兩類三種屬性: 段值標(biāo)號和名字對應(yīng)存儲單元的段地址 偏移值標(biāo)號和名字對應(yīng)存儲單元的偏移地址 類型標(biāo)號、子程序名的類型可以是NEAR(近)和FAR(遠),分別表示段內(nèi)或段間變量名的類型可以是BYTE(字節(jié))、WORD(字)和DWORD(雙字)等地址屬性類型屬性地址操作符取得名字或標(biāo)號的段地址和偏移地址兩個屬性 將括起的表達式作為存儲器地址$當(dāng)前偏移地址:采用指定的段地址寄存器OFFSET 名字/標(biāo)號返回名字或標(biāo)號的偏移地址SEG 名字/標(biāo)號返回名字或標(biāo)號的段地址實例org $+
26、10arraydb 45,45h.codemov ax,seg arraymov ds,axmov bx,offset array;等價于 lea bx,arraymov cl,array+4;等效于 mov cl,array4mov ax,es:2000h地址操作符實例 加4個字節(jié)單元類型操作符類型操作符對名字或標(biāo)號的類型屬性進行有關(guān)設(shè)置類型名 PTR 名字/標(biāo)號THIS 類型名SHORT 標(biāo)號TYPE 名字/標(biāo)號SIZEOF 變量名LENGTHOF 變量名類型名 PTR 名字/標(biāo)號PTR操作符使名字或標(biāo)號具有指定的類型類型名可以是BYTE/WORD/DWORD/FWORD/QWORD/TB
27、YTE或者是NEAR/FAR,還可以是由STRUCT、RECORD、UNION以及TYPEDEF定義的類型mov al,byte ptr w_var;w_var是一個字變量jmp far ptr n_label;n_label是一個標(biāo)號使用PTR操作符,可以臨時改變名字或標(biāo)號的類型THIS 類型名利用THIS說明的操作數(shù)具有匯編時的當(dāng)前邏輯地址,但具有指定的類型b_var equ THIS byte;按字節(jié)訪問變量b_var,但與w_var的地址相同w_var dw 10 dup(0);按字訪問變量w_varf_jump equ THIS far;用f_jump為段間轉(zhuǎn)移(f_jump lab
28、el far)n_jump: mov ax,w_var;用n_jump為段內(nèi)近轉(zhuǎn)移,但兩者指向同一條指令LABEL偽指令的功能等同于“EQU THIS”SHORT 標(biāo)名指定標(biāo)號作為-128+127字節(jié)范圍內(nèi)的短轉(zhuǎn)移jmp short n_jump當(dāng)然,如果標(biāo)號實際上超出了這個范圍,則出錯。TYPE 名字/標(biāo)名返回表明名字或標(biāo)號類型的一個字量數(shù)值對字節(jié)、字和雙字變量依次返回1、2和4;對短、近和遠轉(zhuǎn)移依次返回ff01h、ff02h和ff05hmov ax,TYPE w_var;匯編結(jié)果為mov ax,2mov ax,TYPE n_jump;匯編結(jié)果為 mov ax,0ff02h(near標(biāo)號)操
29、作符SIZEOF返回整個變量占用的字節(jié)數(shù)LENGTHOF返回整個變量的數(shù)據(jù)項數(shù)(即元素數(shù)) SIZEOF LENGTHOF TYPE例題:屬性及其應(yīng)用1/5.model small.stack.datav_byteequ this byte;v_byte是字節(jié)類型,與變量v_word的地址相同v_worddw 3332h,3735h;v_word是字類型的變量targetdw 5 dup(20h);分配數(shù)據(jù)空間2510字節(jié)crlfdb 0dh,0ah,$flagdb 0n_pointdw offset s_label;取得標(biāo)號s_label的偏移地址例題:屬性及其應(yīng)用2/5.code.star
30、tupmov al,byte ptr v_word;用PTR改變v_word的類型,否則類型不匹配dec almov v_byte,al;對v_word的頭一個字節(jié)操作,原為32H、現(xiàn)為31Hn_label:cmp flag,1jz s_label;flag單元為1轉(zhuǎn)移inc flagjmp short n_label;進行短轉(zhuǎn)移例題:屬性及其應(yīng)用3/5s_label:cmp flag,2jz next;flag單元為2轉(zhuǎn)移inc flagjmp n_point;段內(nèi)的存儲器間接尋址,轉(zhuǎn)移到s_label標(biāo)號處next:mov ax,type v_word;匯編結(jié)果為mov ax,2mov c
31、x,lengthof target;匯編結(jié)果為mov cx,5例題:屬性及其應(yīng)用4/5mov si,offset targetw_again:mov si,ax;對字單元操作inc si;SI指針加2inc siloop w_again;循環(huán)mov cx,sizeof target;匯編結(jié)果為 mov cx,0ahmov al,?mov di,offset targetb_again:mov di,al;對字節(jié)單元操作inc di;DI指針加1loop b_again;循環(huán)例題:屬性及其應(yīng)用5/5mov dx,offset v_word;顯示結(jié)果:1357?mov ah,9int 21h.ex
32、it 0end三、 程序段的定義和屬性詳述匯編語言程序格式的組成部分首先,簡單了解DOS支持的exe程序和com程序其次,重點掌握簡化段定義格式的各條偽指令最后,理解完整段定義格式所包含的各種段屬性exe程序利用程序開發(fā)工具,通常將生成EXE結(jié)構(gòu)的可執(zhí)行程序(擴展名為.EXE的文件)它可以有獨立的代碼、數(shù)據(jù)和堆棧段,還可以有多個代碼段或多個數(shù)據(jù)段,程序長度可以超過64KB,執(zhí)行起始處可以任意指定當(dāng)DOS裝入或執(zhí)行一個程序時,DOS確定當(dāng)時主存最低的可用地址作為該程序的裝入起始點。此點以下的區(qū)域稱為程序段。在程序段內(nèi)偏移0處,DOS為該程序建立一個程序段前綴控制塊PSP(Program Segm
33、ent Prefix),它占256(=100h)個字節(jié);而在偏移100h處才裝入程序本身內(nèi)存映象exe程序的內(nèi)存映象圖com程序COM程序是一種將代碼、數(shù)據(jù)和堆棧段合一的結(jié)構(gòu)緊湊的程序,所有代碼、數(shù)據(jù)都在一個邏輯段內(nèi),不超過64KB在程序開發(fā)時,需要滿足一定要求并采用相應(yīng)參數(shù)才能正確生成COM結(jié)構(gòu)的程序COM文件存儲在磁盤上是主存的完全影象,不包含重新定位的加載信息,與EXE文件相比其加載速度更快,占用的磁盤空間也少盡管DOS也為COM程序建立程序段前綴PSP,但由于兩種文件結(jié)構(gòu)不同,所以加載到主存后各段設(shè)置并不完全一樣內(nèi)存映象com程序的內(nèi)存映象圖;SampleA.ASM.model sma
34、ll.stack.data.;在數(shù)據(jù)段定義數(shù)據(jù).code.startup.;在代碼段填入指令序列.exit 0.;子程序代碼end簡化段定義格式 MASM 6.x支持.MODEL 存儲模式使用簡化段定義,必須有存儲模式偽指令.model語句必須位于所有段定義語句之前存儲模式?jīng)Q定一個程序的規(guī)模,確定進行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性MASM有7種不同的存儲模式: TINY SMALL COMPACT MEDIUM LARGE HUGE FLATTINY微型模式微型模式是MASM 6.0才引入的用于創(chuàng)建COM類型程序用微型模式編寫匯編語言程序時,所有的段地址寄存器都被設(shè)置為同一值這意味著
35、代碼段、數(shù)據(jù)段、堆棧段都在同一個段內(nèi),不大于64KB;訪問操作數(shù)或指令都只需要使用16位偏移地址SMALL小型模式一般的程序(例如本書的絕大多數(shù)程序示例和習(xí)題)都可用這種模式在小型模式下,一個程序至多只能有一個代碼段和一個數(shù)據(jù)段,每段不大于64KB這里的數(shù)據(jù)段是指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個段基址,總長度不可超過64KB;因此小模式下程序的最大長度為128KB訪問操作數(shù)或指令都只需要使用16位偏移地址;這意味著諸如指令轉(zhuǎn)移、程序調(diào)用以及數(shù)據(jù)訪問等都是近屬性(NEAR),即小型模式下的調(diào)用類型和數(shù)據(jù)指針缺省分別為近調(diào)用和近指針COMPACT緊湊模式適合于數(shù)據(jù)量大但代碼量小的程序緊
36、湊模式下,代碼段被限制在一個不大于64KB的段內(nèi);而數(shù)據(jù)段則可以有多個,超過64KB這種模式下的調(diào)用類型缺省仍為近調(diào)用;而數(shù)據(jù)指針缺省為遠(FAR)指針,因為必須用段地址來區(qū)別多個數(shù)據(jù)段MEDIUM中型模式中型模式是與緊湊模式互補的模式適合于數(shù)據(jù)量小但代碼量大的程序中型模式的代碼段可以超過64KB,有多個;但數(shù)據(jù)段只能有一個不大于64KB的段這種模式下的數(shù)據(jù)指針缺省為近指針;但調(diào)用類型缺省是遠(FAR)調(diào)用,因為要利用段地址區(qū)別多個代碼段LARGE大型模式較大型程序通常采用的存儲模式大型模式允許的代碼段和數(shù)據(jù)段都有多個,都可以超過64KB;但全部的靜態(tài)數(shù)據(jù)(不能改變的數(shù)據(jù))仍限制在64K字節(jié)內(nèi)
37、大型模式下的調(diào)用類型和數(shù)據(jù)指針缺省分別為遠調(diào)用和遠指針HUGE(巨型模式)與大型模式基本相同,只是靜態(tài)數(shù)據(jù)不再被限制在64K字節(jié)之內(nèi)FLAT平展模式平展模式用于創(chuàng)建一個32位的程序,它只能運行在32位x86 CPU上。DOS下不能使用FLAT模式,而編寫32位Windows 9.x或Windows-NT的程序時,必須采用FLAT模式。DOS下編程可選擇前六種模式,一般可以選用SMALL模式TINY模式產(chǎn)生COM程序,其他模式產(chǎn)生EXE程序,F(xiàn)LAT模式只能用于32位程序簡化段定義偽指令.STACK 大小;堆棧段開始.DATA;數(shù)據(jù)段開始.CODE 段名;代碼段開始簡化段定義偽指令指明一個邏輯段的開始,同時自動結(jié)束前面的一個段采用簡化段定義偽指令前,需有.model語句使用簡化段定義,各段名稱和其他用戶所需的信息可以使用MASM預(yù)定義符號,例如:data表示由.data等定義的數(shù)據(jù)段的段名堆棧段偽指令.STACK 大小堆棧段偽指令.STACK創(chuàng)建一個堆棧段,段名是:stack它的參數(shù)指定堆棧段所占存儲區(qū)的字節(jié)數(shù),默認(rèn)是1KB(= 1024 = 400h字節(jié))數(shù)據(jù)段偽指令.DATA數(shù)據(jù)段偽指令.data創(chuàng)建一個數(shù)據(jù)段,段名是:_DATA。它用于定義具有初值的變量,當(dāng)然也允許定義無初值的變量無初值變量可以
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年物業(yè)維修管理制度
- 制造業(yè)人力資源管理策略
- 銀行營銷策略總結(jié)精準(zhǔn)定位提升競爭力
- 2024年熱鬧的元宵節(jié)大班教案
- 2024年美術(shù)教案篇1
- 分公司資質(zhì)掛靠協(xié)議書(2篇)
- DB33T 2305-2021 大中型體育場館智慧化建設(shè)和管理規(guī)范
- 乳腺癌保乳手術(shù)
- 注塑產(chǎn)品項目可行性研究報告
- 《導(dǎo)彈驅(qū)逐艦》課件
- 死因監(jiān)測工作總結(jié)
- 邊防知識講座
- 分子病理學(xué)題庫
- 《腎病綜合征》課件
- 護理給藥制度課件
- 基于單片機的火災(zāi)報警系統(tǒng)設(shè)計
- 培智三年級上冊生活語文期末測試卷(A)
- GB/T 13296-2023鍋爐、熱交換器用不銹鋼無縫鋼管
- 新加坡學(xué)習(xí)匯報
- 人工智能與機器學(xué)習(xí)基礎(chǔ)課程
- 高速公路隧道工程施工方案
評論
0/150
提交評論