第3章匯編語言程格式_第1頁
第3章匯編語言程格式_第2頁
第3章匯編語言程格式_第3頁
第3章匯編語言程格式_第4頁
第3章匯編語言程格式_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、0第l3.1 匯編程序功能l3.2 偽操作l3.3 匯編語言程序格式l3.4 匯編語言程序的上機(jī)過程13.1 匯編程序功能l 計算機(jī)是通過執(zhí)行指令序列來解決問題的。計算機(jī)的指令系統(tǒng)就是指該計算機(jī)能夠執(zhí)行的全部指令的集合。l 指令的一般格式:l 標(biāo)號: 操作符 opd, ops ;注釋l 算術(shù)運(yùn)算和位操作類指令的部分單操作數(shù)指令的格式:l 標(biāo)號: 操作符 opd ;注釋2匯編語言程序的建立及開發(fā)過程編輯編輯文本編輯器,如文本編輯器,如 edit.com源程序:文件名源程序:文件名.asm匯編匯編匯編程序,如匯編程序,如 masm.exe目標(biāo)模塊:文件名目標(biāo)模塊:文件名.obj連接連接連接程序,如

2、連接程序,如 link.exe可執(zhí)行文件:文件名可執(zhí)行文件:文件名.exe調(diào)試調(diào)試調(diào)試程序,如調(diào)試程序,如 debug.exe應(yīng)用程序應(yīng)用程序錯誤錯誤錯誤錯誤錯誤錯誤錯誤錯誤3匯編程序的主要功能l檢查源程序l測出源程序中的語法錯誤,并給出出錯信息l產(chǎn)生源程序的目標(biāo)程序,并可給出列表文件(同時列出匯編語言和機(jī)器語言的文件,稱為lst文件)l展開宏指令43.2 偽操作使cpu產(chǎn)生動作、并在程序運(yùn)行期間由計算機(jī)執(zhí)行的語句。(directive)不產(chǎn)生cpu動作、在程序執(zhí)行前由匯編程序處理的說明性語句,例如,數(shù)據(jù)說明、變量定義等等。l偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān)。5匯編語言語句

3、實(shí)例匯編語言語句實(shí)例 mov cx,0;傳送指令,具有2個操作數(shù) delay: nop ;空操作指令,沒有操作數(shù),帶有標(biāo)號 loop delay ;循環(huán)指令,標(biāo)號delay說明轉(zhuǎn)移位置 buffer db 1,2,3,4,5,6,7 ;數(shù)據(jù)定義偽指令,在主存中開辟7個連續(xù)的字節(jié)單元,初值依次為17,buffer表示首地址63.2.1 段定義偽操作1.完整的段定義偽操作 存儲器的物理地址是由段地址和偏移地址組合而成的,匯編程序在把源程序轉(zhuǎn)換為目標(biāo)程序時,必須確定標(biāo)號和變量的偏移地址,并且需要把有關(guān)信息通過目標(biāo)模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起,形成一個可執(zhí)行程序。為此需要

4、用段定義偽操作,格式如下: 段名 segment 定位 組合 使用 類別 . ;對數(shù)據(jù)段,附加段和堆棧段,一般是存儲單元的定. ;義,分配等偽操作,對代碼段則是指令及偽操作 段名 ends7l完整段定義由segment和ends這一對偽指令實(shí)現(xiàn),segment偽指令定義一個邏輯段的開始,ends偽指令表示一個段的結(jié)束l段定義指令后的4個關(guān)鍵字用于確定段的各種屬性,堆棧段要采用stack組合類型,代碼段應(yīng)具有code類別,其他為可選屬性參數(shù)l如果不指定,則采用默認(rèn)參數(shù);但如果指定,注意要按照上列次序。8(1)定位類型:指定邏輯段在主存儲器中的邊界,可為: byte 該段可以從任何地址開始,這樣偏

