匯編語言3偽指令.ppt
《匯編語言3偽指令.ppt》由會員分享,可在線閱讀,更多相關(guān)《匯編語言3偽指令.ppt(51頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1,第3章匯編語言程序結(jié)構(gòu),一、匯編語言源程序的基本結(jié)構(gòu)二、匯編語言源程序中的語句三、常量、變量、標(biāo)號與表達式四、偽指令五、操作符六、匯編語言上機過程,教學(xué)重點:①指令語句格式和偽指令語句格式;②匯編語言程序格式;③匯編語言的上機過程教學(xué)難點:①偽指令的應(yīng)用;②運算符、操作符的應(yīng)用;③偽指令存儲器分配技術(shù),2,DATASEGMENTSTRDB0DH,0AH,’Howareyou!$DATAENDSSTACKSEGMENTSTACKDB100DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDBEGIN,匯編語言的一個實例P81,,,,,3,一、匯編語言源程序的基本結(jié)構(gòu),完整的匯編語言源程序由段(代碼段、數(shù)據(jù)段、附加段或堆棧段)組成;一個匯編語言源程序必須包含一個代碼段,并指示程序執(zhí)行的起始點,一個程序只有一個起始點。數(shù)據(jù)段、堆棧段和附加段視情況而定。每個段由若干語句行組成。語句行是匯編的編程基礎(chǔ)。所有的指令必須位于某一個代碼段內(nèi),偽指令可根據(jù)需要位于任一段內(nèi)。段以“SEGMENT”開始,以“ENDS”結(jié)束。段由用戶定義。,4,二、匯編語言源程序中的語句,1、語句的分類2、語句的格式,5,1、匯編源程序中語句的分類,指令性語句(指令/硬指令)指示性語句(偽指令)宏指令(第5章),使CPU產(chǎn)生動作、并在程序執(zhí)行時才處理的語句,就是第3章學(xué)習(xí)的處理器指令。,不使CPU產(chǎn)生動作、在程序執(zhí)行前由匯編程序處理的說明性語句,例如,數(shù)據(jù)說明、變量定義等等。,6,2、匯編源程序中語句的格式,指令的格式:[標(biāo)號:]操作碼操作數(shù)[;注釋]偽指令的格式:[名字]偽指令操作數(shù)[;注釋],共同點:每一語句行都由4部分組成,各部分之間至少要用一個空格作為間隔。,不同點:在形式上:帶不帶冒號,是否可轉(zhuǎn)向它。在本質(zhì)上:匯編時能否形成對應(yīng)的機器碼。,,,,,,,,,7,1、常量,1)數(shù)值常量2)字符常量3)符號常量,三、常量、變量、標(biāo)號與表達式(續(xù)),數(shù)值常量,8,字符串常量是用單引號或雙引號引起來的一個或多個字符。字符串常量是以各字符的ASCⅡ碼表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。,字符串形式的常量,對經(jīng)常使用的數(shù)值常量可以先為它定義一個名字,然后在語句中用名字來表示該常量。符號常量需要用等價偽指令EQU和等號偽指令“=”來定義。,符號常量,三、常量、變量、標(biāo)號與表達式(續(xù)),9,變量:變量是一個存放數(shù)據(jù)的存儲單元的名字,用變量名來表示,變量名由用戶自定義。變量實際上表示數(shù)據(jù)初值表首元素的地址;用這個變量名表示,常稱為符號地址,在程序中作為存儲器操作數(shù)來使用。如例子中BLOCK、BUFF。一般在數(shù)據(jù)段中定義。由于匯編語言中存儲單元是分段使用的,所以變量具有三種屬性:①段值(SEGMENT)—變量定義所在段的段地址。②偏移量(OFFSET)—變量所指的單元地址與段起始地址之間的位移量。③類型(TYPE)—有字節(jié)(byte)、字(word)和雙字(doubleword)等。,三、常量、變量、標(biāo)號與表達式(續(xù)),提示:每一個變量定義后都具有此三種屬性,設(shè)置變量名是為了方便存取它指示的存儲單元。,10,標(biāo)號是一條指令語句的符號地址。在匯編源程序中,只有在需要轉(zhuǎn)向一條指令語句時,才為該指令語句設(shè)置標(biāo)號,以便在轉(zhuǎn)移類指令(含子程序調(diào)用指令)中直接引用這個標(biāo)號。因此,標(biāo)號可作為轉(zhuǎn)移類指令的操作數(shù),即轉(zhuǎn)移地址。標(biāo)號也有三種屬性:①段值:所在段的段地址,總是在CS段寄存器中;②偏移量:與變量相同,所在段的段內(nèi)偏移地址;③類型:分NEAR和FAR兩種。其中:NEAR—表示標(biāo)號所在語句與轉(zhuǎn)移指令或調(diào)用指令在同一碼段內(nèi),只需改變IP即可。FAR—標(biāo)號所在語句與轉(zhuǎn)移指令或調(diào)用指令不在同一碼段內(nèi)。若沒有對類型進行說明,默認為NEAR。,三、常量、變量、標(biāo)號與表達式(續(xù)),11,,例:測試為0或1,若要檢測AL中的最低位是否為1,若為1則轉(zhuǎn)移。testal,01h;測試AL的最低位D0jnzthere;標(biāo)志ZF=0,即D0=1;則程序轉(zhuǎn)移到there...;否則ZF=1,即D0=0,順序執(zhí)行there:...,TEST,12,表達式是由運算符(操作符)將常數(shù)、寄存器、標(biāo)號、變量組合起來的式子,分數(shù)值表達式和地址表達式兩種。匯編時按一定的優(yōu)先規(guī)則對表達式進行計算。,表達式,(1)算術(shù)運算符,(2)邏輯運算符,(3)關(guān)系運算符,三、常量、變量、標(biāo)號與表達式(續(xù)),下面介紹三種運算符:,數(shù)值表達式,算術(shù)表達式(利用算術(shù)運算符),邏輯表達式(利用邏輯運算符),關(guān)系表達式(利用關(guān)系運算符),13,有+、-、*、/以及MOD(取余),其中MOD表示除法運算后得到的余數(shù)。例:19/7的商是2,19MOD7則為5(余數(shù))算術(shù)運算符可以用于數(shù)值表達式,例:MOVAL,2*7,(1)算術(shù)運算符,14,邏輯運算符有AND、OR、XOR和NOT,它們只能用于數(shù)值表達式中。例:MOVCL,36HAND0FH經(jīng)匯編后:MOVCL,06H這些邏輯運算符也是8086的指令助記符,會不會造成混亂呢?不會的,邏輯運算符在匯編時進行,而指令助記符在指令執(zhí)行時進行。例:ANDDH,PORTAND0FEH后一個邏輯運算符AND在匯編時進行,若PORT為81H,則匯編后表達式算出為80H。執(zhí)行前一個指令助記符AND時,將DH與80H相與,結(jié)果在DH中。,(2)邏輯運算符,ANDDH,PORTAND0FEH,15,【例】用邏輯運算符進行運算。MOVAL,34HAND0FH;04H→ALMOVBL,05HOR30H;35H→BLMOVCX,NOT00FFH;0FF00H→CXMOVDX,789AHXOR000FH;7895H→DXMOVAL,0FHSHL4;AL=11110000BMOVBL,0FHSHR4;BL=00000000B,16,共有6個,分別是:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)關(guān)系運算符的兩個操作數(shù)必須都是數(shù)字或者是同一段內(nèi)的兩個存儲器地址。結(jié)果始終是一個數(shù)字值。若:關(guān)系為真,結(jié)果為0FFFFH關(guān)系為假,結(jié)果為0例:MOVBX,PORTGE5若PORT的值大于等于5,則匯編后為:MOVBX,0FFFFH若PORT的值小于5,則匯編后為:MOVBX,0,(3)關(guān)系運算符,提示:不單獨使用關(guān)系運算符,通常將關(guān)系運算符與邏輯運算符組合起來使用。,17,運算符的優(yōu)先級,1()[]LENGTHOFSIZEOFWIDTHMASK2PTROFFSETSEGTPYETHIS:3HIGELOW4*/MODSHLSHR5+-6EQNEGTLTGELE7NOT8AND9ORXOR10SHORT,18,地址表達式在后面變量中講,19,四、偽指令,段定義偽指令SEGMENT/ENDS符號定義偽指令變量定義偽指令LABEL類型定義偽指令假定偽指令A(yù)SSUME置匯編地址計數(shù)器偽指令ORG源程序結(jié)束偽指令,20,1段定義偽指令,因8086/8088CPU的存儲器是分段的,這就需要有段定義語句。1、段定義偽指令的格式如下:段名SEGMENT[定位類型][組合類型][’類別’]┇段名ENDS解釋:SEGMENT和ENDS這兩個偽指令總是成對出現(xiàn),二者前面的段名一致,由用戶起。二者之間的刪節(jié)部分,一般是符號、變量定義等偽指令。對于數(shù)據(jù)段、附加段及堆棧段同數(shù)據(jù)段,對于代碼段一般則是指令。,21,2、符號定義偽指令,等值偽指令EQU格式:符號名EQU表達式例:AEQU100BEQUA說明:EQU偽指令在未解除前,不能重新定義。等號(=)偽指令與EQU類似,但允許重新定義例:┇EMP=7;值為7┇EMP=8;值為8,已用EQU定義的符號,可用PURGE解除,再重新定義。格式:PURGE符號1,符號2,...,符號n例:AEQU100PURGEAAEQU200,22,3、變量定義偽指令,變量是內(nèi)存中數(shù)據(jù)區(qū)的首地址名字,故定義變量的偽指令又可叫數(shù)據(jù)定義偽指令。這類偽指令格式為:變量名偽指令助記符操作數(shù);注釋,(1)變量名用符號地址表示;(2)偽指令助記符有如下幾種:DB(字節(jié))、DW(字)、DD(雙字)、DF、DQ、DT(3)操作數(shù)可以是常數(shù)或表達式;(4)注釋用來說明偽指令的功能,它亦可有可無。,解釋:,,,,,23,表達式:表達式項是給變量或指定存儲單元賦予初值,它有以下幾種形式:(1)數(shù)值表達式(2)字符串表達式(3)地址表達式(只適用DW和DD兩個偽指令)(4)?表達式(5)帶DUP的表達式,24,匯編后如下圖所示:,A,C,B,10,5,10H,100H,100,-4,60,0FFFBH,,,,,,,,,DatasegmentADB10,5,10HBDW100H,100,-4CDD2*30,0FFFBHDataends,數(shù)值表達式舉例,25,操作數(shù)可以是字符串STRDB‘HELLO’匯編后如下:,STR,‘H’,‘E’,‘L’,‘L’,‘O’,注意下面的不同:ADB’AB’ADW’AB’41‘A’42‘B’42‘B’41‘A’,,,,,,說明:當(dāng)DB定義的數(shù)據(jù)是字符串時,按字符在字符串中出現(xiàn)的先后次序分配內(nèi)存單元。,字符串表達式舉例,26,例3:XDW1,2,$+4,3,4,$+4Lendb$-x設(shè)X的偏移地址為0000H,則匯編后如下圖所示:,x,0000H,,,,,,,,,,0004H,,000AH,,P72例4-2,len,,0004H+4,000AH+4,0012,地址表達式舉例,27,算術(shù)運算符也可以用于地址表達式,地址表達式的基本形式為:變量名或標(biāo)號名+數(shù)值表達式或變量名或標(biāo)號名-數(shù)值表達式說明:對地址運算的結(jié)果應(yīng)有明確的物理意義,例兩個地址的乘或除無意義。例:LEASI,SUM+3;SUM為一變量movax,BUF1-BUF2表示變量SUM的地址加上3得到的和作為新存儲單元的地址。,地址表達式,28,說明:(1)變量和標(biāo)號是最簡單的地址表達式;(2)地址表達式所表示的偏移地址是在匯編時由MASM計算的;(3)兩個地址表達式的差表示兩個地址之間的距離(即字節(jié)數(shù))而且兩個地址必須在同一個段內(nèi);(4)兩個地址表達式相加是沒有意義的,地址表達式(續(xù)),29,$:可用在硬指令中,也可用在偽指令中。在偽指令中使用$,表示的是地址計數(shù)器的當(dāng)前值;,地址計數(shù)器$,匯編程序的地址計數(shù)器:每進入一個新段,地址計數(shù)器清零;每分配一個單元,地址計數(shù)器自動加1,指向下一個待分配的單元;$代表當(dāng)前值。,在硬指令中使用$,它表示本條指令的第一個字節(jié)的地址(本條指令的首地址)。如:JNE$+6$+6表示的轉(zhuǎn)向地址是JNE指令的首地址加上6。它必須是另一條指令的首地址。,30,例3:XDW1,2,$+4,3,4,$+4Lendb$-x設(shè)X的偏移地址為0000H,則匯編后如下圖所示:,x,0000H,,,,,,,,,,0004H,,000AH,,P72例4-2,len,,0004H+4,000AH+4,0012H,地址表達式舉例,31,操作數(shù)?用來保留內(nèi)存空間,但不存入數(shù)據(jù),即初始值未定義。例3:ADB0,1,?,?,?LDW?,54,?匯編后如下圖示:,A,L,0,1,?,?,?,?,?,54,,,,,,?表達式舉例,32,操作數(shù)還可以用復(fù)制操作符DUP來縮寫,如ABCDB0,1,?,?,?亦可寫成:ABCDB0,1,3DUP(?)又如:bufDB2DUP(0,1,2,?)與bufDB0,1,2,?,0,1,2,?等價,DUP表達式舉例,33,,4.LABEL類型定義偽指令格式:名字LABEL類型功能:定義與原有變量類型不同的新變量或為指令語句定義有指定類型的標(biāo)號。通常與數(shù)據(jù)定義偽指令連用,其功能類似語句“變量名或標(biāo)號EQUTHIS類型”。解釋:其中的名字可以是變量或標(biāo)號,當(dāng)為變量時,類型是BYTE、WORD、DWORD等,當(dāng)為標(biāo)號時,類型是NEAR或FAR。舉例:datasegmentbalabelbytewadw100dup(?)dataends上述指令定義了地址相同、類型不同的兩個變量:字節(jié)類型變量ba與字類型變量wa。Movwa,AXMovba,AL,34,,5.指定段寄存器偽指令A(yù)SSUME格式:ASSUME段寄存器名:段名[,段寄存器名:段名……]功能:建立段寄存器與段之間的關(guān)系。即指出某個段的段地址在哪個段寄存器中。如:ASSUMECS:CODE,DS:DATA注意:ASSUME偽指令并不能為段寄存器賦值。說明:ASSUME偽指令只是告知匯編程序有關(guān)段寄存器與段的關(guān)系,并沒有給段寄存器賦予實際的初值。需通過以下指令:MOVAX,DATAMOVDS,AXMOVES,AX實現(xiàn)將段基址裝入段寄存器。說明:代碼段不需要用戶裝,由初始化程序裝入。,35,6.置匯編地址計數(shù)器偽指令ORG,格式:ORG數(shù)值表達式功能:將數(shù)值表達式的值賦給匯編地址計數(shù)器。偽指令ORG規(guī)定了段內(nèi)的起始偏移地址,表達式的值即為段內(nèi)的起始偏移地址,從此地址起連續(xù)存放程序或數(shù)據(jù)。數(shù)值表達式的值須為0~65535之間的非負整數(shù)。【例】給匯編地址計數(shù)器賦值。DATASEGMENTORG10;置$值為10VAR1DW100H,200HORG$+5;置$的值為14+5,即為19VAR2DB‘ABC’DATAENDS,解釋P72例8,36,7、源程序結(jié)束偽指令,格式:END[地址]功能:該語句標(biāo)志整個程序的結(jié)束,是源程序的最后一條語句。說明:可選的地址指出程序執(zhí)行的起始點,通常是標(biāo)號或過程名。,37,SEG操作符OFFSET操作符TYPE操作符PTR屬性操作符THIS類型操作符,五、操作符,38,(1)SEG操作符格式:SEG變量或標(biāo)號功能:分離出其后變量或標(biāo)號所在段的段首址。例如:MOVAX,SEGARRMOVDS,AX(2)OFFSET操作符格式:OFFSET變量或標(biāo)號功能:分離出其后變量或標(biāo)號的偏移地址。例如:MOVBX,OFFSETBUF,提示:ARR與BUF都為某一數(shù)據(jù)段當(dāng)中定義的變量,39,(3)TYPE操作符格式:TYPE變量或標(biāo)號功能:分離出其后變量或標(biāo)號的類型。如果是變量,將返回該變量的類型對應(yīng)字節(jié)數(shù);如果是標(biāo)號,則返回代表標(biāo)號類型的數(shù)值。它們之間的關(guān)系見表所示。,40,對于A、B、C三變量:Sega=segb=segcOffseta=?Offsetb=?Offsetc=?Typea=?Typeb=?Typec=?,舉例:,DATASEGMENTADB‘ABCDEF’BDW10DUP(1,2DUP(2))CDB3,20DUP(0)DATAENDS,41,Sega=segb=segc=0c52HOffseta=0000HOffsetb=0006HOffsetc=0042HTypea=1Typea=2Typea=1,舉例:,DATASEGMENTADB‘ABCDEF’BDW10DUP(1,2DUP(2))CDB3,20DUP(0)DATAENDS,42,功能:用來對存儲單元規(guī)定類型,通常和偽指令BYTE,WORD等連起來使用。例:MOVBYTEPTR[DI],0MOVWORDPTR[DI],0而MOV[DI],0;類型不定PTR也可用來對已經(jīng)規(guī)定了類型進行更改例:STRIDW?;定義為字類型MOVSTRI,AX;是合法的MOVAL,STRI;是非法的只能用:MOVAL,BYTEPTRSTRI,(4)屬性(類型)操作符PTR,說明:PTR只是臨時改變變量的類型屬性,原類型屬性不變,43,功能:返回一個指定類型的內(nèi)存操作數(shù)或標(biāo)號,相應(yīng)的地址為地址計數(shù)器的當(dāng)前值。通常,THIS操作符與EQU配合使用。功能同“LABEL”格式:名字EQUTHIS類型理解:給當(dāng)前偏移地址指定一種類型屬性,同時定義了一個名字例如:bufdw2055h;設(shè)$=0008Hbvarequthisbyte;不占存儲空間wvardw10dup(0);wvar仍然指向0008H解釋:當(dāng)前偏移地址為0008H,第二條語句“THIS”給它指定了一個類型屬性:BYTE,并借助EQU為它定義了名字:bvar。第三條語句使0008H單元具有了另一個名字和另一種屬性。對0008H單元,兩個名字、兩種屬性都可用。解釋:,(5)this類型操作符,注意:※要借助EQU偽指令。※與下一條偽指令合用。,44,DATASEGMENTSTRDB0DH,0AH,’Howareyou!$‘┇DATAENDSSTACKSEGMENTSTACKDB100DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACK,ES:DATABEGIN:MOVAX,DATAMOVDS,AXMOVES,AX┇MOVAH,4CHINT21HCODEENDSENDBEGIN,匯編語言源程序結(jié)構(gòu),45,,過程1:源程序的編輯,源程序文件要以.ASM為擴展名源程序文件的形成(編輯)可以通過任何一個文本編輯器實現(xiàn):DOS中的全屏幕文本編輯器EDIT其他程序開發(fā)工具中的編輯環(huán)境Visualc++等EDITlt1.asm,,六、匯編語言程序的上機過程,46,,過程2:源程序的匯編,匯編是將源程序翻譯成由機器代碼組成的目標(biāo)模塊文件的過程,由匯編程序MASM完成。MASMlt1.asm如果源程序中沒有語法錯誤,MASM將自動生成一個目標(biāo)模塊文件(lt1.obj);否則MASM將給出相應(yīng)的錯誤信息這時應(yīng)根據(jù)錯誤信息,重新編輯修改源程序后,再進行匯編。,47,過程3:目標(biāo)模塊的連接,連接程序能把一個或多個目標(biāo)文件和庫文件合成一個可執(zhí)行程序:LINKlt1.obj如果沒有嚴(yán)重錯誤,LINK將生成一個可執(zhí)行文件(lt1.exe);否則將提示相應(yīng)的錯誤信息這時需要根據(jù)錯誤信息重新修改源程序后再匯編、鏈接,直到生成可執(zhí)行文件,48,過程4:可執(zhí)行程序的調(diào)試,經(jīng)匯編、連接生成的可執(zhí)行程序在操作系統(tǒng)下只要輸入文件名就可以運行:lt1操作系統(tǒng)裝載該文件進入內(nèi)存,并開始運行如果出現(xiàn)運行錯誤,可以從源程序開始排錯,也可以利用調(diào)試程序幫助發(fā)現(xiàn)錯誤采用DEBUG.EXE調(diào)試程序:DEBUGlt1.exe,注:如果結(jié)果在寄存器或存儲器中,則只能在DEBUG下查看結(jié)果,49,,六、匯編語言程序的上機過程,,源程序:文件名.asm,,目標(biāo)模塊:文件名.obj,,可執(zhí)行文件:文件名.exe,,,,錯誤,50,總結(jié),一、匯編語言源程序的基本框架二、匯編語言源程序中的語句三、變量、標(biāo)號的三種屬性四、偽指令五、操作符六、匯編語言上機過程,51,作業(yè),- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 匯編語言 指令
鏈接地址:http://www.3dchina-expo.com/p-3353528.html