版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第一章基礎(chǔ)知識
匯編語言程序結(jié)構(gòu)第一章基礎(chǔ)知識機器語言—計算機能夠直接識別并執(zhí)行的二進制機器指令序列優(yōu)點:開銷小、運行速度快;缺點:難以編寫和理解,編程效率很低。匯編語言(AssemblyLanguage)—用助記符號表示機器指令代碼、變量地址,標(biāo)號等的符號指令序列。優(yōu)點:易記、易理解,易編寫程序,大大提高了編程效率;問題:需要將助記符號翻譯為機器語言。匯編語言源程序:用匯編語言編寫的程序。匯編程序:將助記符號翻譯為機器語言的語言處理程序,以便計算機能夠識別。匯編:將助記符號翻譯為機器語言的過程。理解以上幾個名詞概念:
匯編語言、匯編語言源程序、匯編程序、匯編概念第一節(jié):匯編程序功能及上機過程
匯編程序功能
匯編程序的主要功能如下:(1)檢測語法錯顯示錯誤信息(2)源程序文件二進制目標(biāo)文件(并輸出*.LST文件)(3)展開宏指令一般匯編程序都應(yīng)具有如下功能:
?
宏匯編功能
?
支持地址和數(shù)據(jù)的符號表示
?
支持內(nèi)存管理
?
支持程序的模塊化組織
?
支持多種類型的數(shù)據(jù)表示等
匯編程序依賴于硬件,不同機型的系統(tǒng)有自己的匯編程序。上機過程上機過程如圖所示第一章基礎(chǔ)知識匯編語言源程序的結(jié)構(gòu)與書寫格式匯編語言源程序是段結(jié)構(gòu)的:代碼段、數(shù)據(jù)段、堆棧段、附加段
源程序由段組成,每段有一個段名,segment定義段起點,ends定義段結(jié)束點。每段由若干語句行組成,源程序以end結(jié)束。
例字符串傳送指令和偽指令指令——使CPU產(chǎn)生動作、并在程序執(zhí)行時才處理的語句,就是前一章學(xué)習(xí)的處理器指令偽指令(Directive)——不產(chǎn)生CPU動作、在程序執(zhí)行前由匯編程序處理的說明性語句,例如,數(shù)據(jù)說明、變量定義等等偽指令與具體的處理器類型無關(guān),但與匯編程序的版本有關(guān)
本課程采用微軟宏匯編程序MASM5.0匯編語言語句一般格式為:
[標(biāo)識符/語句標(biāo)號]指令名
[操作數(shù)序列][;注釋]標(biāo)識符——用來為變量、段及過程等命名
語句標(biāo)號——標(biāo)識符后加
:
,提供轉(zhuǎn)移地址指令名——指令可分為三類:機器指令、偽指令和宏指令。
機器指令:指令系統(tǒng)中的指令,程序運行時由CPU執(zhí)行;
偽指令:匯編程序執(zhí)行的操作,規(guī)定匯編程序如何按要求進行匯編及分配內(nèi)存。宏指令:由一系列指令或偽指令構(gòu)成,匯編時展開成若干條機器指令,用于提高編程效率。操作數(shù)序列——可以是常量、變量、表達式、寄存器名或標(biāo)號等,用逗號隔開。(偽指令和宏指令由匯編程序在匯編期間處理)注釋符——
“;”后可給出語句注釋,提高可讀性和可理解性。第二節(jié):匯編語言語句格式與分類
(1)常量
00110110B389D467OB407H
3.475E+5'Inputanumber'(2)變量變量名:存儲單元的符號地址變量值:存儲單元中的數(shù)據(jù)MOVAL,'A'moval,'a'變量的三種屬性:段值(SEG):變量所在段的起始地址偏移量(OFFSET):段起點距離變量所在存儲單元位置的字節(jié)數(shù)50偏移量段起點
類型(TYPE):變量占用的字節(jié)數(shù)常量、變量、標(biāo)號(3)標(biāo)號
標(biāo)號:存放指令的存儲單元的符號地址,常用作轉(zhuǎn)移地址。NEAR
:2字節(jié)轉(zhuǎn)移地址
…CMPAX,BXJNENEXT…NEXT:
MOVAX,0…標(biāo)號的三種屬性:段值(SEG):標(biāo)號所在段的起始地址偏移量(OFFSET):段起點距離標(biāo)號所指存儲單元位置的字節(jié)數(shù)
類型(TYPE):
NEAR,F(xiàn)AR(偏移地址)
短指針(近指針)段內(nèi)轉(zhuǎn)移FAR:4字節(jié)轉(zhuǎn)移地址
(段、偏移地址)
長指針(遠指針)段間轉(zhuǎn)移第一章基礎(chǔ)知識匯編語言程序的語句類型:
1、程序執(zhí)行指令語句。
2、偽操作語句。
3、宏指令語句。
偽操作的功能:偽操作又稱為偽指令,它不象機器指令那樣是在程序運行期間由計算機來執(zhí)行的,它是在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理的操作,它們可以完成如下功能:(1)符號定義偽指令(2)數(shù)據(jù)定義偽指令(3)段定義偽指令(4)過程定義偽指令(5)條件匯編偽指令(6)宏指令(7)結(jié)構(gòu)與記錄
一、數(shù)據(jù)定義及存儲器分配偽操作
格式:[Variable]MnemonicOperand,…,Operand[;Comments]變量(Variable)字段:是可有可無的,它用符號地址表示,其作用與指令語句前的標(biāo)號相同,但它的后面不跟冒號。如果語句中有變量則匯編程序使其記以第一個字節(jié)的偏移地址。第一章基礎(chǔ)知識注釋(Comments)字段:用來說明該偽操作的功能,它也是可有可無的。助記符(Mnemonic)字段:說明所用偽操作的助記符,常用的有以下幾種:
DB偽操作:用來定義字節(jié),其后的每個操作數(shù)都占有一個字節(jié)。DW的操作:用來定義字,其后的每個操作數(shù)占有一個字(低位字節(jié)在第一個字節(jié)地址中,高位字節(jié)在第二個字節(jié)地址中)。
DD偽操作:用來定義雙字,其后的每個操作數(shù)占有二個字。DQ偽操作:用來定義四個字,其后的每個操作數(shù)占有四個字。DT偽操作:用來定義十個字節(jié),其后的每個操作數(shù)占有十個字節(jié),形成壓縮的BCD碼。這些偽操作可以把其后面跟著的數(shù)據(jù)存入指定的存儲單元,或者只分配存儲器空間而并不存入確定的數(shù)值。DW和DD偽操作可以存儲偏移地址或完整的地址。第一章基礎(chǔ)知識例操作數(shù)可以是常數(shù),或者是表達式(根據(jù)該表達式可以求得一個常數(shù)),如
DATA_BYTEDB10,4,l0HDATA_WORDDW100,100H,-5DATA—DWDD3*20,0FFFDH匯編程序可以在匯編期間在存儲器中存入數(shù)據(jù),如右圖所示。
例操作數(shù)也可以是字符串,如:
MESSAGEDB‘H2LLO’則存儲器存儲情況如下圖所示:
第一章基礎(chǔ)知識注意:DB’AB’和DW’AB’的存儲分配空間的不同。如下圖:例操作數(shù)?可以保留存儲空間,但不存入數(shù)據(jù)。如:ABCDB0,?,?,?,0DFFDW?,52,?經(jīng)匯編后的存儲情況如右圖所示。
第一章基礎(chǔ)知識
操作數(shù)字段還可以使用復(fù)制操作符來復(fù)制某個(或某些)操作數(shù)。其格式為:
repeat_countDUP(operate,operate,…)
其中repeat_count可以是一個表達式,它的值應(yīng)該是一個正整數(shù),用來指定括號中的操作數(shù)的重復(fù)次數(shù)。
例ARRAYlDB2DUP(0,1,2,?)ARRAY2DB100DUP(?)匯編后的存儲情況如下圖所示。ARRAYlDB2DUP(0,1,2,?)和以下語句是等價的:ARRAYlDB0,I,2,?,0,1,2,?第一章基礎(chǔ)知識例DUP操作可以嵌套,例如ARRAY3DB100DUP(0,2DUP(1,2),0,3)則匯編結(jié)果如右圖所示:
可以用DW或DD偽操作把變量或標(biāo)號的偏移地址(DW)或整個地址(DD)存入存儲器。用DD偽操作存入地址時,第一個字為偏移地址,第二個字為段地址。例如
PARAMETER_TABLEDWPAR1DWPAR2DWPAR3INTERSEG_DATADDDATA1DDDATA2則匯編后的存儲情況如下圖所示。其中偏移地址或段地址均占有一個宇,其低位字節(jié)占有第一個字節(jié),高位字節(jié)占有第二個字節(jié)。第一章基礎(chǔ)知識第一章基礎(chǔ)知識順便說明一下,這里操作數(shù)字段中的變量或標(biāo)號可以使用表達式如:在這種情況下,匯編后,存儲器中應(yīng)該存入表達式的值。例如
PARAMETER_TABLEDWPAR1+1DWPAR2+1說明變量的類型屬性問題:
在數(shù)據(jù)定義偽操作前面的變量的值是該偽操作中的第一個數(shù)據(jù)項在當(dāng)前段內(nèi)的第一個字節(jié)的偏移地址。此外,它還有一個類型屬性用來表示該語句中的每一個數(shù)據(jù)項的長度(以字節(jié)為單位表示),因此DB偽操作的類型屬性為1,DW為2,DD為4,DQ為8,DT則為10,變量表達式的屬性和變量是相同的。匯編程序可以用這種隱含的類型屬性來確定某些指令是字指令還是字節(jié)指令。
第一章基礎(chǔ)知識例如OPER1DB?,?
OPER2DW?,?…MOVOPER1,0MOVOPER2,0
則第一條指令應(yīng)為字節(jié)指令,第二條指令則應(yīng)為字指令。
如果有下列指令序列:OPER1DB1,2OPER2DW1234H,2345H…MOVAX,OPER1+1MOVAL,OPER2
匯編程序在匯編這一段程序時,能發(fā)現(xiàn)兩條MOV指令的兩個操作數(shù)的類型屬性是不相同的:
OPERl十1為字節(jié)類型屬性而AX為字類型屬性;
OPER2為字類型屬性而AL為字節(jié)類型屬性。匯編語言將指示由于屬性類型不匹配出錯。
第一章基礎(chǔ)知識有一個辦法可以指定操作數(shù)的類型屬性,它優(yōu)先于隱含的類型屬性,即可以使用PTR屬性操作符。其格式為:
typePTRVarible士constantexpression其中類型可以是BYTE,WORD或DWORD(雙字),這樣變量的類型就可以指定了。上面例子可以寫為:
OPER1DB1,2OPER2DW1234H,2345H…MOVAX,WORDPTROPER1+1MOVAL,BYTEPTROPER2通過PTR屬性操作符就把OPER1十1的類型屬性指定為字,兩個操作數(shù)的屬性就一致了,匯編時不會出錯,而運行時應(yīng)把OPER1十1的字內(nèi)容送到AX,即把OPER1十1的內(nèi)容送AL,把OPER2的第一個字節(jié)的內(nèi)容運AH,所以指令執(zhí)行完后,(AX)=3402H。同樣,對于第二條語句(AL)=34H第一章基礎(chǔ)知識LABEL偽操作:除了用屬性操作符給以定義外,還可以用LABEL偽操作來定義,其格式為:
nameLABELtype
(1)對于數(shù)據(jù)項可以表示為:
variable_nameLABELtype其中,type可以是BYTE,WORD或DWORD(雙字)。(2)對于可執(zhí)行的代碼,則可表示為
label_nameLABELtype其中,type可以是NEAR或FAR。第一章基礎(chǔ)知識例如4.9BYTE_ARRAYLABELBYTEWORD_ARRAYDW50DUP(?)這樣在100個字節(jié)數(shù)組中的第一個字節(jié)的地址賦于二個不同類型的變量名:字節(jié)類型的變量BYTE_ARRAY和字類型變量WORD_ARRAY。指令
MOVWORD_ARRAY十2.,0把該數(shù)組的第3個和第4個字節(jié)置0,而
MOVBYTE_ARRAY十2.,0則把該數(shù)組的第3個字節(jié)置0。
例:LABFLABELFARLAB:MOVAX,100第一章基礎(chǔ)知識二、表達式賦值偽操作EQU
有時程序中多次出現(xiàn)同一個表達式.為方便起見可以用賦值偽操作給表達式賦予一個名字,其格式如下:
此后,程序中凡需要用到該表達式之處就可以用表達式名來代替了。上式中的表達式可以是任何有效的操作數(shù)格式,可以是任何可以求出常數(shù)值的表達式,也可以是任何有效的助記符。舉例如下:
第一章基礎(chǔ)知識必須注意EQU語句的表達式中如果有變量或標(biāo)號的表達式,則在該語句前應(yīng)該先給出它們的定義。例如,語句:則必須放在DATA_ONE的定義之后才行,否則匯編程序?qū)⒅甘境鲥e。
另外還有一個與EQU相類似的=偽操作也可以作為賦值偽操作使用。它們之間的區(qū)別是:EQU偽操作中的表達式名是不允許重復(fù)定義的,而=偽操作則允許重復(fù)定義。例如:
EMP=6或
EMPEQU6都可以使數(shù)6賦以符號名EMP,但是不允許兩者同時使用。
第一個語句后的指令中EMP值為7;而第二個語句后的指令中EMP值為8。
第一章基礎(chǔ)知識三、段定義偽操作
存儲器的物理地址是由段地址和偏移地址組合而成的,匯編程序在把源程序轉(zhuǎn)換為目標(biāo)程序時,必須確定標(biāo)號和變量的偏移地址,并且需要把有關(guān)信息通過目標(biāo)模塊傳送給連接程序,以便連接程序把不同的段和模塊連接在一起形成一個可執(zhí)行程序。為此,需要用段定義偽操作,段定義偽操作的格式如下:
此外,還要明確段和段寄存器的關(guān)系,這可用ASSUME偽操作來實現(xiàn),其格式為:
其中assignment說明分配情況,其格式為:
其中段寄存器名必須是CS、DS、ES和SS中的一個,而段名則必須是由segment定義的段中的段名。而ASSUMENOTHING則可取消前面由ASSUME所指定的段寄存器。
第一章基礎(chǔ)知識例如:
由于assume偽操作只是指定某個段分配給那一個段寄存器,它并不能把段地址裝入段寄存器中,所以在代碼段中。還必須把段地址裝入相應(yīng)的段寄存器中。為此,在上例的程序中,分別用兩條MOV指令完成這一操作。如果程序中有堆棧段,也需要把段地址裝入SS中。但是,代碼段不需要這樣做,代碼段的這一操作在程序初始化時完成。功能:通知MASM用指定的段寄存器來尋址對應(yīng)的邏輯段,即建立段寄存器與段的缺省關(guān)系在明確了程序中各段與段寄存器之間的關(guān)系后,匯編程序會根據(jù)數(shù)據(jù)所在的邏輯段,在需要時自動插入段超越前綴。這是ASSUME偽指令的主要功能ASSUME偽指令并不為段寄存器設(shè)定初值,連接程序LINK將正確設(shè)置CS:IP和SS:SP由于數(shù)據(jù)段通常都需要,所以在樣板源程序中,首先為DS賦值;如果使用附加段,還要賦值ES段寄存器的裝入DS和ES的裝入通過寄存器傳送如:MOVAX,DATA1MOVDS,AXMOVAX,DATA2MOVES,AXSS的裝入(1)自動裝入采用定義段時指定組合類型STACK參數(shù),在ASSUME語句中建立SS的關(guān)系,這樣就可以自動裝入SS。SS段寄存器的裝入stack1 segmentpara
stack
dw40hdup(?)stack1 ends……code1 segment assumecs:code1,ss:stack1,…………SS段寄存器的裝入(2)程序設(shè)置stack1 segmentpara
stack
dw40hdup(?)top label wordstack1 ends……code1 segment assumecs:code1,ss:stack1,…………
movax,stack1
mov
ss,ax
mov
sp,offset
top
……CS和IP的裝入初始化時裝入,根據(jù)END偽指令指示的地址
END[標(biāo)號]END語句的作用:告訴匯編程序,源程序結(jié)束指定程序運行時的起始地址,即:seg
標(biāo)號csoffset標(biāo)號ip匯編結(jié)束偽指令END[標(biāo)號]指示匯編程序MASM到此結(jié)束匯編過程源程序的最后必須有一條END語句可選的標(biāo)號用于指定程序開始執(zhí)行點,連接程序?qū)?jù)此設(shè)置CS:IP值
————不要糊涂————程序終止和匯編結(jié)束是兩碼事CS和IP的裝入(2)自動修改CS和IP執(zhí)行CALLFAR和RET指令執(zhí)行JMPFAR指令響應(yīng)中斷及中斷返回(IRET)RESET……
第一章基礎(chǔ)知識SEGMENT偽操作還可以增加類型及屬性的說明,格式如下:一般情況下,這些說明可以不用。但是,如果需要用連接程序把本程序與其他程序模塊相連接時,就需要使用這些說明。分別敘述如下:
*定位類型(align_type)可以是:
段名
SEGMENT[定位類型][組合類型][段字][類別名]
段名
ENDS實際上定位類型可以理解為"對兩個相臨段的段地址給予的一些規(guī)定"。定位類型可以有以下幾種:
PARA:指定所定義的段開始于小段邊界,實際是規(guī)定這個段的起始地址與前面一個段的起始地址之差必須是16字節(jié)的整數(shù)倍。這意味著相臨兩個段的段地址之差最小也得是1。
PAGE:指定定義的段開始于頁邊界,實際是規(guī)定這個段的起始地址與前面一個段的起始地址之差必須是256字節(jié)的整數(shù)倍。
BYTE:所定義的段開始于字節(jié)邊界,實際上是指這個段可以從任何地址開始。
WORD:所定義的段開始于字邊界,實際是指這個段只能從偶數(shù)地址開始。
如果源程序中指定了段的定位類型為PARA或PAGE,那么獲得的可執(zhí)行文件中相臨段的段地址就有差異。但是如果源程序中指定了段的定位類型是BYTE或WORD,那么在可執(zhí)行文件中相臨段的段地址就有可能相同。
為了說明這個問題,我們下面給出了一個程序例:第一章基礎(chǔ)知識*組合類型
(combine_type)設(shè)置一定的組合類型就可以通知LINK程序把一些分散在不同模塊內(nèi)的同類型段組織在一個段內(nèi),這樣可以使最終形成的可執(zhí)行文件結(jié)構(gòu)比較清晰。PUBLIC該段連接時將與有相同名字的其他分段連接在一起。其連接次序由連接命令指定。COMMON該段在連接時與其他同名分段有相同的起始地址,所以會產(chǎn)生覆蓋。COMMON的連接長度是各分段中的最大長度。ATexpression使段的起始地址是表達式所計算出來的16位段地址。但它不能用來指定代碼段。STOCK指定該段在運行時為堆棧段的部分。MEMORY指定該段將分配在所有其他連接在一起的段的前面(在高地址上),如果連接時有幾個指定MEMORY的段,則遇到的第一段作為MEMORY段,其他則作為COMMON段.
*類別(‘CLASS’)連接時用于組成段組的名字:
可以是:第一章基礎(chǔ)知識四、程序開始和結(jié)束偽操作(ASM操作規(guī)則)
在程序的開始可以用NAME或TITLE為模塊取名字,NAME的格式是:
NAMEmodule_name匯編程序?qū)⒁越o出的module_name作為模塊的名字。如果程序中沒有NAME偽操作,則也可使用TITLE偽操作,其格式為;
TITLEtextTITLE偽操作可指定每一頁上打印的標(biāo)題。同時,如果程序中沒有使用NAME偽操作.則程序?qū)⒂胻ext中的前六個字符作為模塊名。text最多可有60個字符。如果程序中既無NAME又無TITLE偽操作,則將用源文件名作為模塊名。所以NAME及TILLE偽操作并不是必要的,
表示源程序結(jié)束的偽操作的格式為:
其中標(biāo)號指示程序開始執(zhí)行的起始地址。如果多個程序模塊相連接,則只有主程序要使用標(biāo)號,其它子程序模塊則只用END而不必指定標(biāo)號。
第一章基礎(chǔ)知識五、對準偽操作
*EVEN的操作:
使下一個字節(jié)地址成為偶數(shù)。一個字的地址最好從偶地址開始,所以對于字數(shù)組為保證其從偶地址開始,可以在它前面用EVEN偽操作來達到這一目的。例如:
*ORGConstantexpression如常數(shù)表達式的值為n,則ORG偽操作可以使下一個字節(jié)的地址成為常數(shù)表達式的值n。例:
第一章基礎(chǔ)知識則VECT1的偏移地址值為0AH,而VECT2的偏移地址值為14H。
在匯編程序?qū)υ闯绦騾R編的過程中,使用地址計數(shù)器來保存當(dāng)前正在匯編的指令的地址。地址計數(shù)器的值可用$來表示,匯編語言允許用戶直接用$來引用地址計數(shù)器的值,因此ORG$+8可以表示跳過8個字節(jié)的存儲區(qū)。
第一章基礎(chǔ)知識在指令和偽操作中也可以直接用$來表示地址計數(shù)器的值,如JNE$+6則轉(zhuǎn)向地址是JNE指令的首地址加上6。在這里,$十6必須是另一條指令的首地址,否則,匯編程序指示出錯信息。當(dāng)$用在偽操作的參數(shù)字段時,則和用在指令中的情況不同,它表示的是地址計數(shù)器的當(dāng)前值。
如匯編時ARRAY分配的偏移地址為0074H,則匯編后的存儲區(qū)將如右圖所示。應(yīng)該注意,ARRAY數(shù)組中的兩個$十4得到的結(jié)果是不同的,這是由于$的值是在不斷變化的緣故。當(dāng)在指令中用到$時,它只代表該指令的首地址,而與$本身所在的字節(jié)無關(guān)。第一章基礎(chǔ)知識六、基數(shù)控制偽操作
匯編程序默認的是十進制數(shù),為此,當(dāng)使用其他基數(shù)表示的常數(shù)時,需要專門給以標(biāo)記如下:
l
二進制:后面跟字母Bl
十進制:默認,后面也可以跟字母Dl
十六進制:后面跟字母H,如果第一個字母是A-F時,應(yīng)在其前面加上數(shù)字0l
八進制:后面跟O或Q?!ADIX偽操作,可以把默認的基數(shù)改變?yōu)?–16范圍內(nèi)的任何基數(shù)。格式如下:
·RADIXexpression
字符串可以看成串常數(shù),可以用單引號或雙引號把字符串放在其中,得到的是字符串的ASC碼值,例如‘ABCD’。
第一章基礎(chǔ)知識第三節(jié):匯編語言程序格式匯編語言源程序中的每個語句可以由四項組成,格式如下:
其中:名字項是—個符號。操作項是一個操作碼的助記符,它可以是指令、偽操作或宏指令名。操作數(shù)項由一個或多個表達式組成,它提供為執(zhí)行所要求的操作而需要的信息。
注釋項用來說明程序或語句的功能。為識別注釋項的開始。也可以從一行的第一個字節(jié)開始,此時整行都是注釋,常用來說明下面一段程序的功能。
一名字項
源程序中用下列字符來表示名字字母A—Z
數(shù)字0—9
專用字符?、·、@、一、$第一章基礎(chǔ)知識注意:(1)除數(shù)字外,所有字符都可以放在源語句的第一個位置。(2)名字中如果用到·則必須是第一個字符。(3)可以用很多字符來說明名字,但只有前面的31個字符能被匯編程序所識別。
用途:名字項可以是標(biāo)號或變量。它們都用來表示本語句的符號地址,它是可有可無的,只有當(dāng)需要用符號地址來訪問該語句時它才需要出現(xiàn)。
·標(biāo)號:標(biāo)號在代碼段中定義,后面跟冒號:,它也可以用LABEL或EQU偽操作來定義。此外它還可以作為過程名定義。標(biāo)號經(jīng)常在轉(zhuǎn)移指令或CALL指令的操作數(shù)字段出現(xiàn),用以表示轉(zhuǎn)向地址。
標(biāo)號有三種屬性;段、偏移及類型。
段屬性:定義標(biāo)號的段起始地址,此值必須在一個段寄存器中。而標(biāo)號的段則總是在CS寄存器中。偏移屬性:標(biāo)號的偏移地址是16位無符號數(shù),它代表從段起始地址到定義標(biāo)號的位置之間的字節(jié)數(shù)。
類型屬性:用來指出該標(biāo)號是在本段內(nèi)引用還是在其它段中引用的。如在段內(nèi)引用的,則稱為NEAR,指針長度為2字節(jié):如在段外引用,則稱為FAR,指針長度為4字節(jié)。
第一章基礎(chǔ)知識·變量:變量在除代碼段以外的其他段中定義,后面不跟冒號。它也可以用LABEL或EQU偽操作來定義。變量經(jīng)常在操作數(shù)字段出現(xiàn)。它也有段、偏移及類型三種屬性。
段屬性:定義變量的段起始地址,此值必須在一個段寄存器中。
偏移屬性;變量的偏移地址是16位無符號數(shù),它代表從段的起始地址到定義變量的位置之間的字節(jié)數(shù)。在當(dāng)前段內(nèi)給出變量的偏移值等于當(dāng)前地址計數(shù)器的值,當(dāng)前地址計數(shù)器的值可以用$來表示。
類型屬性;變量的類型屬性定義該變量所保留的字節(jié)數(shù)。如BYTE(1個字節(jié)長)、WORD(2個字節(jié)長)、DWORD(4個字節(jié)長)、DQ(8個字節(jié)長)、DT(10個字節(jié)長),這一點在數(shù)據(jù)定義偽操作中已作了說明。在程序中同樣的標(biāo)號或變量的定義只允許出現(xiàn)一次,否則匯編程序會指示出錯。
二、操作項
操作項可以是指令、偽操作或宏指令的助記符。對于指令,匯編程序?qū)⑵浞g為機器語言指令。對于偽操作.匯編程序?qū)⒏鶕?jù)其所要求的功能進行處理。對于宏指令,則將根據(jù)其定義展開。這在以后中將專門論述。
第一章基礎(chǔ)知識三、操作數(shù)項
操作數(shù)項由一個或多個表達式組成,多個操作數(shù)項之間一般用逗號分開。對于指令,操作數(shù)項一般給出操作數(shù)地址,它們可能有一個或二個或一個也沒有。對于偽操作或宏指令則給出它們所要求的參數(shù)。
操作數(shù)項可以是常數(shù)、寄存器、標(biāo)號、變量或由表達式組成。
表達式是常數(shù)、寄存器、標(biāo)號、變量與一些操作符相組合的序列,可以有數(shù)字表達式和地址表達式兩種。在匯編期間,匯編程序按照一定的優(yōu)先規(guī)則對表達式進行計算后可得到一個數(shù)值或一個地址。(一)算術(shù)操作符
算術(shù)操作符有十、一、*、/和MOD。其中MOD是指除法運算后得到的余數(shù),如19/7的商是2,而19MOD7則為5(余數(shù))
算術(shù)操作符可以用于數(shù)字表達式或地址表達式中,但當(dāng)它用于地址表達式時,只有當(dāng)其結(jié)果有明確的物理意義時其結(jié)果才是有效的。例如兩個地址相乘或相除是無意義的。
第一章基礎(chǔ)知識例:如要求把首地址為BLOCK的字數(shù)組的第6個字傳送到DX寄存器,可用指令
M0VDX,BLOCK十(6-1)*2例:如數(shù)組ARRAY定義,如下試寫出把數(shù)組長度(字數(shù))存入CX寄存器的指令。
ARRAYDW1,2,3,4,5,6,7ENDBDW?其中END是為計算數(shù)組長度而建立的符號地址,所需指令如下
MOVCX,(ENDB—ARRAY)/2匯編程序在匯編期間將計算表達式而形成指令
MOVCX,7(二)邏輯操作符
它有AND、OR、XOR和NOT。邏輯操作符是按位操作的,它只能用于數(shù)字表達式中。
第一章基礎(chǔ)知識例:
其中PORT_VAL為端口號,OUT指令中的表達式說明當(dāng)PORT_VAL為偶數(shù)時,輸出端口號與輸入端門號相同,而當(dāng)PORT_VAL為奇數(shù)時,輸出瑞口號比輸入端口號小1。
(三)關(guān)系操作符
它有EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)6種。
關(guān)系操作符的兩個操作數(shù)必須都是數(shù)字或是同一段內(nèi)的兩個存儲器地址。計算的結(jié)果應(yīng)為邏輯值:結(jié)果為真,表示為0FFFFH,結(jié)果為假,則表示為0。
例:則當(dāng)PORT_VAL<5時,匯編結(jié)果應(yīng)該是:
MOVBX,20否則,匯編結(jié)果應(yīng)該是:
MOVBX,
30第一章基礎(chǔ)知識(四)數(shù)值回送操作符
它有TYPE、LENGTH、SIZE、OFFSET、SEG5種。這些操作符把一些特征或存儲器地址的一部分作為數(shù)值回送。
*TYPE
格式為:TYPEVariable或
label如果是變量,則匯編程序?qū)⒒厮驮撟兞康囊宰止?jié)數(shù)表示的類型:DB為1,DW為2,DD為4,DQ為8,DT為10。如果是標(biāo)號,則匯編程序?qū)⒒厮痛碓摌?biāo)號類型的數(shù)值:NEAR為-1,F(xiàn)AR為-2。
例:ARRAYDW1,2、3……ADDSI,TYPEARRAY匯編程序?qū)⑦@個指令形成為:
ADDSI,2第一章基礎(chǔ)知識
*LENGTH
格式為:
LENGTHVariable
對于變量中使用DUP的情況,匯編程序?qū)⒒厮头峙浣o該變量的單元數(shù)。而對于其他情況則回送1。
例FEESDW100DUP(0)MOVCX,LENGTHFEES匯編程序?qū)τ谥噶钚纬蔀椋篗OVCX,100
例ARRAYDW1,2,3MOVCX,LENGTHARRAY匯編程序?qū)τ谥噶钚纬蔀椋篗OVCX,1
例TABLEDB‘ABCD’MOVCX,LENGTHTABLE匯編程序?qū)τ谥噶钚纬蔀?;MOVCX,l第一章基礎(chǔ)知識*SIZE
格式為:
SIZEVariable
匯編程序應(yīng)回送分配給該變量的字節(jié)數(shù)。但是,此值是LENGTH值和TYPE值的乘積。對于上述例子的情況:
MOVCX,SIZEARRAY
將形成為MOVCX,2MOVCX,SIZETABLE
將形成為
MOVCX,1*OFFSET
格式為:OFFSETVariable或
label匯編程序?qū)⒒厮妥兞炕驑?biāo)號的偏移地址值。與LEA具有相同功能。MOVBX,OFFSETOPEN_ONELEABX,OPER_ONE第一章基礎(chǔ)知識*SEG
格式為:SEGVariable或
Label匯編程序?qū)⒒厮妥兞炕驑?biāo)號的段地址值
.例如果DATA_SEG是從存儲器的05000H地址開始的一個數(shù)據(jù)段的段名,OPERl
是該段中的一個變量名,則MOVBX,SEGOPER1
將把0500H作為立即數(shù)插入指令。實際上由于段地址是由連接程序分配的,所以該立即數(shù)是連接時插入的。執(zhí)行期間則使BX寄存器的內(nèi)容成為0500H。
(五)屬性操作數(shù)符
有PTR、段操作符、SHORT、THIS、HIGH和LOW6種。
格式為:
typePTRexpression第一章基礎(chǔ)知識PTR用來建立一個符號地址,但它本身并不分配存儲器,只是用來給已分配的存儲地址賦予另一種屬性,使該地址具有另一種類型。格式中的類型字段表示所賦予的新的類型屬性,而表達式字段則是被取代類型的符號地址。
例已有數(shù)據(jù)定義如下:
可以用以下語句對這兩個字節(jié)賦予另一種類型定義:
后者也可以寫成;
這里ONE_BYTE和TWO_BYTE兩個符號地址具有相同的段地址及偏移地址,但是它們的類型屬性不同,前者為1,后者為2。
第一章基礎(chǔ)知識
類型可有BYTE、WORD、DWORD、NEAR和PAR幾種,所以PTR也可以用來建立字、雙字或段內(nèi)及段間的指令單元。
例如:MOV[BX],5
指令把立即數(shù)存入BX內(nèi)容指定的存儲單元中,但匯編程序不能分清是存入字單元還是字節(jié)單元,此時必須用PTR操作符來說明屬性,應(yīng)該寫明:
MOVBYTEPTR[BX],5或
MOVWORDPTR[BXl,5*段操作符:用來表示一個標(biāo)量、變量或地址表達式的段屬性。例如,用段前綴指定某段的地操作數(shù)
MOVAX,ES:[BX+SI]格式段寄存器:地址表達式
*SHORT:用來修飾JMP指令中轉(zhuǎn)向地址的屬性,指出轉(zhuǎn)向地址是在下一條指令地址的±127個字節(jié)范圍之內(nèi)。
第一章基礎(chǔ)知識*THIS:
格式為:
THISattribute或
type
它可以象PTR一樣建立一個指定類型(BYTE、WORD或DWORD)的或指定距離(NEAR或FAR)的地址操作數(shù)。該操作數(shù)的段地址和偏移地址與下一個存儲單元地址相同。例如:
此時FIRST_BYTE的偏移地址值和WORD_TABLE完全相同,但它是字節(jié)類型的,而WORD_TABLE則是字類型的。
又如:STARTEQUTHISFARMOVCX,l00MOV指令有一個FAR屬性的地址START,這就允許其它段的JMP指令直接跳轉(zhuǎn)到START來。
*HIGH和LOW
稱為字節(jié)分離操作符字節(jié)。它接收一個數(shù)或地址表達式,HIGH取其高位字節(jié),LOW取其低位字節(jié)。
第一章基礎(chǔ)知識例如:
我們知道表達式是常數(shù)、寄存器、標(biāo)號、變量和操作符的組合,在計算表達式值時,應(yīng)該首先計算優(yōu)先級高的操作符,然后從左到右地對優(yōu)先級相同的操作符進行計算。括號也可以改變計算次序,括號內(nèi)的表達式應(yīng)優(yōu)先計算。
下面給出操作符的優(yōu)先級別(其中有些操作符我們并未提到過,需要時可從手冊中查到),從高到低排列如下:
第一章基礎(chǔ)知識(六)注釋
注釋項用來說明一段程序或一條或幾條指令的功能,它是可有可無的。但是,對于匯編語言程序來說,注釋項的作用是很明顯的,它可以使程序易于被讀懂,因此,編制程序必須寫好注釋。
根據(jù)上面介紹的內(nèi)容,這里給出一個匯編完整的例子來說明匯編語言的編程框架和結(jié)構(gòu)。例:從鍵盤輸入字符并將輸入的字符顯示出來,如果輸入是英文字符小寫字母,將小寫字母轉(zhuǎn)換成為大寫字母。datasegmentmessage db 'Thisisasampleprogramofkeyboardanddisply'db 0dh,0ah,'Pleasestrikethekey!',0dh,0ah,'$'data ends;定義數(shù)據(jù)段,數(shù)據(jù)段給出提示內(nèi)容。在數(shù)據(jù)段中0dh和0ah分別表示回車和;換行字符。字符‘$’表示字符串的結(jié)束標(biāo)志。如果沒有回車和換行會出現(xiàn)什;么顯示結(jié)果。第一章基礎(chǔ)知識stack segmentstackdb 50dup(?)stack ends;定義堆棧段。其中參數(shù)stack表示程序在運行過程中,該段為系統(tǒng)堆棧段中;的一部分。如果不加這個,將單獨對本程序建立堆棧。code segmentassume cs:code,ds:data,ss:stack;明確段寄存器與段定義之間的關(guān)系start: mov ax,data
mov
ds,ax
movax,stack;可以省,為什么?
mov
ss,ax
;可以省,為什么? ;初始化段寄存器第一章基礎(chǔ)知識mov
dx,offsetmessagemov ah,9int 21h;顯示字符串。調(diào)用21H中斷(也是DOS功能調(diào)用)的9號功能,該功能是;顯示字符串,其中DS:DX為字符串地址,‘$’為字符串結(jié)束標(biāo)志。again: mov ah,1int 21h;調(diào)用21H中斷的1號功能,將鍵盤輸入的字符ASC碼存在al寄存器cmp al
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《GB-T 31297-2014 TC4 ELI鈦合金板材》專題研究報告
- 《GBT 33534-2017 失業(yè)登記管理服務(wù)規(guī)范》專題研究報告
- 宜賓編制考試題庫及答案
- 會計面試題集及答案解析
- 廣州建筑暖通工程師面試題集
- 2025年綠色金融產(chǎn)品創(chuàng)新與發(fā)展可行性研究報告
- 2025年農(nóng)業(yè)機械化推廣項目可行性研究報告
- 2025年社交媒體營銷效果評估平臺項目可行性研究報告
- 2025年數(shù)字媒體藝術(shù)創(chuàng)作項目可行性研究報告
- 2025年電子政務(wù)服務(wù)平臺建設(shè)項目可行性研究報告
- 具身智能+文化遺產(chǎn)數(shù)字化保護方案可行性報告
- (2025年新教材)部編人教版二年級上冊語文 語文園地七 課件
- 廣東深圳市2026屆化學(xué)高三第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 電力公司考試大題題庫及答案
- 國企金融招聘筆試題及答案
- 重慶市金太陽好教育聯(lián)盟2026屆高三10月聯(lián)考(26-65C)英語(含答案)
- 成都市龍泉驛區(qū)衛(wèi)生健康局下屬15家醫(yī)療衛(wèi)生事業(yè)單位2025年下半年公開考試招聘工作人員(18人)備考考試題庫附答案解析
- 2025-2030中國光纖分布式測溫系統(tǒng)市場需求預(yù)測報告
- 因甲方原因造成停工的聯(lián)系函示例
- 急救藥品物品使用規(guī)范與操作流程
- 煤矸石填溝造地綜合利用項目規(guī)劃設(shè)計方案
評論
0/150
提交評論