5、移地址可能不是0 word 該段必須從字的邊界開始,即段起始地址必須為偶數(shù) dword 該段必須從雙字的邊界開始,即段起始地址的最低兩個十六進(jìn)制數(shù)位必須為4的倍數(shù) para 該段的起始地址必須從小段邊界開始,即段起始地址的最低16進(jìn)制數(shù)必須為0 9 page 該段必須從頁的邊界開始,即段的起始地址的最低兩個十六進(jìn)制數(shù)位必須為0l簡化段定義偽指令的代碼和數(shù)據(jù)段默認(rèn)采用word定位,堆棧段默認(rèn)采用para定位l完整段定義偽指令的默認(rèn)定位屬性是para,其低4位已經(jīng)是0,所以默認(rèn)情況下數(shù)據(jù)段的偏移地址從0開始10(2)組合類型說明程序連接時的段合并方法,即指定多個邏輯段之間的關(guān)系,可為: priva

6、te 本段為私有段,與其他段沒有邏輯關(guān)系,在連接時不與其他段合并,每段都有自己的段地址。這是完整段定義偽指令默認(rèn)的段組合方式 public連接程序把本段與所有同名同類型的其他段相鄰地連接在一起,然后為所有這些段指定一個共同的段地址,也就是合成一個物理段。這是簡化段定義偽指令默認(rèn)的段組合 stack本段是堆棧的一部分,連接程序?qū)⑺衧tack段按照與public段的同樣方式進(jìn)行合并。這是堆棧段必須具有的段組合11(3)使用類型是支持32位段而設(shè)置的屬性,用來說明使用16位尋址方式還是32位尋址方式 對于16位x86 cpu來說,它默認(rèn)是16位段,即use16 而對于匯編32位x86 cpu指令時

7、,它默認(rèn)采用32位段,即use32;但可以使用use16指定標(biāo)準(zhǔn)的16位段l編寫運(yùn)行于實(shí)地址方式(8086工作方式)的匯編語言程序,必須采用16位段12(4)類別在引號中給出連接時組成段組的類型名。當(dāng)連接程序組織段時,并不能把相同類別的段合并起來,但可將所有的同類別段相鄰分配l段類別可以是任意名稱,但必須位于單引號中l(wèi)大多數(shù)masm程序使用 code、data和stack來分別指名代碼段、數(shù)據(jù)段和堆棧段,以保持所有代碼和數(shù)據(jù)的連續(xù)13 此外,必須明確段與段寄存器的關(guān)系,可用assume偽操作來實(shí)現(xiàn)。格式: assume 段寄存器:段名 ,段寄存器名:段名, .作用:l通知masm用指定的段寄存

8、器來尋址對應(yīng)的邏輯段,即建立段寄存器與段的缺省關(guān)系l在明確了程序中各段與段寄存器之間的關(guān)系后,匯編程序會根據(jù)數(shù)據(jù)所在的邏輯段,在需要時自動插入段超越前綴。這是assume偽指令的主要功能。14lassume偽指令并不為段寄存器設(shè)定初值,所以在代碼段中還必須把段地址裝入相應(yīng)的段寄存器中。例如:定義數(shù)據(jù)段段名為data,則需使用mov指令對ds段寄存器進(jìn)行賦值。 mov ax, data mov ds, axl如果程序中有堆棧段,也需要把地址裝入ss中l(wèi)代碼段不需要這樣做,代碼段的這一操作是在程序初始化時完成的。15例:完整的段定義偽操作例:完整的段定義偽操作data_1 segmentdata_

9、1 segmentdata_1 endsdata_1 endsdata_2 segmentdata_2 segmentdata_2 endsdata_2 endscode segment code segment assume cs:code,ds:data_1,es:data_2 assume cs:code,ds:data_1,es:data_2start:start: mov ax,data_1 mov ax,data_1 mov ds,ax mov ds,ax mov ax,data_2 mov ax,data_2 mov es,ax mov es,axcode endscode en

10、ds end start end start162.存儲模型與簡化段定義偽操作(1)model偽操作 格式:.model memory_model,model optionsl用來表明存儲模型,即用來說明在存儲器中是如何安放各個段的l存儲模型memory model決定一個程序的規(guī)模,確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問的缺省屬性lmasm有7種不同的存儲模式: tiny small compact medium large huge flat17liny微型模型是masm 6.0才引入的,用于創(chuàng)建com類型程序。用微型模型編寫匯編語言程序時,所有的段地址寄存器都被設(shè)置為同一值,這意味著代碼

