




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、新一代匯編語言程序設(shè)計第四章內(nèi) 容v4.1 匯編語句的表達式v4.2 匯編偽指令語句v4.3 宏功能語句4.1.1 匯編語言語句格式v1. 機器指令語句的形式v標號: 指令前綴 助記符 操作數(shù) ;注釋v存儲器操作數(shù)M),一般由變量名、基址器、變址器、帶比例因子的變址器、常量及有關(guān)運算符組成的表達式,表示要存取單元的偏移地址EA。v例如v2.偽指令語句的形式v名字 偽操作指令 參數(shù),參數(shù) ;注釋v參數(shù)是偽指令的操作對象,參數(shù)之間用逗號分隔v參數(shù)根據(jù)指令不同可以沒有,可以有1個、2個或多個v匯編語言程序中,指令參數(shù)有數(shù)值型,它的主要形式是常數(shù)和數(shù)值表達式;v機器指令的操作數(shù)有立即數(shù);立即數(shù)就要用數(shù)
2、值型參數(shù)表達1. 常數(shù)v常數(shù)常量表示一個固定的數(shù)值v它又分成多種形式:v(1十進制常數(shù)v(2十六進制常數(shù)v(3二進制常數(shù)v(4八進制常數(shù)v(5字符串常數(shù)v(6符號常數(shù)字符串常數(shù)v 用單引號或雙引號括起來的單個字符或多個字符,其數(shù)值是每個字符對應的ASCII碼的值v 例如:d = 64Hv AB= 4142Hv Hello, Everybody !符號常數(shù)利用一個標識符表達的一個數(shù)值MASM提供等價機制,用于常量定義符號定義偽指令:等價EQU偽指令符號名 EQU 數(shù)值表達式符號名 EQU 等號=偽指令符號名 = 數(shù)值表達式常數(shù)若使用有意義的符號名來表示,可以提高程序的可讀性,同時更具有通用性符號
3、定義DosWriteChar equ 2CarriageReturn = 13CallDOS equ 符號應用左邊程序段等價右側(cè)的符號形式)mov ah,2;mov ah,DosWriteCharmov dl,13;mov dl,CarriageReturnint 21h;CallDOS符號常數(shù)實例符號常數(shù)實例2. 數(shù)值表達式v數(shù)值表達式一般是指由運算符連接的各種常數(shù)所構(gòu)成的表達式v匯編程序在匯編過程中計算表達式,最終得到一個數(shù)值v程序運行之前,就已經(jīng)計算出了表達式;所以,程序運行速度沒有變慢,但增強程序的可讀性運算符v算術(shù)運算符v+ - * / MODv邏輯運算符vAND OR XOR NO
4、Tv移位運算符vSHL SHRv關(guān)系運算符vEQ NE GT LT GE LE二符號定義偽指令 用于給程序中多次出現(xiàn)的同一個常量或表達式賦一個符號名,也可以為其它符號名取一個新名字,并賦給新的類型屬性。(1) EQU偽指令 例: FIRST EQU 1 ;定義常數(shù) SECOND EQU FIRST*3+8 ;定義數(shù)值表達式 ADDR1 EQU DS:EBP+4 ;定義地址表達式 DWORDS EQU THIS DWORD ;定義下面的字節(jié)變量為雙字類型 BYTES DB 10 DUP (0) ADDR2 EQU WORD PTR BYTES ; test2 返回 ;重新定義變量BYTES的名字
5、和屬性 START: MOV EAX,EBX GOON EQU FAR PTR START ;重新定義標號START的名字和屬性 COUNT EQU ECX ;為ECX重新取名注意:該等值語句只作為符號定義用,不產(chǎn)生任何目標代碼,也不占用存儲單元,并且不能是程序中曾經(jīng)定義過的符號名。 2022年5月3日星期二二變量定義偽指令就是為數(shù)據(jù)分配存儲單元,且對這個存儲單元取一個名字,即變量名。語句的格式如下:變量名 DB/DW/DD/DF/DQ/DT 表達式1,表達式2,變量名是可選的,DB/DW/DD/DF/DQ/DT是偽操作命令必須選用一種,表達式是賦給變量的初值,常見的有如下幾種:(1數(shù)值變量定
6、義語句例: D_BYTE DB 30H,40H DB 50HD_WORD DW 1234H,5678HD_DWORD DD D_DWORDD_TBYTE DT ?D_FWORD DF 1234567890ABHD_QWORD DQ 1122334455667788HEQU 與 DB等 的區(qū)別? test12022年5月3日星期二(2字符串變量定義語句可以用DB來實現(xiàn),即為串中的每一個字符分配一個字節(jié)存儲單元。字符串必須用引號括起來,并且不超過256個字符,它們在內(nèi)存中自左至右把字符的ASCII碼按地址遞增順序依次存放。 例: STRING1 DB ABCDEFG用DW也可以定義字符串變量,即給
7、兩個字符組成的字符串分配兩個字節(jié)存儲單元,它們在內(nèi)存中的順序是前一個字符為高字節(jié),存放在高地址,后一個字符為低字節(jié),存放在低地址。 例: STRING2 DW AB,CD,EF2022年5月3日星期二(3)?語句存儲單元中不預置確定的值,常用來預留存儲單元,存放程序的中間結(jié)果或最終結(jié)果。 例:FIRST DB ? ;分配一個字節(jié)單元 SECOND DD ?,?,? ;分配三個雙字單元(4帶DUP的變量定義語句DUP 是重復數(shù)據(jù)定義操作符,可以為若干重復數(shù)據(jù)分配存儲單元,并賦給相應的變量名。例:D1 DB 5 DUP (0) D2 DW 10H DUP (5678H) D3 DD 20H DUP
8、 (?)第一條語句為變量D1分配5個字節(jié)單元,每個單元初始值都為0;第二條語句為變量D2重復分配10H個字單元,每個單元初始值都為5678H,共占有20H個字節(jié);第三條語句為變量D3保留20H個雙字單元,沒有定義初始值。 D4 DB 3 DUP (4 DUP (6),8)表示為變量D4重復分配3個數(shù)據(jù)序列6,6,6,6,8,共占有15個字節(jié)單元。test 4 datasegment;數(shù)據(jù)段Xdb a,-5db 2 dup(100),?Ydb ABCdataends字節(jié)單元定義實例字節(jié)單元定義實例2022年5月3日星期二標號標號之后必須有一個冒號(:),標號也可以單占一行。一標號的屬性 段屬性(
9、SEG),指標號所在段的段基址。 偏移地址屬性(OFFSET),指標號所在段中的偏移地址,即標號所在地址與段基址之間的字節(jié)距離。 距離屬性或類型屬性(TYPE),標號可作為轉(zhuǎn)移和調(diào)用指令的目標地址,也可作為過程定義偽指令的過程名。當標號只允許作為段內(nèi)轉(zhuǎn)移或調(diào)用指令的目標地址時,距離屬性為NEAR;當標號作為段間轉(zhuǎn)移或調(diào)用指令的目標地址時,距離屬性為FAR。例如:JMP LABEL1 ;程序跳轉(zhuǎn)到標號LABEL1的位置CALL FAR PTR SUBPROGRAM ;調(diào)用SUBPROGRAM過程FAR)LABEL1: ;LABEL1為段內(nèi)轉(zhuǎn)移標號(距離屬性缺省為NEAR) LABEL2: ;LA
10、BEL2為段內(nèi)轉(zhuǎn)移標號,單獨占一行 SUBPROGRAM PROC FAR ;SUBPROGRAM是屬性為FAR的過程 RET 標號的距離屬性可用LABEL偽指令加以改變。v定義名字語句指令 格式:v 名字 LABEL 類型v將左邊名字定義為右邊的類型屬性。v例如:LABEL1 LABEL FAR ; 改變LABEL1標號的距離屬性。vBARRAY LABEL BYTEvWARRAY DW 1234H,5678Hv MOV AX,WARRAY1v MOV BL,BARRAY1 v 運行后,AX=? BL=? text3v 2022年5月3日星期二數(shù)值返回運算符運算對象必須是存儲器操作數(shù),即變量
11、或標號。 test5(1SEG運算符:返回該變量或標號所在段的段基址。 例如: MOV AX, SEG VAR 如果變量VAR所在段的段基址為1000H,則該指令執(zhí)行的結(jié)果 等效于 MOV AX,1000H(2OFFSET運算符:返回該變量或標號所在段內(nèi)的偏移地址。 例如:MOV DI, OFFSET VAR 如果變量VAR在1000H段內(nèi)的偏移地址是100H,則該指令執(zhí)行 的結(jié)果等效于: MOV DI,100H(3TYPE運算符:返回該變量的類型屬性或者標號的距離屬性。例: V1 DB 1,2,3V2 DW 1020H,3040HV3 DD 12345678HPF LABEL FARPN:
12、MOV AH,TYPE V1 ;等效于MOV AH,1 MOV AL,TYPE V2 ;等效于MOV AL,2 MOV DL,TYPE V3 ;等效于MOV BL,4 MOV DH,TYPE PF ;等效于MOV BH,-22022年5月3日星期二屬性與返回數(shù)值的關(guān)系 2022年5月3日星期二五、修改屬性運算符(1PTR運算符格式: PTR 根據(jù)地址表達式的不同,所賦給的新類型可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等,它們只在所在的指令內(nèi)有效。例: TABLE DB 1,2,3,4,5,6,7,8 ADD WORD PTR DI,100 ;指
13、明目的操作數(shù)為字類型 JMP DWORD PTR BX ;指明為段間轉(zhuǎn)移 MOV EAX, DWORD PTR TABLE ;臨時修改TABLE為雙字類 ;型,(EAX)=04030201H 見12頁(2THIS運算符把它后面指定的類型或距離屬性賦給當前的變量、標號或地址表達式,但不分配新的存儲單元,往往與偽指令EQU或連用,為當前存儲單元定義一個指定類型的變量或標號,類型屬性也可以是BYTE、WORD、DWORD、FWORD、QWORD、TBTYE、NEAR、FAR等。例: DAT EQU THIS WORD POINT EQU THIS FAR第一條語句將變量DAT的類型屬性定義為字,不管
14、DAT原來的類型是什么,從本語句開始,DAT成為字節(jié)變量;第二條語句將標號POINT的距離屬性定義為FAR,不管POINT原來的距離屬性是什么,從本語句開始,POINT成為遠標號。v LABC EQU THIS BYTELABD DW 4321H, 2255H這樣就給同一片存儲單元LABD,取了二個具有不同數(shù)據(jù)類型的變量名。于是,在指令中,引用不同的變量名,就使用其不同的數(shù)據(jù)屬性:* 如果引用變量名LABD,是按“字屬性來訪問;* 如果引用變量名LABC,是按“字節(jié)屬性來訪問。如此一來,指令“MOV AL,LABC和v “MOV AL, byte ptr LABD是等效的v 所不同的是:當以“
15、字節(jié)屬性訪問LABD存儲區(qū)時,不必使用強制屬性符PTR,而改用“字節(jié)屬性變量LABC即可。2022年5月3日星期二六、其它運算符(1高低分離運算符HIGH運算符和LOW運算符分別用于從16位運算對象中分離出高字節(jié)和低字節(jié)。從MASM6.0開始引入了HIGHWORD運算符和LOWWORD運算符分別用于從32位符號常量中分離出高字和低字部分。例: MOV AH,HIGH 5678H ;(AH)=56H DATA16 EQU 1234H MOV AL,LOW DATA16 ;(AL)=34H DATA32 EQU 1234FFFFH MOV AX,LOWWROD DATA32 ;(AX)=0FFFF
16、H(2方括號運算符:運算符中可以是數(shù)組變量的下標或地址表達式,以區(qū)別操作數(shù)和操作數(shù)地址。例:ARRAY DB 1,2,3,4,5 ;ARRAY為數(shù)組變量 MOV AL, ARRAY4 ;”4為下標,(AL)=5 MOV BX,OFFSET ARRAY ;(BX)=ARRAY的偏移地址 MOV AH,BX ;(AH)=1 MOV DX,WORD PTR ARRAY1 ;(DX)=302H(3運算符的優(yōu)先級:一般可以用括號來改變運算符的優(yōu)先級別。例: MOV AL,18 OR 5 AND 10 ;AL=18(12H) MOV AL,(18 OR 5) AND 10 ;AL=22022年5月3日星期
17、二LENGTH運算符 返回變量中所定義的元素個數(shù),如果變量是用重復數(shù)據(jù)操作符DUP說明的,則返回DUP前面的數(shù)值;如果沒有DUP說明,則返回的值總是1。例: D1 DW 10H DUP (0) D2 DB 20H DUP (0) D3 DW 1234H,5678H D4 DB ABCDEFGH MOV AL,LENGTH D1 ;(AL)=10H MOV AL,LENGTH D2 ;(AL)=20H MOV AL,LENGTH D3 ;(AL)=1H MOV AL,LENGTH D4 ;(AL)=1HSIZE運算符 返回變量所占的總字節(jié)數(shù),且等于LENGTH和TYPE兩個運算符返回值的乘積。例
18、如,對于上例中的變量D1、D2、D3、D4,SIZE的返回值如下所示:MOV AL,SIZE D1 ;(AL)=20HMOV AL,SIZE D2 ;(AL)=20HMOV AL,SIZE D3 ;(AL)=2HMOV AL,SIZE D4 ;(AL)=1H2022年5月3日星期二運算符的優(yōu)先級表 4.3 運算符的優(yōu)先級別 優(yōu)先級別 運 算 符 高 級 低 級 0 (),LENGTH,WIDTH,SIZE,MASK 1 PTR,OFFSET,SEG,TYPE,THIS,CS:,DS:,SS:,ES: 2 HIGH,LOW 3 *,/,MOD,SHL,SHR 4 +, 5 EQ,NE,LT,LE
19、,GT,GE 6 NOT 7 AND 8 OR,XOR 9 SHORT vWIDTH(記錄字段寬度)vMASK(記錄字段的屏蔽位)2022年5月3日星期二5.3 宏匯編語言的偽指令v 符號定義、變量定義、程序分段定義、過程定義、模塊定義、宏定義、條件匯編、以及格式和列表控制等。v 5.3.1 段定義和程序說明偽指令具體來說規(guī)定段的起始和結(jié)束指定屬性開始地址邊界段類型 同名段如何結(jié)合在一起有兩種段定義簡化段定義:對MASM5.0以上版本完整段定義:對所有版本2022年5月3日星期二功能:指出段名和段的各種屬性, 并表示段的開始和結(jié)束位置。段定義由偽操作SEGMENT開始、ENDS結(jié)束。其中: S
20、EGMENT 和ENDS 必須成對出現(xiàn), 且語句前必須有段名,段名必須相同。 SEGMENT和ENDS語句之間可以有指令和其他偽指令, 表示存放在該段內(nèi)存的變量、指令或其他偽指令對該段內(nèi)存的處理 程序中可以定義多個段。 程序經(jīng)匯編、連接及裝入內(nèi)存后,段名為一具體的段值。合法標識符,有段基地址和段內(nèi)偏移量兩個屬性,與某個存儲單元相聯(lián)系。2022年5月3日星期二 (1定位類型用于告訴鏈接程序,鏈接時各模塊.obj) 本段首地址的邊界定位方式,常有四種: PARA:段的起始地址必須是16的倍數(shù)XXXX0H), 這是一種默認方式。 PAGE:段的起始地址必須是256的倍數(shù)XXX00H), 256字節(jié)為
21、一頁,在頁的起點上。 WORD:段的起始地址必須是偶數(shù)XX0B)。 BYTE:段的起始地址可以是任何地址。(2) 組合類型 在多模塊每個模塊有自己的代碼段、數(shù) 據(jù)段、堆棧段組合時,告訴Link程序本 段與其他模塊中同名段的組合鏈接關(guān)系。2022年5月3日星期二 NONE: 本段與其他同名段無組合關(guān)系,并有自己的段起始 地址,這是一種默認方式。 PUBLIC:在滿足定位類型的前提下,LINK程序?qū)⑵渑c其他 模塊中的同名段鄰接在一起,共用一個段地址。 STACK: 同PUBLIC 。鏈接以后作為堆棧段,并自動初始化 SS、SP。若程序中不說明STACK,則必須由用戶 在程序的開始處,自己通過語句設(shè)
22、置SS、SP。 COMMON:各模塊中同名段重疊覆蓋,有著相同的起始地 址。段的長度取決于最長的COMMON段。段的 內(nèi)容為所鏈接的最后一個模塊中COMMON段的 內(nèi)容。 MEMERY:鏈接在其他所有段的后面高端存儲區(qū) )。若有 多個MEMERY段,則只認第一個,其余按 COMMON處理。2022年5月3日星期二(3段字屬性在32位80X86微處理器中,新增加了USE屬性說明。對于16位CPU默認的是16位段,即USE 16。而對于匯編32位80X86CPU指令時,它默認采用32位段,即USE 32。但可以使用USE 16指定標準的16位段。若在程序開頭使用了.386偽指令見簡化段定義偽指令)
23、,缺省類型為32位段字長。注意,在禁止用80386的情況下,使用USE選擇項將導致出錯。(4段類別名屬性類別名可以是任何合法的名字,必須用單引號括起來。在連接處理時,鏈接程序把類別名相同的所有段存放在連續(xù)的存儲區(qū)內(nèi)。典型的類別名如:DATA,STACK,CODE。以上是定位類型、組合類型、段字和類別名四個參數(shù)的說明,各參數(shù)之間用空格分隔。在選用時,可以只選其中一個或兩個參數(shù)項,但不能交換它們之間的順序。2022年5月3日星期二ORG偽指令和當前位置計數(shù)器匯編時將段名填入段表,同時為該段配備一個初值為0的位置計數(shù)器$。計數(shù)器依次累計段內(nèi)語句被匯編后生成的目標代碼字節(jié)個數(shù)??捎肙RG偽指令把位置計
24、數(shù)器的值設(shè)置成需要的值。在數(shù)據(jù)段中,ORG后面的數(shù)據(jù)定義偽指令就從指定位置進行分配單元;在代碼段中,ORG后面的一條指令語句就從指定位置生成目標代碼;表達式的值應該是非負的整數(shù)。例: ORG 0F0H ;從0F0H開始安排數(shù)據(jù) ORG $+10H ;跳過10H個字節(jié)后安排數(shù)據(jù) DW 1,$+4,$+4 ;100H單元的字值為1,102H單元的字值 ;為106H,104H單元的字值為108H ARRAY DB 12,34,56,5 DUP (?) ;定義字節(jié)數(shù)組LEN EQU $-ARRAY ;LEN的值為ARRAY變量所占的字節(jié)數(shù)82022年5月3日星期二 ASSUME CS:CODES,DS
25、:DATAS,SS:STACKS,ES:EXTRS START:MOV AX,DATAS MOV DS,AX MOV AX,EXTRS MOV ES,AX CODES ENDS2022年5月3日星期二(2SS的裝入一種方法是在SEGMENT語句中,組合類型選用STACK,并在ASSUME語句中,把堆棧用的段指派給段寄存器SS。 STACKS SEGMENT PARA STACK DB 100H DUP (?) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,SS:STACKS 另一種方法是在SEGMENT語句中,組合類型未選用STACK參數(shù),或者在程序中使用
26、另一個堆棧段時,可采用類似于DS和ES的裝入方法,用傳送指令實現(xiàn)對SS的裝入操作。(3CS和IP的裝入CS和IP的裝入通常是按照結(jié)束偽指令指定的地址來自動完成的。結(jié)束偽指令的格式是: END 起始地址是一個標號或地址表達式,這個地址是程序裝入內(nèi)存后的起始點,它的段基址和偏移量就是CS和IP的內(nèi)容。源程序SAMPLE.ASM: STACKS SEGMENT STACK DW 128 DUP(?) STACKS ENDS DATAS SEGMENT STRING DB Welcome!,13h,10h,$ DATAS ENDS CODES SEGMENT ASSUME CS:CODE,DS:DAT
27、AS START: MOV AX , DATAS MOV DS, AX LEA DX , STRING MOV AH , 09H INT 21H MOV AX , 4C00H INT 21H CODES ENDS END START堆棧段數(shù)據(jù)段代碼段源程序模塊結(jié)束2022年5月3日星期二3. 組定義偽指令GROUP格式:組名 GROUP 段名,段名將程序中若干不同名的段集合成一個組,并賦予一個組名,使它們都裝在一個64KB的物理段中, 這時組內(nèi)不同類型的段運行時共用一個 Sreg,組內(nèi)各段間的跳轉(zhuǎn)都可以看作段內(nèi)跳轉(zhuǎn)。例:STACKSEG SEGMENT STACK ;定義堆棧段 DB 256
28、DUP (?) STACKSEG ENDSDATA1 SEGMENT WORD PUBLIC CONST CONS1 DW 100 ;定義數(shù)據(jù)段1DATA1 ENDSDATA2 SEGMENT WORD PUBLIC VARS VAR1 DW ? ;定義數(shù)據(jù)段2DATA2 ENDS2022年5月3日星期二DATAGROUP GROUP DATA1,DATA2 ;組合兩個數(shù)據(jù)段,以DATAGROUP為段組名CODESEG SEGMENT PARA PUBLIC CODE ;定義代碼段 ASSUME CS:CODESEG,DS:DATAGROUP,SS:STACKSEGSTART: MOV AX,
29、DATAGROUP MOV DS,AX ;DS賦初值對該組尋址 MOV AX,CONS1 ;AX=100 MOV VAR1,AX ;VAR=100 MOV AX,OFFSET VAR1 ;AX=2 MOV AX,OFFSET DATA1 ;AX=2 (已分配2個字節(jié)內(nèi)存單元) MOV AX,OFFSET DATA2 ;AX=4 (已分配4個字節(jié)內(nèi)存單元) MOV AX,4C00H INT 21H ;DOS功能調(diào)用,可正常返回到操作系統(tǒng)CODESEG ENDS END START ;程序結(jié)束2022年5月3日星期二二、簡化分段定義偽指令在MASM 5.0版本以上的宏匯編語言中段的定義可以非常簡單
30、。.MODEL ;定義程序的存儲模式.STACK ;定義堆棧段, 長度缺省為1K字節(jié).CODE ;定義代碼段.DATA ;定義數(shù)據(jù)段.DATA? ;定義數(shù)據(jù)段,但初值不確定.FARDARA ;定義遠調(diào)用數(shù)據(jù)段.FARDARA? ;定義遠調(diào)用數(shù)據(jù)段,但初值不確定.CONST ;定義只讀常數(shù)數(shù)據(jù)段.STARTUP ;程序起始點,并初始化DS、SS.EXIT 0 ;程序結(jié)束點,返回到操作系統(tǒng)2022年5月3日星期二例: .MODEL SMALL ;定義小型內(nèi)存模式.386 ;可以匯編386指令.STACK 100 ;定義堆棧段,長度為100字節(jié).DATA ;數(shù)據(jù)段開始X DD 12345678HY
31、DD 87654321HZ DD ?,?.CODE ;代碼段開始.STARTUP ;程序開始MOV EAX,XMUL YMOV Z,EAXMOV Z+4,EDX.EXIT 0 ;程序結(jié)束,返回, ;相當于MOV AX,4C00H和INT 21H兩條指令END ;匯編結(jié)束2022年5月3日星期二1定義內(nèi)存模式偽指令 .MODEL 存儲模式 ,語言類型 ,操作系統(tǒng)類型 ,堆棧類型(1存儲模式: 2022年5月3日星期二(2)語言類型:由它來告訴匯編程序?qū)⑹褂檬裁礃拥臉俗R符的命名風格、子程序的調(diào)用和返回約定等??墒箙R編語言程序與其它語言程序達到共享的目的。有效的語言類型為:C(C語言)、SYSCAL
32、L(系統(tǒng)調(diào)用)、STDCALL(標準調(diào)用)、 Basic(Basic語言)、 Fortran(Fortran語言) 、Pascal(Pascal語言)等。(3)操作系統(tǒng)類型:OS_DOS是當前唯一支持的選項值,也是該選項的缺省值。(4)堆棧類型:堆棧類型的值主要影響偽指令.STARTUP所生成的指令序列。該選項有二個可選值:NEARSTACK和FARSTACK。其中:NEARSTACK是該選項的缺省堆棧類型。NEARSTACK堆棧段和數(shù)據(jù)段是同一段;FARSTACK堆棧段和數(shù)據(jù)段是不同的段,且堆棧不在段組DGROUP中。例:.MODEL SMALL, C, OS_DOS, FARSTACK 2
33、022年5月3日星期二2處理器選擇偽指令.8086和.8087 可用來匯編8086/8088處理器和8087協(xié)處理器的指令,這是缺省模式。.286、.286C、.286P、.287可用來匯編286系列微處理器的指令。.386、.386C、.386P、.387可用來匯編386系列微處理器的指令。.NO87取消使用協(xié)處理器指令。.486、.486C、.486P可用來匯編486系列微處理器的指令。.586、.586C、.586P可用來匯編Pentium系列微處理器的指令。. 686、.686P可用來匯編Pentium Pro系列微處理器的指令。.MMX可用來匯編MMX指令。 .MMX和.686、.6
34、86P是MASM6.12引入的。.K3D可用來匯編AMD處理器的3D指令,是MASM6.13引入的。.XMM可用來匯編SSE指令和SSE2指令,是MASM6.15引入的。注意:80386以上處理器中,如果處理器選擇偽指令放在.MODEL偽指令前面,那么段將定義成32位的段。如果希望處理器使用16位的段,則應在.MODEL偽指令后面使用處理器選擇偽指令。2022年5月3日星期二3段名的缺省名使用簡化的段定義偽指令時,每個段都有一個缺省名。在中內(nèi)存模式和大內(nèi)存模式時,.CODE偽指令表示的缺省段名為name_TEXT,即name是這個段名的可變部分,當程序模塊有一個具體名字時,name就表示這個名
35、字。.DATA、.CONST、.DATA?、.STACK定義的段內(nèi)數(shù)據(jù)存放在一個叫DGROUP的段組中,各個段內(nèi)的偏移地址均以這個起始地址為起點,而不依本段內(nèi)的段地址為起點。.FARDATA或.FARDATA?偽指令使用的缺省名在各種模式下可以替換,它們定義的段內(nèi)數(shù)據(jù)不放在任何段中,屬于遠程數(shù)據(jù)。2022年5月3日星期二4.等價名的使用MASM 5.0中規(guī)定了幾個等價名代替真實名??梢杂么婧喕味x偽指令前面的小數(shù)點。CODE代表.CODE定義的段名;FARDATA代表.FARDATA定義的段名;DATA代表.DATA、.DATA?、.CONST和.STACK共享的組段名。例: ASSUME
36、 ES:FARDATA ;ES為遠程數(shù)據(jù)段地址 MOV AX,DATA MOV DS,AX ;DS為DGROUP段組段地址 MOV AX,FARDATA MOV ES,AX5.段序定義偽指令MASM可以按照源程序中各個段出現(xiàn)的次序來排列目標文件中各段的先后次序,也可以按照段名的字母順序來排列次序。缺省情況是按照段出現(xiàn)的次序來排列,可以定義段序: .ALHPA:按照字母順序?qū)Χ闻判颉?.SEG:按照段出現(xiàn)的順序?qū)Χ闻判颉M暾味x格式中,默認按此順序。 .DOSSEG:按照DOS定義的標準段序?qū)Χ闻判?,順序?代碼段、數(shù)據(jù)段、堆棧段。采用.MODEL偽指令的簡化段定義格式默認按此順序。2022年
37、5月3日星期二三、使用簡化段定義的程序框架(1EXE標準程序框架匯編語言源程序經(jīng)過匯編和連接后生成可執(zhí)行文件(.exe)。操作系統(tǒng)為程序建立了一個程序段前綴區(qū)PSP,其長度為256個字節(jié),主要用于存放用戶程序的有關(guān)信息,如文件名、文件長度等。而在偏移100H處才裝入程序本身。EXE程序加載要重新定位:1DS和ES指向PSP段地址,而不是程序的數(shù)據(jù)段和附加段,所以需在程序中根據(jù)實際數(shù)據(jù)段改變DS和ES;2CS:IP和SS:SP是由連接程序確定的值,指向程序的代碼段和堆棧段。如果不指定堆棧段,則SS=PSP段地址,SP=100H,堆棧段占用PSP中的部分區(qū)域。2022年5月3日星期二例 .MODE
38、L SMALL ;小內(nèi)存模式 .586 ;可匯編并運行586指令 .STACK 100H ;256字節(jié)堆棧 .DATA MSG DB Welcome$ ;要寫的信息 .CODE .STARTUP MOV DX,OFFSET MSG ;信息存儲區(qū)首地址送DX MOV AH,9H INT 21H ;DOS寫功能調(diào)用,在屏幕顯示變量MSG內(nèi)容 Welcome .EXIT 0 ;返回 END2022年5月3日星期二(2).COM格式的程序框架.COM程序是一種將代碼、數(shù)據(jù)和堆棧段合一的結(jié)構(gòu)緊湊的程序,所有的段都在一個邏輯段內(nèi),不超過64KB。在程序中采用.MODEL TINY模式定義語句即可生成COM
39、結(jié)構(gòu)的程序。COM文件存儲在磁盤上是主存的完全影像,不包含重新定位的加載信息,加載速度更快,占用的磁盤空間更少。COM程序加載后:1所有段地址都指向PSP的段地址;2程序執(zhí)行起點是PSP后的第一條指令,既IP=100H;也就是說,COM程序的第一條指令必須是可執(zhí)行指令,即程序的起始執(zhí)行處是程序頭。3堆棧區(qū)設(shè)在段尾通常為FFFEH),棧底的內(nèi)容置為0000字。2022年5月3日星期二例子 .MODEL TINY ;采用微型模式.CODE ;只有一個段,沒有數(shù)據(jù)段和附加段.STARTUP ;等效于ORG 100H,匯編程序自動產(chǎn)生MOV DX,OFFSET STRING1 ;顯示提示信息MOV A
40、H,9INT 21HMOV AH,01H ;等待按鍵INT 21HMOV DX,OFFSET STRING2 ;顯示結(jié)束信息MOV AH,9INT 21H.EXIT 0STRING1 DB PRESS ANY KEY TO CONTINUE!$ STRING2 DB 10,13,PROGRAM RUN COMPLETE!$END2022年5月3日星期二一、重復匯編偽指令(1按參數(shù)值重復偽指令REPEAT:按設(shè)定的重復次數(shù)連續(xù)重復匯編重復體的語句,其格式為: REPEAT 重復次數(shù) ;重復開始 重復體 ENDM ;重復結(jié)束 例:定義26個大寫字母 CHARA A_ZTABLE EQU THIS BYTE ;A_ZTABLE用于為字符串指明首地址 REPEAT 26 DB CHAR CHAR=CHAR十l ENDM(2按參數(shù)個數(shù)重復偽指令FOR:每一次的重復把重復體中的形參用一個實參取代 FOR 形參, 重復體 ENDM例: 要保護常用寄存器,可用如下偽指令: FOR REGAD, PUSH REGAD ENDM5.3.2 重復匯編和條件匯編偽指令2022年5月3日星期二(3按參數(shù)字符個數(shù)重復偽指令FORC:每一次的重復把重復體中的形參用一個字符取代。 FORC 形參,字符串 ;或FO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 咖啡館場地租賃合同
- 建筑單價施工合同
- 亮化工程合同協(xié)議書
- 北京租房居間合同
- 會議接待流程優(yōu)化方案
- 室外地磚施工方案
- 老路破除修補施工方案
- 別墅屋頂防水施工方案
- 浮吊桁架吊裝施工方案
- 堤壩加固施工方案
- 2025年皖西衛(wèi)生職業(yè)學院單招職業(yè)技能測試題庫含答案
- 中小學-安全使用與維護家用電器-主題班會教案
- 2025年湖南信息職業(yè)技術(shù)學院單招職業(yè)技能測試題庫及答案1套
- 2025年湖南中醫(yī)藥高等專科學校單招職業(yè)技能測試題庫必考題
- 2025年陜西延長石油集團有限責任公司招聘筆試參考題庫含答案解析
- 三八婦女節(jié)模板
- 地鐵出入口施工方案
- 2024年湖南省中考英語試題卷(含答案)
- 小學語文新課標學習任務群的基本理解和操作要領(lǐng)
- 績效評價師考試-隨機題庫
- 進貨檢驗指引及流程到貨物料包裝、數(shù)量、質(zhì)量檢查辦法
評論
0/150
提交評論