版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
匯編語言程序
設(shè)計——第三章第三章匯編語言程序格式要求1掌握并能使用匯編語言的常用偽操作符及偽指令語句2掌握匯編語言源程序格式計算機實現(xiàn)步驟3學(xué)會編寫簡單的匯編語言程序3.1匯編程序功能計算機上運行匯編語言程序的步驟是:(1)用編輯程序建立ASM源文件(2)用MASM程序把ASM文件轉(zhuǎn)換成OBJ文件(3)用LINK程序把OBJ文件轉(zhuǎn)換成EXE文件(4)用DOS命令鍵入文件名運行該程序編輯程序P.ASM匯編程序P.OBJ連接程序P.EXE匯編語言程序的建立及匯編過程匯編程序的主要功能(1)檢查源程序(2)檢查源程序中的語法錯,并給出錯誤信息(3)產(chǎn)生源程序的目標(biāo)程序,并給出列表文件(4)展開宏指令匯編語言程序的語句除指令以外,還可以由偽指令和宏指令組成匯編語言源程序的框架DATAS
SEGMENT
;定義數(shù)據(jù)段FIVEDB5;定義字節(jié)單元DATAS
ENDS
;數(shù)據(jù)段定義結(jié)束STACKS
SEGMENT
;定義堆棧段
DB128DUP(?);128個字節(jié)的??臻gSTACKS
ENDS
;堆棧段定義結(jié)束CODES
SEGMENT
;定義代碼段
ASSUMECS:CODES,DS:DATAS,SS:STACKS
;對各段進行說明下面是一個典型的.EXE程序的源程序框架ASSUME偽指令只是指明了段寄存器與段之間的關(guān)系,但并沒有對段寄存器初始化START:;程序開始
MOVAX,DATAS
MOVDS,AX;對段寄存器DS初始化
MOVAL,FIVE;(AL)=5
ADDAL,3;(AL)=8
ADDAL,30H;(AL)=38H
MOVDL,AL;(DL)=38H
MOVAH,2
INT21H;調(diào)用int21H的2號-打印功能
MOVAH,4CH
INT21H;調(diào)用int21H的4CH號-退回DOSCODES
ENDS;代碼段定義結(jié)束
END
START;程序結(jié)束編寫的源程序要經(jīng)過匯編程序轉(zhuǎn)換成目標(biāo)文件,這時源程序要告知編譯器數(shù)據(jù)區(qū)的定義、指令系統(tǒng)的選擇、段的定義、程序的開始和結(jié)束等信息這類工作由偽指令完成。1、什么是偽指令?2、偽指令和指令語句有什么區(qū)別?偽指令語句是一種匯編程序在匯編時用來控制匯編過程以及向匯編程序提供匯編相關(guān)信息的指示性語句。與指令語句的區(qū)別指令語句:匯編程序?qū)υ闯绦蜻M行匯編時,將指令語句翻譯成機器指令,指令語句與機器指令一一對應(yīng),機器指令在程序執(zhí)行期間執(zhí)行.偽操作:匯編程序?qū)υ闯绦蜻M行匯編時,由匯編程序執(zhí)行偽指令語句其本身并不直接產(chǎn)生可供計算機硬件執(zhí)行的機器目標(biāo)代碼,它僅是一種非執(zhí)行語句。典型的.EXE程序的源程序框架總結(jié)一個完整的源程序由幾個段構(gòu)成。XXXXSEGMENTXXXXENDS各段具有各自不同的功能。數(shù)據(jù)段中存放著數(shù)據(jù)、代碼段中存放著程序、堆棧段為保存數(shù)據(jù)提供了空間。每個段由數(shù)目不等的語句行組成。每行語句都是各種符號的組合,符號之間由空格分隔開。3.2偽操作段定義偽指令變量定義偽指令符號定義偽指令調(diào)整偏移量偽指令偽操作(又稱偽指令)的作用是指導(dǎo)匯編程序如何匯編源程序。3.2.1段定義偽指令段名合法標(biāo)識符,首尾段名要一致;區(qū)別于變量和標(biāo)號;段體數(shù)據(jù)段中主要為數(shù)據(jù)定義偽指令;代碼段中主要為匯編指令。段名SEGMENT[對齊類型][組合類型][類別]
…… ;段體段名ENDS格式段說明偽指令A(yù)SSUME功能:
指明段和段寄存器的對應(yīng)關(guān)系。例如:ASSUMECS:CODE1,DS:DATA1,ES:DATA2取消段指定:
ASSUME段寄存器名:NOTHINGASSUME
段寄存器名:段名[,段寄存器名:段名,…]格式關(guān)于堆棧段若源程序中不定義堆棧段,系統(tǒng)會自動指定一個64KB的區(qū)域作為堆棧段,但連接時會產(chǎn)生一個警告信息:
warningxxxx:nostacksegment
此警告信息不影響程序正常運行。STACK1SEGMENTSTACK
DW256DUP(?)
STACK1ENDS堆棧段的定義3.2.2簡單的變量定義偽指令[變量名]助記符操作數(shù)[;注釋]指令格式合法的標(biāo)識符即每個操作數(shù)在內(nèi)存中存放所占的字節(jié)數(shù)DB(字節(jié))、DW(字)、DD(雙字)DF(三字)、DQ(四字)、DT(十字節(jié))可以是常量數(shù)據(jù),也可以是表達式,或是字符、字符串;可以為變量只分配存儲空間,而不賦具體的數(shù)值;可以使用復(fù)制說明符定義一段連續(xù)的存儲空間;變量定義偽指令舉例1——常數(shù)和表達式例1.變量定義偽指令的操作數(shù)可是常數(shù),也可是表達式,但在內(nèi)存中保存的均為二進制補碼形式的常數(shù)。
A1DB10A2DW100,100H,-1A3DD4*8
內(nèi)存分配情況如右:…………A1A2A310100100H-14*8=32=20H0A64000001FFFF20000000內(nèi)存變量定義偽指令舉例2
——字符、字符串例2.操作數(shù)是字符或字符串時,以ASCII碼的形式存放。
STR1DB‘A’,’B’
STR2DW‘AB’ STR3DD‘BA’
STR4DB‘ABCD’…………STR1STR2STR3STR4**一般,在定義字符串時,經(jīng)常使用DB來定義,以使字符按存放順序。414242414142414243440000在對文檔進行編輯之前,需新建文檔。超過兩個字符的字符串只能用DB偽指令定義。內(nèi)存變量定義偽指令舉例3
——只分配存儲空間例3.若在匯編期間只需要為變量分配存儲空間,而不賦初值,則可以使用“?”作為操作數(shù)。
BUF1DB5,6,?
BUF2DW100H,?
…………BUF1BUF20506--0001----例4.操作數(shù)中可以使用DUP復(fù)制說明符,定義重復(fù)數(shù)據(jù),分配連續(xù)的存儲空間。內(nèi)存變量定義偽指令舉例4
——分配連續(xù)的存儲空間0000…00DATA1100個020202070202020702020207DATA2重復(fù)次數(shù)nDUP(重復(fù)數(shù)據(jù)表)該說明符可嵌套使用DUP復(fù)制說明符DATA1DB100DUP(0)DATA2DB3DUP(3DUP(2),7)內(nèi)存變量定義偽指令練習(xí)請寫出下列變量定義偽指令的內(nèi)存分配情況。
DATA1DB01H,’A’,’123’,’BCD’ DB 1,2DUP(2,3) DATA2DW0AB1CH,?,0 DW20,14H,-1 DATA3DD234H,?…01413132334243440102030203…DATA1…1CAB----000014001400FFFF…DATA2…34020000--------…DATA3標(biāo)識符標(biāo)識符的類型變量:指向存放某個操作數(shù)的存儲單元;標(biāo)號:指向存放某個指令存儲單元;子程序名:指向存放子程序的起始存儲單元;構(gòu)成標(biāo)識符的符號集合英文字母(a~z,不區(qū)分大小寫)數(shù)字(0~9)特殊符號(?、@、_、$)在程序中定義,可作為符號地址使用標(biāo)識符的構(gòu)成規(guī)則不可以以數(shù)字開頭;不能使用單獨的“?”作為標(biāo)識符;取名盡量有含義,但不能采用匯編語言的保留字;最大長度為31個字符。例如: ABCDH 標(biāo)識符
0ABCDH 立即數(shù)助記符、定義符、寄存器名稱等3.2.3符號定義偽指令1等值偽指令EQU2等號偽指令=3符號名定義偽指令LABEL符號定義偽指令——等值偽指令EQU<標(biāo)識符> EQU <表達式>等值偽指令EQU用左邊的標(biāo)識符來代替右邊的表達式功能DATAEQU2;定義一個常數(shù)NUMEQUDATA+2;定義一個數(shù)值表達式PLUSEQUADD;定義一個可執(zhí)行命令舉例該語句僅為標(biāo)識符來賦值,并不會分配存儲空間,匯編程序會將源程序中的標(biāo)識符替換成對應(yīng)的數(shù)值;EQU語句在同一程序中,對一個符號名只能定義一次。類似于C語言里面的預(yù)處理命令:#definepi3.14等值偽指令舉例DATASGSEGMENTPORT1EQU100PLUSEQUADDNUMEQUPORT1+20NEWEEQUNUMCOUNTEQUCXDATASGSEGMENTMOVAX,PORT1PLUSAX,NUMMOVAX,NEWEMOVCOUNT,AXMOVAX,AX,MOVAX,MOV,AXPORT1PLUSNEWECOUNT100ADD120NUM120CX符號定義偽指令——等號偽指令=<標(biāo)識符> = <常數(shù)表達式>等號偽指令與EQU語句相似,但在同一程序中可對一個符號名重復(fù)定義。功能DATA=2
DATA=DATA+2舉例等號偽指令舉例DATASGSEGMENTPORT1=100PORT1=PORT1+20NEWE=PORT1DATASGSEGMENTMOVAX,PORT1MOVCX,NEWEMOVAX,MOVCX,PORT1NEWE120120由等值偽指令和等號偽指令定義的符號名,程序中任何位置出現(xiàn)該符號名,匯編程序在翻譯時首先用其對應(yīng)的表達式對代替,然后檢查代替后的結(jié)果是否有語法錯誤;被定義的符號名不占據(jù)內(nèi)存空間;符號定義偽指令注意點符號定義偽指令——符號名定義偽指令WDATALABELWORDBDATADB12H,34HLOOP1
LABELFARLOOP2:MOVAX,BX<符號名>LABEL<類型>符號名定義偽指令LABEL定義一個變量或標(biāo)號,并指定其類型;功能常用于一個變量定義偽指令,或帶標(biāo)號的指令之前,為一個變量或指令指定兩個不同類型的名稱;用法符號名定義偽指令舉例DATASGSEGMENTB_ARRAYLABELBYTEW_ARRAYDW10(DUP(1234H))DATASGSEGMENT執(zhí)行指令后,AX、DL中的值分別是什么?MOVAX,W_ARRAYMOVDL,B_ARRAY表示將20個字節(jié)中的第一個字節(jié)的地址賦予兩個不同類型的變量:字節(jié)類型變量B_ARRAY和字節(jié)型變量W_ARRAY執(zhí)行指令MOVAX,W_ARRAY是將具有10個字數(shù)據(jù)的數(shù)組中的第一個字數(shù)據(jù)1234賦值給AX。指令MOVDL,B_ARRAY是將具有10個字數(shù)據(jù)的數(shù)組中的第一個字節(jié)數(shù)據(jù)34H賦值給DL.3.2.4調(diào)整偏移量偽指令調(diào)整數(shù)據(jù)或代碼存放的起始位置。使用目的為使系統(tǒng)的訪存操作更為有效。為什么要調(diào)整常用的調(diào)整偏移量偽指令偶對齊偽指令EVEN調(diào)整偏移量偽指令ORG偏移量計數(shù)器引用符號$對齊偽指令A(yù)LIGN3.2.4調(diào)整偏移量偽指令B1DB12HEVENW1DW4567H偶對齊偽指令EVEN100H101H102H103H12HB1
67H45HW1將其后的變量或指令從下一個偶地址單元開始存放。功能例如:如下變量定義偽指令偽指令格式EVEN定位偽指令ORGORG100H
X1DW23H
DB23H
ORG200H
X2DB‘ABC’,0DH,0AH
X3DB?100H101H102H200H201H202H203H204H205H
23HX100H23HX2…41H42H43H0DH0AHX3—將其后的變量或指令從“數(shù)值表達式”所指定的位置開始存放。功能ORG<數(shù)值表達式>對齊偽指令A(yù)LIGNALIGN<number>number必須是2的冪,例如:2、4、8、……功能將其后的變量或指令從下一個能被number整除的地址開始存放ORG100HD1DB12HALIGN4B1DB43H100H101H102H103H104H105H106H107H108H12HD143HB1空出7個單元使得下個地址開始于4的倍數(shù)偏移量計數(shù)器引用符號$ORG100HD1DB12HW1DW$,$ORG$+3B1DB43H100H101H102H103H104H105H106H107H108H12HD101H01HW103H01H43HB1空出3個單元$[±Imm]其值表示當(dāng)前偏移量計數(shù)器的值±Imm的立即數(shù)用于構(gòu)成地址或數(shù)據(jù)表達式功能3.3操作符與表達式屬性操作符表達式表達式是由運算符、操作符、常量和變量等構(gòu)成的式子屬性操作符是面向變量或標(biāo)號的3.3.1屬性操作符變量和標(biāo)號是在數(shù)據(jù)定義和編寫程序中設(shè)置的標(biāo)識符;變量:表示數(shù)據(jù)的地址
B1DB12H標(biāo)號:表示指令的地址
LOOP1:MOVAX,BX屬性操作符是面向變量或標(biāo)號的;屬性操作符的類型返回值型:獲取變量或標(biāo)號的相關(guān)屬性返回值;強制轉(zhuǎn)換型:強制改變變量或標(biāo)號的相關(guān)屬性;段屬性操作符SEG例如:
MOVAX,SEGNEXT
MOVBX,SEGDATA若(CS)=1000H,(DS)=2000H,
則以上指令執(zhí)行后,
(AX)=1000H,(BX)=2000H…………NEXTDATA代碼段CS數(shù)據(jù)段DSSEG<標(biāo)識符>返回標(biāo)識符所在段的段地址;功能偏移量屬性操作符OFFSET例如:數(shù)據(jù)段定義如下:
X1 DW 12H,100H
X2 DD 0
X3 DB ?,‘A’若執(zhí)行指令:MOVAX,OFFSETX1
MOVBX,OFFSETX3
則(AX)=0000H,(BX)=0008H1200000100000000--41……X1X2數(shù)據(jù)段0000H0001H0002H0003H0004H0005H0006H0007H0008H0009HX3OFFSET<標(biāo)識符>功能返回該標(biāo)識符的段內(nèi)偏移地址;類型屬性操作符TYPE類型值變量:每個變量所占的字節(jié)數(shù)標(biāo)號:標(biāo)號的NEAR、FAR類型標(biāo)識符類型TYPE值字節(jié)(DB)1字(DW)2雙字(DD)4近標(biāo)號(NEAR)-1遠標(biāo)號(FAR)-2TYPE<標(biāo)識符>功能返回變量和標(biāo)號的類型值類型屬性操作符舉例例如:數(shù)據(jù)段定義如下:
X1 DW 12H,100H
X2 DD 0
若執(zhí)行指令:MOVAX,TYPEX1
MOVBX,TYPEX2
則(AX)=0002H,(BX)=0004H1200000100000000……X1X2數(shù)據(jù)段0000H0001H0002H0003H0004H0005H0006H0007H長度屬性操作符LENGTH該操作符只用于變量,返回值由變量的第一個表達式?jīng)Q定。變量的第一個表達式若用DUP定義,則返回重復(fù)次數(shù)n;變量的第一個表達式若是常數(shù)等數(shù)值,則返回1。LENGTH<標(biāo)識符>功能返回變量所定義的數(shù)據(jù)個數(shù);該運算符只對用dup定義的數(shù)據(jù)起作用,其他情況均返回1。長度屬性操作符舉例例如:數(shù)據(jù)段定義如下:
X1 DB 12H,10H
X2 DB 3DUP(0)請指出以下指令執(zhí)行后的結(jié)果:
MOVAL,LENGTHX1MOVBL,LENGTHX2(AL)=01(BL)=03容量屬性操作符SIZE該操作符只用于變量;SIZE=LENGTH*TYPESIZE<標(biāo)識符>功能返回變量的所占存儲單元的數(shù)目;容量屬性操作符舉例例如:數(shù)據(jù)段定義如下:
X1 DB 12H,10H
X2 DW 3DUP(0)請指出以下指令執(zhí)行后的結(jié)果:
MOVAL,SIZEX1MOVBL,SIZEX2(AL)=01(BL)=06取數(shù)操作符LOW和HIGHMOVAL,LOW1234HMOVBL,HIGH1234H(AL)=34H(BL)=12HLOW/HIGH<常數(shù)或表達式>功能取常數(shù)或表達式的低/高字節(jié);強制屬性操作符PTR常用的類型:BYTE、WORD、DWORD、NEAR、FAR<類型>PTR<標(biāo)識符>功能將標(biāo)識符的類型屬性強制為指定的類型強制屬性操作符舉例例如:數(shù)據(jù)段定義如下:
X1 DW 12H,100H
X2 DD 1234H
X3 DB 10,‘A’請問以下指令是否正確:
MOVAX,X1
MOVAX,X2
MOVAX,X312000001341200000141……X1X2X3字字雙字字節(jié)字節(jié)正確,(AX)=0012HMOVAX,WORDPTRX2MOVAX,WORDPTRX3(AX)=1234H(AX)=4101H存儲單元別名操作符THIS該操作符用于變量定義或指令之前,其功能類似于LABEL符號名定義偽指令;例如:BDATAEQUTHISBYTEWDATADW1234HMOVAL,BDATAMOVBX,WDATATHIS<類型>功能指定下一個變量或標(biāo)號的類型;3.3.2表達式表達式是由運算符、操作符、常量和變量等構(gòu)成的式子;表達式是要在程序的匯編過程中計算出具體數(shù)值的,其各個部分需要在匯編期間完全確定;注意:表達式中不能出現(xiàn)寄存器,因為在匯編期間寄存器中的數(shù)值不確定??!表達式又可分為數(shù)值表達式和地址表達式。數(shù)值表達式表示數(shù)據(jù),可作為立即數(shù)使用;地址表達式表示地址,一般由符號地址等構(gòu)成。數(shù)值表達式數(shù)值表達式可以代替立即數(shù)使用;數(shù)值表達式的組成部分常量:立即數(shù),可為任何數(shù)制;算術(shù)運算符:+、-、*、/、MOD關(guān)系運算符:EQ、NE、LT、GT、LE、GE邏輯運算符:AND、OR、NOT、XOR、SHL、SHR屬性操作符:SEG、OFFSET、TYPE、LOW、HIGH…算術(shù)運算符運算符類型+(正號)、-(負號)+(加)、-(減)、*(乘)、/(除)、MOD(取模)算術(shù)運算符與常量、括號等構(gòu)成數(shù)值表達式。注意:數(shù)值表達式中,變量不能參與算術(shù)運算。例如:120+(321-90)mod3 322*5/32=120+231mod3=120+0=120=78H=1610/32=50=32H關(guān)系運算符運算符類型EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)關(guān)系運算符可與常量、變量、括號等構(gòu)成數(shù)值表達式。關(guān)系運算的返回值只能有0(假)和0FFFFH(真)兩個。例如:120LT100H 21EQ21H=0FFFFH=0邏輯運算符運算符類型AND(與)、OR(或)、NOT(非)、XOR(異或)SHL(左移)、SHR(右移)邏輯運算符可與常量、括號等構(gòu)成數(shù)值表達式。注意:數(shù)值表達式中,變量不能參與邏輯運算。例如:1SHL3 47HAND0FH NOT56H=08H=40H=0A9H屬性操作符運算符類型SEG(段地址)、OFFSET(偏移地址)、TYPE(類型值)LENGTH(長度)、SIZE(容量)HIGH(高字節(jié))、LOW(低字節(jié))屬性操作符可作用于變量構(gòu)成數(shù)值表達式;例如:HIGH(1234H+100H) LOW1234H=13H=34H運算符的優(yōu)先順序LENGTH、SIZE、()SEG、OFFSET、TYPE*、/、MOD、SHL、SHRHIGH、LOW+、-EQ、NE、LT、GT、LE、GENOTANDOR、XOR優(yōu)先權(quán)依次降低地址表達式地址表達式是由標(biāo)號、變量名、運算符(+、-)構(gòu)成的,用于表示存儲單元的地址;例如:數(shù)據(jù)段定義如下:
X1 DW 12H,100H
X2 DD 1234H
X3 DB 10,‘A’地址表達式
MOVAX,X1+2
MOVAX,X1+1
MOVAL,BYTEPTRX2-2
MOVAL,X3+1注意:地址表達式的類型與標(biāo)識符的類型相同。12000001341200000141……X1X2X3(AX)=0100H(AX)=0000H(AL)=00H(AL)=41H3.1判斷下列標(biāo)識符的合法性。code 合法Data 合法A
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度商務(wù)樓食堂承包經(jīng)營服務(wù)合同4篇
- 2025年度國際旅游包機服務(wù)合同執(zhí)行2篇
- 2025年廠外施工臨時用水用電合同范本3篇
- 2025年度服裝出口銷售合同定制版3篇
- 2024版簡易工程承包合同
- 2025年度政府大數(shù)據(jù)服務(wù)中心外包服務(wù)合同范本4篇
- 2024聘用醫(yī)療設(shè)備維修工程師合同范本3篇
- 2025年度新型建筑鋼結(jié)構(gòu)工程承包合同4篇
- 2025年度智慧停車系統(tǒng)設(shè)計與施工承包合同4篇
- 2025年度人工智能產(chǎn)業(yè)孵化器運營管理合同2篇
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(全真題庫)
- 護理安全用氧培訓(xùn)課件
- 《三國演義》中人物性格探析研究性課題報告
- 注冊電氣工程師公共基礎(chǔ)高數(shù)輔導(dǎo)課件
- 土方勞務(wù)分包合同中鐵十一局
- 乳腺導(dǎo)管原位癌
- 冷庫管道應(yīng)急預(yù)案
- 司法考試必背大全(涵蓋所有法律考點)
- 公共部分裝修工程 施工組織設(shè)計
- 《學(xué)習(xí)教育重要論述》考試復(fù)習(xí)題庫(共250余題)
- 裝飾裝修施工及擔(dān)保合同
評論
0/150
提交評論