11、段、數(shù)據(jù)段、堆棧段都在同一個段內(nèi),不大于64kb;訪問操作數(shù)或指令都只需要使用16位偏移地址。一般用于小程序。lmall 小型模型是最常用的一種模型。在小型模型下,一個程序至多只能有一個代碼段和一個數(shù)據(jù)段,每段不大于64kb。這里的數(shù)據(jù)段指數(shù)據(jù)段、堆棧段和附加段的總和,它們共用同一個段基址,總長度不超過64kb;訪問操作數(shù)或指令都只需要使用16位偏移地址;代碼和數(shù)據(jù)都是近訪問的,小模型下程序的最大長度為128kb18lompact 緊湊模型適合于數(shù)據(jù)量大但代碼量小的程序。在該模型下,代碼段被限制在一個不大于64kb的段內(nèi);而數(shù)據(jù)段則可以有多個,超過64kb。代碼是近訪問的,而數(shù)據(jù)則可為遠(yuǎn)訪問的

12、。ledium 中型模型是與緊湊模型互補(bǔ)的模型,適合于數(shù)據(jù)量小但代碼量大的程序。中型模式的代碼段可以超過64kb,有多個;但數(shù)據(jù)段只能有一個不大于64kb的段。數(shù)據(jù)是近訪問,而代碼可遠(yuǎn)訪問。large 大型模式允許的代碼段和數(shù)據(jù)段都有多個,都可以超過64kb;但全部的靜態(tài)數(shù)據(jù)(不能改變的數(shù)據(jù))仍限制在64k字節(jié)內(nèi).數(shù)據(jù)和代碼都可以遠(yuǎn)訪問。19luge 巨型模型與大型模型基本相同,只是靜態(tài)數(shù)據(jù)不再被限制在64k字節(jié)之內(nèi)。llat 平展模型用于創(chuàng)建一個32位的程序,它只能運(yùn)行在32位x86 cpu上。dos下不能使用flat模型,而編寫32位windows 9.x或windows-nt的程序時,必

13、須采用flat模型。ldos下編程可選擇前六種模型,一般可以選用small模型,tiny模式產(chǎn)生com程序,其他模型產(chǎn)生exe程序,flat模型只能用于32位程序。20lmodel options允許用戶指定三種選項:高級語言接口、操作系統(tǒng)和堆棧距離。高級語言接口選項是指該匯編語言程序作為某一種高級語言程序的過程而為該高級語言程序調(diào)用時,應(yīng)該用等來說明。操作系統(tǒng)選項是要說明程序運(yùn)行于哪個操作系統(tǒng)之下,可用os_dos或os_os2來說明,默認(rèn)是os_dos。堆棧距離選項可用nearstack或farstack來說明,基中nearstack是指堆棧段和數(shù)據(jù)段組合到一個dgroup段中,而fars

14、tack是指堆棧段和數(shù)據(jù)段并不合并。例如:.model small,c .model large,os_dos21(2)簡化的段定義偽操作簡化段定義偽指令指明一個邏輯段的開始,同時自動結(jié)束前面的一個段。采用簡化段定義偽指令前,需有.model語句。常用:.stack 大?。欢褩6伍_始.data;數(shù)據(jù)段開始.code 段名;代碼段開始.stack 大小堆棧段偽指令.stack創(chuàng)建一個堆棧段,段名是:stack,它的參數(shù)指定堆棧段所占存儲區(qū)的字節(jié)數(shù),默認(rèn)是1kb(= 1024 = 400h字節(jié))22.data.data數(shù)據(jù)段偽指令.data創(chuàng)建一個數(shù)據(jù)段,段名是:_data。它用于定義具有初值的變

15、量,當(dāng)然也允許定義無初值的變量。 無初值變量可以安排在另一個段中,它用.data?偽指令創(chuàng)建,數(shù)據(jù)段名是:_bss。 .const偽指令用于建立只讀的常量數(shù)據(jù)段(段名:const).code .code 段名段名 代碼段偽指令.code創(chuàng)建一個代碼段,它的參數(shù)指定該代碼段的段名。如果沒有給出段名,則采用默認(rèn)段名:在tiny、small、compact和flat模式下,默認(rèn)的代碼段名是:_text;在medium、large和huge模式下,默認(rèn)的代碼段名是:模塊名_text。23(3)與簡化段定義有關(guān)的預(yù)定義符號使用簡化段定義,各段名稱和其他用戶所需的信息可以使用masm預(yù)定義符號,例如:da

16、ta表示由.data等定義的數(shù)據(jù)段的段名。(4)簡化段定義舉例.model small .stack 100h .data .codestart:mov ax,data mov ds,axmov ax,4c00hint 21hend start243.段組定義偽操作格式:組名 group 段名,段名,.l把多個同類段合并為一個64kb物理段,并用一個組名統(tǒng)一存取它l定義段組后,段組內(nèi)各段就統(tǒng)一為一個段地址,各段定義的變量和標(biāo)號的偏移地址就相對于段組基地址計算loffset操作符取變量和標(biāo)號相對于段組的偏移地址,如果沒有段組則取得相對于段的偏移地址。offset后可以跟段組中的某個段名,表示該段

17、最后一個字節(jié)后面字節(jié)相對于段組的偏移地址253.2.2 程序開始和結(jié)束偽操作l程序開始可用name和itle作為模塊的名字。 name的格式:name 模塊名匯編語言將以給出的”模塊名”作為模塊的名字。title的格式:title 標(biāo)題title偽操作可指定列表文件中的每一頁上打印的標(biāo)題lend表源程序結(jié)束的偽操作,格式為:end 標(biāo)號用來指示匯編程序masm到此結(jié)束匯編過程。源程序的最后必須有一條end語句。可選的標(biāo)號用于指定程序開始執(zhí)行點(diǎn),連接程序?qū)?jù)此設(shè)置cs : ip值26lmasm6.0還增加了定義程序入口點(diǎn)和出口點(diǎn)的偽操作。用.startup定義程序的初始入口點(diǎn),并產(chǎn)生設(shè)置ds,s

18、s和sp的代碼。如果程序采用了.startup偽指令就不需要再用“end 標(biāo)號”指明開始執(zhí)行點(diǎn),但還要有end偽指令l.exit用來產(chǎn)生退出程序并返回操作系統(tǒng)的代碼,其格式: .exit 返回參數(shù)可選參數(shù)是一個返回的數(shù)碼,通常用0表示沒有錯誤。例如.exit 0對應(yīng)的代碼是:mov ax,4c00h int 21hldos功能調(diào)用的4ch子功能(返回dos): 入口參數(shù):ah4ch,al返回數(shù)碼273.3 參數(shù)、變量和標(biāo)號l本節(jié)詳細(xì)討論匯編語言程序語句的主要部分:參數(shù) 變量名 標(biāo)號l并引出相關(guān)的偽指令和操作符l本節(jié)重點(diǎn)掌握:常數(shù)的表達(dá)變量定義偽指令db/dw/dd、地址操作符和類型操作符283

19、.3.1 數(shù)值型參數(shù)l在源程序語句格式的4個組成部分中,參數(shù)是指令的操作對象(在學(xué)習(xí)硬指令時被稱為操作數(shù)),參數(shù)之間用逗號分隔l參數(shù)根據(jù)指令不同可以沒有,可以有1個、2個或多個l匯編語言程序中,指令參數(shù)有數(shù)值型,它的主要形式是常數(shù)和數(shù)值表達(dá)式;l硬指令的操作數(shù)有立即數(shù);立即數(shù)就要用數(shù)值型參數(shù)表達(dá)291. 常數(shù)l常數(shù)(常量)表示一個固定的數(shù)值l它又分成多種形式:(1)十進(jìn)制常數(shù)(2)十六進(jìn)制常數(shù)(3)二進(jìn)制常數(shù)(4)八進(jìn)制常數(shù)(5)字符串常數(shù)(6)符號常數(shù)30十進(jìn)制常數(shù)l由0 9數(shù)字組成,以字母d或d結(jié)尾l缺省情況下,后綴d或d可以省略l匯編語言大小寫不敏感,d和d通用l例如:100、255d3

20、1十六進(jìn)制常數(shù)l由09、af組成,以字母h或h結(jié)尾l以字母af開頭的十六進(jìn)制數(shù),前面要用0表達(dá),以避免與其他符號混淆l匯編語言大小寫不敏感, h和h 通用l例如:64h、0ffh、0b800h32二進(jìn)制常數(shù)l由0或1兩個數(shù)字組成,以字母b或b結(jié)尾l匯編語言大小寫不敏感,b和b通用l例如:01101100b33八進(jìn)制常數(shù)l由0 7數(shù)字組成,以字母q或q結(jié)尾l匯編語言大小寫不敏感,q和 q 通用l例如:144ql各種進(jìn)制的數(shù)據(jù)以后綴字母區(qū)分,默認(rèn)不加后綴字母的是十進(jìn)制數(shù)masm提供基數(shù)控制.radix偽指令可以改變默認(rèn)進(jìn)制,其格式是:.radix n 34字符串常數(shù)l用單引號或雙引號括起來的單個字

21、符或多個字符,其數(shù)值是每個字符對應(yīng)的ascii碼的值l例如:d = 64hab= 4142h1= 31hhello, everybody !35符號常數(shù)利用一個標(biāo)識符表達(dá)的一個數(shù)值masm提供等價機(jī)制,用于常量定義符號定義偽指令:l等價equ偽指令符號名 equ 數(shù)值表達(dá)式符號名 equ l等號=偽指令符號名 = 數(shù)值表達(dá)式常數(shù)若使用有意義的符號名來表示,可以提高程序的可讀性,同時更具有通用性36符號定義doswritechar equ 2carriagereturn = 13calldos equ 符號應(yīng)用(左邊程序段等價右側(cè)的符號形式)mov ah,2;mov ah,doswritecha

22、rmov dl,13;mov dl,carriagereturnint 21h;calldos372. 數(shù)值表達(dá)式l數(shù)值表達(dá)式一般是指由運(yùn)算符連接的各種常數(shù)所構(gòu)成的表達(dá)式l匯編程序在匯編過程中計算表達(dá)式,最終得到一個數(shù)值l程序運(yùn)行之前,就已經(jīng)計算出了表達(dá)式;所以,程序運(yùn)行速度沒有變慢,但增強(qiáng)程序的可讀性lmasm對除偽指令外各種匯編時處理的指令統(tǒng)稱為操作符(operator)38運(yùn)算符l算術(shù)運(yùn)算符+ - * / modl邏輯運(yùn)算符and or xor notl移位運(yùn)算符shl shrl關(guān)系運(yùn)算符eq ne gt lt ge lel高低分離符high low highword lowword39

23、算術(shù)運(yùn)算符l實(shí)現(xiàn)加、減、乘、除、取余的算術(shù)運(yùn)算mov ax,3*4+5 ;等價于 mov ax,17l其中mod也稱為取模,它產(chǎn)生除法之后的余數(shù),如19 mod 7 = 5l加+和減-運(yùn)算符還可以用于地址表達(dá)式l除加、減外,其他運(yùn)算符的參數(shù)必須是整數(shù)40邏輯運(yùn)算符l實(shí)現(xiàn)按位相與、相或、異或、求反的邏輯運(yùn)算or al,03h and 45h;等價于 or al,01h41移位運(yùn)算符l實(shí)現(xiàn)對數(shù)值的左移、右移的邏輯操作;移入低位或高位的是0l格式為:數(shù)值表達(dá)式 shl/shr 移位次數(shù)mov al,0101b shl (2*2);等價于 mov al,01010000b42關(guān)系運(yùn)算符l用于比較和測試

24、符號數(shù)值lmasm用0ffffh(補(bǔ)碼 -1)表示條件為真lmasm用0000h表示條件為假mov bx,(port lt 5)and 20)or(port ge 5)and 30);當(dāng)port5時,匯編結(jié)果為mov bx,20;否則,匯編結(jié)果為mov bx,3043高低分離符l取數(shù)值的高半部分或低半部分lhigh、low從一個字?jǐn)?shù)值或符號常量中得到高、低字節(jié)mov ah,high 8765h;等價于mov ah,87hl從masm 6.0引入的highword、lowword取一個符號常量(不能是其他常數(shù))的高字或低字部分dd_value equ 0ffff1234h;定義一個符號常量mov

25、 ax,lowword dd_value;等價于mov ax,1234h443. 運(yùn)算符的優(yōu)先級1() length size width mask2ptr offset seg tpye this :3hige low4* / mod shl shr5+ -6eq ne gt lt ge le7not8and9or xor10short 建議采用圓括號建議采用圓括號“()()”顯式表達(dá),它可顯式表達(dá),它可以極大地提高程序的可閱讀性以極大地提高程序的可閱讀性454.地址型參數(shù)l匯編語言程序中,指令參數(shù)還有地址型,它的主要形式是標(biāo)號和名字(變量名、段名、過程名等)l硬指令的操作數(shù)有存儲單元;存儲

26、單元就應(yīng)該用地址型參數(shù)(存儲器操作數(shù))表達(dá)463.3.2 變量定義偽指令l變量定義(define)偽指令為變量申請固定長度的存儲空間,并可同時將相應(yīng)的存儲單元初始化變量名 偽指令助記符 初值表 變量定義偽指令最常使用變量定義偽指令最常使用47變量名l變量名為用戶自定義標(biāo)識符,表示初值表首元素的邏輯地址;用這個符號表示地址,常稱為符號地址l變量名可以沒有。這種情況,匯編程序?qū)⒅苯訛槌踔当矸峙淇臻g,無符號地址l設(shè)置變量名是為了方便存取它指示的存儲單元48初值表l初值表是用逗號分隔的參數(shù)l主要由數(shù)值常數(shù)、表達(dá)式或?、dup組成?表示初值不確定,即未賦初值;dup表示重復(fù)初值dup的格式為:重復(fù)次數(shù)

27、dup(重復(fù)初值參數(shù))49變量定義偽指令助記符l變量定義偽指令根據(jù)申請的主存空間單位分類ldb定義字節(jié)偽指令ldw定義字偽指令ldd定義雙字偽指令ldf定義3字偽指令ldq定義4字偽指令ldt定義10字節(jié)偽指令l還有定位偽指令50定義字節(jié)單元偽指令dbdb偽指令用于分配一個或多個字節(jié)單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)一定是字節(jié)量(byte),存放一個8位數(shù)據(jù): 可以是0255的無符號數(shù) 或是128127帶符號數(shù) 也可以是字符串常數(shù)51datasegment;數(shù)據(jù)段xdb a,-5db 2 dup(100),?ydb abcdataendsmov al,x ;此處x表示它的第1個數(shù)

28、據(jù), 故alainc x+1 ;對x為始的第2個數(shù)據(jù)減1, 故成為-4mov y,al ;現(xiàn)在y這個字符串成為 abc52定義字單元偽指令dwdw偽指令用于分配一個或多個字單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)一定是字量(word),一個字單元可用于存放任何16位數(shù)據(jù): 一個段地址一個偏移地址 兩個字符 065535之間的無符號數(shù) 3276832767之間的帶符號數(shù)53datasegment;數(shù)據(jù)段countdw 8000h,?,abmaxint equ 64hnumber dw maxintarraydw maxint dup(0)dataends54字變量和字常量的定義:wnum

29、equ 5678h;定義wnum為常量count dw 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,countsi; mov ax,si+10hlea bx,count; lea bx,0010hmov bx,offset count; mov bx,0010h55定義雙字單元偽指令dddd偽指令用于分配一個或多個雙字單元,并可以將它們初始化為指定值初值表中每個數(shù)據(jù)是一個32位的雙字量(

30、double word): 可以是有符號或無符號的32位整數(shù) 也可以用來表達(dá)16位段地址(高位字)和16位的偏移地址(低位字)的遠(yuǎn)指針vardddd 0,?,12345678hfarpointdd 00400078h56其他數(shù)據(jù)單元定義偽指令l定義3字偽指令df用于為一個或多個6字節(jié)變量分配空間及初始化6字節(jié)常用在32位cpu中表示一個48位遠(yuǎn)指針(16位段選擇器:32位偏移地址)l定義4字偽指令dq用于為一個或多個8字節(jié)變量分配空間及初始化8字節(jié)變量可以表達(dá)一個64位整數(shù)l定義10字節(jié)偽指令dt用于為一個或多個10字節(jié)變量分配空間及初始化10字節(jié)變量可以表達(dá)擴(kuò)展精度浮點(diǎn)數(shù)57.model s

31、mall.stack.databvar db 16wvar dw 4*3dvar dd 4294967295 ;2321qvar dq ? db 1,2,3,4,5tvar dt 2345 ;定義了bcd碼2345habc db a,b,cmsg db hello,13,10,$bbuf db 12 dup(month)dbuf dd 25 dup(?)calldos equ .code.startup mov bl,bvar mov ax,word ptr dvar0 mov dx,word ptr dvar2;取雙字到dx.ax mov dx,offset msg mov ah,09h c

32、alldos.exit 0end58定位偽指令定位偽指令控制數(shù)據(jù)的偏移地址lorg 參數(shù)org偽指令是將當(dāng)前偏移地址指針指向參數(shù)表達(dá)的偏移地址:org 100h;從100h處安排數(shù)據(jù)或程序org $+10;使偏移地址加10,即跳過10個字節(jié)空間masm中,符號“$”表示當(dāng)前偏移地址值leven;從偶地址開始lalign n;從n的整數(shù)倍地址開始593.3.3 變量和標(biāo)號的屬性l標(biāo)號和名字一經(jīng)定義便具有以下兩類三種屬性: 段值v標(biāo)號和名字對應(yīng)存儲單元的段地址 偏移值v標(biāo)號和名字對應(yīng)存儲單元的偏移地址 類型v標(biāo)號、子程序名的類型可以是near(近)和far(遠(yuǎn)),分別表示段內(nèi)或段間v變量名的類型可

33、以是byte(字節(jié))、word(字)和dword(雙字)等地址屬性地址屬性類型屬性類型屬性60地址操作符l取得名字或標(biāo)號的段地址和偏移地址兩個屬性 將括起的表達(dá)式作為存儲器地址$當(dāng)前偏移地址:采用指定的段地址寄存器offset 名字/標(biāo)號返回名字或標(biāo)號的偏移地址seg 名字/標(biāo)號返回名字或標(biāo)號的段地址61org $+10arraydb 45,45h.codemov ax,seg arraymov ds,axmov bx,offset array;等價于 lea bx,arraymov cl,array+4;等效于 mov cl,array4mov ax,es:2000h62類型操作符l類型操作

34、符對名字或標(biāo)號的類型屬性進(jìn)行有關(guān)設(shè)置類型名 ptr 名字/標(biāo)號this 類型名short 標(biāo)號type 名字/標(biāo)號sizeof 變量名lengthof 變量名63類型名 ptr 名字/標(biāo)號lptr操作符使名字或標(biāo)號具有指定的類型l類型名可以是byte/word/dword/fword/qword/tbyte或者是near/far,還可以是由struct、record、union以及typedef定義的類型mov al,byte ptr w_var;w_var是一個字變量jmp far ptr n_label;n_label是一個標(biāo)號l使用ptr操作符,可以臨時改變名字或標(biāo)號的類型64this

35、類型名l利用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 label far)n_jump: mov ax,w_var;用n_jump為段內(nèi)近轉(zhuǎn)移,但兩者指向同一條指令llabel偽指令的功能等同于“equ this”65short 標(biāo)名l指定標(biāo)號作為-128+127字節(jié)范圍內(nèi)的短轉(zhuǎn)移jmp short n_jumpl當(dāng)然,如果標(biāo)號實(shí)際上超出了這個范圍

36、,則出錯。66type 名字/標(biāo)名l返回表明名字或標(biāo)號類型的一個字量數(shù)值q 對字節(jié)、字和雙字變量依次返回1、2和4;q 對短、近和遠(yuǎn)轉(zhuǎn)移依次返回ff01h、ff02h和ff05hmov ax,type w_var;匯編結(jié)果為mov ax,2mov ax,type n_jump;匯編結(jié)果為 mov ax,0ff02h(near標(biāo)號)l操作符sizeof返回整個變量占用的字節(jié)數(shù)llengthof返回整個變量的數(shù)據(jù)項數(shù)(即元素數(shù)) sizeof lengthof type67.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的偏移地址68.code.startup mov al,byte ptr v_word ;用ptr改變v_word的類型,否則類型不匹配 dec al mov v_byte,al ;對v_word的頭一個字節(jié)操作,原為32h、現(xiàn)為31

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論