![匯編語言程序設計4_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/5dd13db3-639d-4ceb-b20c-842b936a8853/5dd13db3-639d-4ceb-b20c-842b936a88531.gif)
![匯編語言程序設計4_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/5dd13db3-639d-4ceb-b20c-842b936a8853/5dd13db3-639d-4ceb-b20c-842b936a88532.gif)
![匯編語言程序設計4_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/5dd13db3-639d-4ceb-b20c-842b936a8853/5dd13db3-639d-4ceb-b20c-842b936a88533.gif)
![匯編語言程序設計4_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/5dd13db3-639d-4ceb-b20c-842b936a8853/5dd13db3-639d-4ceb-b20c-842b936a88534.gif)
![匯編語言程序設計4_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/7/5dd13db3-639d-4ceb-b20c-842b936a8853/5dd13db3-639d-4ceb-b20c-842b936a88535.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、 第第4 4章章 80868086匯編語言匯編語言主編主編 郭顯久郭顯久大連海洋大學信息工程學院大連海洋大學信息工程學院2011年8月9日匯編語言程序設計匯編語言程序設計教材配套課件教材配套課件 大連理工大學出版社大連理工大學出版社 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 匯編語言中常用偽指令匯編語言中常用偽指令 結(jié)構(gòu)和記錄結(jié)構(gòu)和記錄 匯編語言應用程序的開發(fā)過程匯編語言應用程序的開發(fā)過程 小結(jié)小結(jié)提提 綱綱 4.1.1 匯編語言源程序的一般結(jié)構(gòu)匯編語言源程序的一般結(jié)構(gòu) 所謂匯編語言源程序就是為實現(xiàn)某種功能或完成某種任務而用匯編語所謂匯編語言源程序就是為實現(xiàn)某種功能或完成某種任務而用匯編語言的語句編寫
2、的程序,該程序的擴展名為言的語句編寫的程序,該程序的擴展名為.ASM。 1匯編語言源程序的一般結(jié)構(gòu)匯編語言源程序的一般結(jié)構(gòu)下面為一完整的匯編語言源程序,該程序是實現(xiàn)數(shù)據(jù)段的數(shù)據(jù)下面為一完整的匯編語言源程序,該程序是實現(xiàn)數(shù)據(jù)段的數(shù)據(jù)X與附加段與附加段的數(shù)據(jù)的數(shù)據(jù)Y 相加,結(jié)果存到數(shù)據(jù)段相加,結(jié)果存到數(shù)據(jù)段Z單元中。單元中。D_SEG SEGMENT;定義數(shù)據(jù)段定義數(shù)據(jù)段XDW1234H;定義變量;定義變量XZDW?;定義變量;定義變量Z,“?”表示只為表示只為Z預留相應空預留相應空間間D_SEG ENDSE_SEGSEGMENT;定義附加段定義附加段YDW5678H;定義變量;定義變量YE_SE
3、GENDSS_SEGSENGMENT AT 1000H;定義堆棧段;定義堆棧段DW100 DUP(?)TOSLABEL WORD;定義指向堆棧棧頂變量;定義指向堆棧棧頂變量S_SEGENDSC_SEG SEGMENT;定義代碼段;定義代碼段4.1 4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) MAINMAINPROCPROCFARFAR;定義主過程開始;定義主過程開始ASSUMECS:C_SEG, DS:D_SEG, ES:E_SEG, SS:S_SEG ASSUMECS:C_SEG, DS:D_SEG, ES:E_SEG, SS:S_SEG STARTSTART: PUSHPUSHDSDS;該;
4、該3 3條語句是程序結(jié)束時用于返回系統(tǒng)條語句是程序結(jié)束時用于返回系統(tǒng)SUBSUBAXAX,AXAXPUSHPUSHAXAXMOVMOVAXAX,D_SEGD_SEG;為數(shù)據(jù)段寄存器賦段基址;為數(shù)據(jù)段寄存器賦段基址MOVMOVDSDS,AXAXMOVMOVAXAX,E_SEGE_SEG;為附加段寄存器賦段基址;為附加段寄存器賦段基址MOVMOVESES,AXAXMOVMOVAXAX,S_SEGS_SEG;為堆棧段寄存器賦段基址;為堆棧段寄存器賦段基址MOVMOVSSSS,AXAXMOVMOVSPSP,OFFSET TOSOFFSET TOS;為堆棧指針寄存器賦偏移地址;為堆棧指針寄存器賦偏移地址
5、MOVMOVAXAX,X XADDADDAXAX,ES:YES:YMOVMOVZ Z,AXAXRETRET;返回系統(tǒng);返回系統(tǒng)MAINMAINENDPENDP;主過程結(jié)束;主過程結(jié)束C_SEGC_SEGENDSENDSENDENDSTARTSTART;源程序結(jié)束;源程序結(jié)束4.1 4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 數(shù)據(jù)段名數(shù)據(jù)段名 SEGMENT (用變量定義預置的數(shù)據(jù)空間用變量定義預置的數(shù)據(jù)空間)數(shù)據(jù)段名數(shù)據(jù)段名 ENDS附加段名附加段名 SEGMENT (用變量定義預置的數(shù)據(jù)空間用變量定義預置的數(shù)據(jù)空間)附加段名附加段名 ENDS堆棧段名堆棧段名 STACK (用變量定義預置的堆棧
6、空間用變量定義預置的堆棧空間)堆棧段名堆棧段名 ENDS代碼段名代碼段名 SEGMENTASSUME 指定段與段寄存器的關(guān)系指定段與段寄存器的關(guān)系過程名過程名 PROC 類型類型(程序段程序段)過程名過程名 ENDP 代碼段名代碼段名 ENDS END 標號標號4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 由源程序結(jié)構(gòu)可以看出,匯編語言源程序由以下兩個部由源程序結(jié)構(gòu)可以看出,匯編語言源程序由以下兩個部分構(gòu)成的,即段和過程。在編寫源程序時,可根據(jù)需要定義分構(gòu)成的,即段和過程。在編寫源程序時,可根據(jù)需要定義段,但至少應含有一個代碼段,因為它是程序的主體。數(shù)據(jù)段,但至少應含有一個代碼段,因為它是程序的主
7、體。數(shù)據(jù)段、附加段和堆棧段可視需要定義,各個段在源程序中的順段、附加段和堆棧段可視需要定義,各個段在源程序中的順序可以任意放置。如果程序員使用堆棧,最好設置自己的堆序可以任意放置。如果程序員使用堆棧,最好設置自己的堆棧空間,如果不設置,程序自動使用系統(tǒng)提供的堆??臻g。棧空間,如果不設置,程序自動使用系統(tǒng)提供的堆??臻g。過程是完成某種功能的程序。過程是完成某種功能的程序。2程序結(jié)構(gòu)的偽指令及有關(guān)問題程序結(jié)構(gòu)的偽指令及有關(guān)問題1)段定義偽指令)段定義偽指令指令格式:指令格式:段名段名SEGMENT定位類型定位類型 組合類型組合類型 使用類型使用類型 類類別別段名段名ENDS4.1 匯編語言程序結(jié)構(gòu)
8、匯編語言程序結(jié)構(gòu) SEGMENT表明段的開始,表明段的開始,ENDS表明段的結(jié)束,二者共同定義一個表明段的結(jié)束,二者共同定義一個邏輯段,必須成對使用,中間為定義的內(nèi)容。段名是由程序員給定,它具邏輯段,必須成對使用,中間為定義的內(nèi)容。段名是由程序員給定,它具有段地址有段地址(段基址段基址)和偏移地址兩個屬性。段名應體現(xiàn)所定義段的含義,以和偏移地址兩個屬性。段名應體現(xiàn)所定義段的含義,以表明用此段名所定義段的類型。在不同模塊中,允許有相同的段名,連接表明用此段名所定義段的類型。在不同模塊中,允許有相同的段名,連接程序不把它們看作相同的段;在同一模塊中,同名的段必須有相同類型,程序不把它們看作相同的段
9、;在同一模塊中,同名的段必須有相同類型,以使它們在匯編時合為同一段。以使它們在匯編時合為同一段。 (1)定位類型:指定段的起始邊界。該類型有)定位類型:指定段的起始邊界。該類型有5種選擇,它們是:種選擇,它們是: PARA 段必須從小段邊界開始。即段的起始地址的最低段必須從小段邊界開始。即段的起始地址的最低16進制數(shù)位必須進制數(shù)位必須是是0,這樣偏移地址就可以從,這樣偏移地址就可以從0開始。系統(tǒng)默認是此種選擇。開始。系統(tǒng)默認是此種選擇。 BYTE 該段可以從任何地址開始。這樣偏移地址可能不是該段可以從任何地址開始。這樣偏移地址可能不是0。 WORD該段必須從字的邊界開始。即段的起始地址必須是偶
10、數(shù)。該段必須從字的邊界開始。即段的起始地址必須是偶數(shù)。 DWORD 該段必須從雙字的邊界開始。即段的起始地址的最低該段必須從雙字的邊界開始。即段的起始地址的最低16進制數(shù)進制數(shù)位必須是位必須是4的倍數(shù)。的倍數(shù)。 PAGE 該段必須從頁的邊界開始。即該段地址能夠被該段必須從頁的邊界開始。即該段地址能夠被256整除。整除。4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) (2)組合類型:告訴連接程序本段與其它段之間的關(guān)系。該類型有)組合類型:告訴連接程序本段與其它段之間的關(guān)系。該類型有6種選種選擇,它們是:擇,它們是: PRIVATE 該段為私有段,在連接時不與其它模塊中的同名段合并。系該段為私有段,在連
11、接時不與其它模塊中的同名段合并。系統(tǒng)默認是此種選擇。統(tǒng)默認是此種選擇。 PUBLIC 該段連接時將不同模塊中的同名段連接在一起,組成同一個物該段連接時將不同模塊中的同名段連接在一起,組成同一個物理段,其連接次序由連接命令指定。由于每一分段都從小段的邊界開始,理段,其連接次序由連接命令指定。由于每一分段都從小段的邊界開始,因此各模塊連接后原有段之間可能存在小于因此各模塊連接后原有段之間可能存在小于16個字節(jié)的間隙。個字節(jié)的間隙。 COMMON 該段連接時將不同模塊中的同名段重疊而形成一個段。該段連接時將不同模塊中的同名段重疊而形成一個段。COMMON的連接長度是各段中最大段的長度,重疊部分的內(nèi)容
12、取決于排的連接長度是各段中最大段的長度,重疊部分的內(nèi)容取決于排列在最后一段的內(nèi)容。列在最后一段的內(nèi)容。 STACK 將不同模塊中的同名段連接在一起,組成同一個堆棧段。該段將不同模塊中的同名段連接在一起,組成同一個堆棧段。該段的長度為各原有段長度的總和,各原有段之間并無間隙,而且棧頂可自動的長度為各原有段長度的總和,各原有段之間并無間隙,而且棧頂可自動指向連接后新棧的棧頂。指向連接后新棧的棧頂。 AT 表達式表達式 指定的段地址是表達式計算出來的指定的段地址是表達式計算出來的16位值。它只能指定數(shù)據(jù)位值。它只能指定數(shù)據(jù)段、附加段和堆棧段的起始地址,而不能指定代碼段的地址。段、附加段和堆棧段的起始
13、地址,而不能指定代碼段的地址。 MEMORY指定該段將分配在所有其它連接在一起的段的前面指定該段將分配在所有其它連接在一起的段的前面(在高地址在高地址上上),如果連接時指定有幾個,如果連接時指定有幾個MEMORY段,則將遇到的第一個段視為段,則將遇到的第一個段視為MEMORY段,其它視為段,其它視為COMMON段。段。4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) (3)使用類型:只有使用了)使用類型:只有使用了386及后繼機型的偽指令,使用類型才起作用。及后繼機型的偽指令,使用類型才起作用。它用來說明使用的是它用來說明使用的是16位尋址方式還是位尋址方式還是32位尋址方式。有位尋址方式。有2種選擇
14、種選擇 USE16使用使用16位尋址方式。其段長不超過位尋址方式。其段長不超過64KB,地址的形成是,地址的形成是16位段地位段地址和址和16位偏移地址。系統(tǒng)默認是此種選擇。位偏移地址。系統(tǒng)默認是此種選擇。 USE32使用使用32位尋址方式。其段長可達位尋址方式。其段長可達4GB,地址的形成是,地址的形成是16位段地址位段地址和和32位偏移地址。位偏移地址。(4)類別類別:在引號中給出連接時組成段組的類型名。類別說明并不:在引號中給出連接時組成段組的類型名。類別說明并不能把相同類別的段合并起來,但在連接后形成的裝入模塊中能把相同類別的段合并起來,但在連接后形成的裝入模塊中,可以把它們的可以把它
15、們的位置靠在一起。系統(tǒng)默認該類別為空。位置靠在一起。系統(tǒng)默認該類別為空。 2)存儲模型與簡化段定義偽指令)存儲模型與簡化段定義偽指令 較新版本的匯編程序較新版本的匯編程序(MASM5.0與與MASM6.0)除支持完整段定義偽指令除支持完整段定義偽指令外,還提供了一種新的簡單易用的存儲模型和簡化的段定義偽指令。當源外,還提供了一種新的簡單易用的存儲模型和簡化的段定義偽指令。當源程序使用簡化段定義時,在段定義語句之前必須有存儲模型定義偽指令,程序使用簡化段定義時,在段定義語句之前必須有存儲模型定義偽指令,說明各段在存儲器中的分配。說明各段在存儲器中的分配。 (1)存儲模型偽指令)存儲模型偽指令MO
16、DEL 指令格式:指令格式: MODEL 存儲模型存儲模型4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 在在DOS下用匯編語言編程時,可根據(jù)程序的不同特點選擇下用匯編語言編程時,可根據(jù)程序的不同特點選擇前前6種模型,種模型,SMALL 模型是最常用的一種模型。另外,模型是最常用的一種模型。另外,TINY模型將產(chǎn)生模型將產(chǎn)生.COM程序,其他模型產(chǎn)生程序,其他模型產(chǎn)生.EXE程序。程序。FLAT模型模型只能運行在只能運行在32位位80 x86 CPU上,上,DOS下不允許使用這種模型。下不允許使用這種模型。當與高級語言混合編程時,兩者的存儲模型應當一致。當與高級語言混合編程時,兩者的存儲模型應當一致
17、。4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) (2 2)簡化段定義偽指令)簡化段定義偽指令 指令格式:指令格式: 簡化段偽指令簡化段偽指令 段名段名/ /大小大小 簡化段簡化段定義定義偽指令偽指令如表如表4.24.2所示。所示。4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 這種分段方法把數(shù)據(jù)段分得更細:一是把常數(shù)段和數(shù)據(jù)段分開;二是把初這種分段方法把數(shù)據(jù)段分得更細:一是把常數(shù)段和數(shù)據(jù)段分開;二是把初始化數(shù)據(jù)段和未初始化數(shù)據(jù)段分開始化數(shù)據(jù)段和未初始化數(shù)據(jù)段分開(其中初始化數(shù)據(jù)是指程序中已指定初始其中初始化數(shù)據(jù)是指程序中已指定初始值的數(shù)據(jù)值的數(shù)據(jù));三是把近和遠的數(shù)據(jù)段分開。這樣做的結(jié)果可便于與高級語言
18、三是把近和遠的數(shù)據(jù)段分開。這樣做的結(jié)果可便于與高級語言兼容。兼容。編程者編程者可采取這些標準段來組織和編寫程序,在連接時可把它們組可采取這些標準段來組織和編寫程序,在連接時可把它們組成段組,以便提高程序的運行效率。實際上,如果成段組,以便提高程序的運行效率。實際上,如果只只是為高級語言編寫一是為高級語言編寫一個匯編語言過程,一般采用個匯編語言過程,一般采用.CODE,.DATA和和.STACK等定義三個標準段等定義三個標準段就可以了。就可以了。(3)與簡化段定義有關(guān)的預定義符號與簡化段定義有關(guān)的預定義符號預定義符號的使用方法。預定義符號的使用方法。以數(shù)據(jù)段為例,以數(shù)據(jù)段為例,在完整的段定義情況
19、下,程序的在完整的段定義情況下,程序的一開始,需要用段名一開始,需要用段名將段基址將段基址裝入數(shù)據(jù)段寄存器,如裝入數(shù)據(jù)段寄存器,如本節(jié)開始的例子。本節(jié)開始的例子。MOVAX,D_SEGMOVDS,AX若用簡化段定義,則數(shù)據(jù)段只用若用簡化段定義,則數(shù)據(jù)段只用.DATA來定義,而并未給出段名,此時可來定義,而并未給出段名,此時可用用下面指令為定義段賦段基址:下面指令為定義段賦段基址:MOV AX,DATAMOV DS,AX這里,這里,預定義符號預定義符號DATA相當于相當于給出了數(shù)據(jù)段的段名給出了數(shù)據(jù)段的段名。 4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 3)過程定義偽指令過程定義偽指令指令格式:指
20、令格式:過程名過程名 PROC NEAR/FAR 過程名過程名 ENDP PROC表明過程定義的開始,表明過程定義的開始,ENDP表明過程定義的結(jié)束,二者必須表明過程定義的結(jié)束,二者必須成對使用,中間為過程體,它是實現(xiàn)某一功能的程序段。過程的類型在成對使用,中間為過程體,它是實現(xiàn)某一功能的程序段。過程的類型在PROC中指定,有遠類型中指定,有遠類型(FAR)和近類型和近類型(NEAR),若不指定,則為,若不指定,則為NEAR類型,關(guān)于過程的更多內(nèi)容將在子程序中介紹。類型,關(guān)于過程的更多內(nèi)容將在子程序中介紹。 4)段與段寄存器指定偽指令)段與段寄存器指定偽指令指令格式:指令格式:ASSUME段寄
21、存器:段名段寄存器:段名,段寄存器:段名,段寄存器:段名 該偽指令設定段寄存器與段間的聯(lián)系,向匯編程序指示當前各段所使該偽指令設定段寄存器與段間的聯(lián)系,向匯編程序指示當前各段所使用的段寄存器。用的段寄存器。ASSUME偽指令也可用來取消段寄存器與段間的聯(lián)系,此偽指令也可用來取消段寄存器與段間的聯(lián)系,此時使用時使用NOTHING,然后再建立新的關(guān)系。例如:,然后再建立新的關(guān)系。例如: ASSUMEDS:NOTHING;取消了;取消了DS與原來段的聯(lián)系與原來段的聯(lián)系 ASSUMEDS:DATA;又建立了;又建立了DS與與DATA段的聯(lián)系段的聯(lián)系4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 5 5)段寄
22、存器賦值問題)段寄存器賦值問題 段寄存器用來存放相應段的段基址,段寄存器用來存放相應段的段基址,ASSUMEASSUME偽指令是用來指定段寄存?zhèn)沃噶钍怯脕碇付ǘ渭拇嫫髋c段的聯(lián)系,并沒有將段基址賦給相應的段寄存器,所以在代碼段開始器與段的聯(lián)系,并沒有將段基址賦給相應的段寄存器,所以在代碼段開始就應該先給段寄存器賦段基址,指令為:就應該先給段寄存器賦段基址,指令為:MOVMOVAXAX,段名,段名MOVMOV段寄存器名,段寄存器名,AXAX 需要注意的是:代碼段寄存器需要注意的是:代碼段寄存器CSCS是由系統(tǒng)自動賦段基址的,不需用戶是由系統(tǒng)自動賦段基址的,不需用戶賦值,否則會出現(xiàn)錯誤。堆棧段寄存器
23、賦值,否則會出現(xiàn)錯誤。堆棧段寄存器SSSS也可以不用賦值,由系統(tǒng)自動給也可以不用賦值,由系統(tǒng)自動給SSSS和和SPSP賦段基址和棧頂?shù)刂?,但前提是在定義堆棧時必須把參數(shù)寫全,其賦段基址和棧頂?shù)刂?,但前提是在定義堆棧時必須把參數(shù)寫全,其形式為:形式為:STACKSTACKSEGMENT SEGMENT PARA STACK STACKPARA STACK STACK6 6)程序返回系統(tǒng)問題)程序返回系統(tǒng)問題 在在IBM-DOSIBM-DOS環(huán)境下運行匯編語言程序,為使程序運行結(jié)束后正常返回環(huán)境下運行匯編語言程序,為使程序運行結(jié)束后正常返回系統(tǒng),一般在主程序中采用以下兩種形式。系統(tǒng),一般在主程序中
24、采用以下兩種形式。一種形式是在程序結(jié)束時插入下面指令:一種形式是在程序結(jié)束時插入下面指令:MOVMOVAXAX,4C00H4C00HINTINT21H21H4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 另一種形式是在程序設計時,程序開始和結(jié)尾處安排下面的指令:另一種形式是在程序設計時,程序開始和結(jié)尾處安排下面的指令:PUSHDSSUBAX,AXPUSHAX;所編寫的程序;所編寫的程序RET 本節(jié)開頭的例子就是采用這種形式。本書主要采用第一種方式實現(xiàn)主本節(jié)開頭的例子就是采用這種形式。本書主要采用第一種方式實現(xiàn)主程序的返回,但考慮到這兩種返回系統(tǒng)方式都需要掌握,因此有的例子中程序的返回,但考慮到這兩種
25、返回系統(tǒng)方式都需要掌握,因此有的例子中也采用了第二種方式。也采用了第二種方式。4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 4.1.2 4.1.2 匯編語言語句結(jié)構(gòu)匯編語言語句結(jié)構(gòu) 在匯編語言中,所使用的語句可分為三種基本語句,即指令語句、偽在匯編語言中,所使用的語句可分為三種基本語句,即指令語句、偽指令語句和宏指令語句。指令語句是計算機可執(zhí)行的語句,與指令系統(tǒng)中指令語句和宏指令語句。指令語句是計算機可執(zhí)行的語句,與指令系統(tǒng)中的指令相對應;偽指令語句是為了方便程序設計提供給匯編程序使用的,的指令相對應;偽指令語句是為了方便程序設計提供給匯編程序使用的,是不可執(zhí)行的指令,匯編程序根據(jù)偽指令語句的要求
26、,在匯編時作相應處是不可執(zhí)行的指令,匯編程序根據(jù)偽指令語句的要求,在匯編時作相應處理,比如:定義段、定義數(shù)據(jù)、分配存儲空間等。理,比如:定義段、定義數(shù)據(jù)、分配存儲空間等。 1 1匯編語言語句一般結(jié)構(gòu)匯編語言語句一般結(jié)構(gòu) 在匯編語言源程序中,每個語句可以由在匯編語言源程序中,每個語句可以由4 4項組成,即:項組成,即: 名字項名字項 操作項操作項 操作數(shù)項操作數(shù)項 ;注釋項;注釋項 上面四項中帶方括號的項是可選項,根據(jù)需要由程序員指定,各項間上面四項中帶方括號的項是可選項,根據(jù)需要由程序員指定,各項間必須用空格或制表符隔開。其中名字項可以用字母、數(shù)字及必須用空格或制表符隔開。其中名字項可以用字母
27、、數(shù)字及“?、?、 、_ _、$”$”等專用字符命名,除數(shù)字外,所有字符都可以為名字的第一個字符;等專用字符命名,除數(shù)字外,所有字符都可以為名字的第一個字符;若名字中用到若名字中用到,則必須是名字的第一個字符;名字項的命名應是有意義,則必須是名字的第一個字符;名字項的命名應是有意義的字符串,以便于閱讀和理解;名字項可以是標號、變量或符號常量。操的字符串,以便于閱讀和理解;名字項可以是標號、變量或符號常量。操作項可以是指令、偽操作指令或宏指令的助記符。操作數(shù)項可以是一個或作項可以是指令、偽操作指令或宏指令的助記符。操作數(shù)項可以是一個或多個操作數(shù),多個操作數(shù)間用逗號分開,它們可以是常數(shù)、寄存器、標
28、號、多個操作數(shù),多個操作數(shù)間用逗號分開,它們可以是常數(shù)、寄存器、標號、變量或表達式。注釋項用變量或表達式。注釋項用“;”與操作數(shù)項分開,以說明該語句的與操作數(shù)項分開,以說明該語句的4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 功能;也可以用分號開頭單獨作為一個注釋行使用,以說明下面程序段的功能;也可以用分號開頭單獨作為一個注釋行使用,以說明下面程序段的功能,以便為閱讀程序的人員提供幫助。下面針對三種基本語句分別介紹功能,以便為閱讀程序的人員提供幫助。下面針對三種基本語句分別介紹各語句的前各語句的前3項組成含義項組成含義.2具體語句結(jié)構(gòu)具體語句結(jié)構(gòu)1)指令語句)指令語句指令語句格式:指令語句格式:標
29、號:標號:指令助記符指令助記符 操作數(shù)操作數(shù)1,操作數(shù),操作數(shù)2,;注釋;注釋 標號:是用在指令語句前面,用冒號與指令助記符分開,標號表示其標號:是用在指令語句前面,用冒號與指令助記符分開,標號表示其所在指令的偏移地址,它常用作轉(zhuǎn)移指令或調(diào)用指令轉(zhuǎn)去的目標地址的指所在指令的偏移地址,它常用作轉(zhuǎn)移指令或調(diào)用指令轉(zhuǎn)去的目標地址的指示。標號有三種屬性,即:示。標號有三種屬性,即:(1)段屬性:標號可反映它所在程序段的段基址,即可提供)段屬性:標號可反映它所在程序段的段基址,即可提供CS寄存器的寄存器的內(nèi)容。內(nèi)容。(2)偏移屬性:標號可反映它所在程序段的偏移地址,即從段基址到定)偏移屬性:標號可反映它
30、所在程序段的偏移地址,即從段基址到定義標號位置之間的字節(jié)數(shù)。對于義標號位置之間的字節(jié)數(shù)。對于16位段是位段是16位無符號數(shù),對于位無符號數(shù),對于32位段則是位段則是32位無符號數(shù)。位無符號數(shù)。(3)類型屬性:標號類型屬性是指在引用標號時是段內(nèi)引用還是段間引)類型屬性:標號類型屬性是指在引用標號時是段內(nèi)引用還是段間引用。在段內(nèi)引用時,它只提供偏移地址,其屬性為近屬性,類型保留字為用。在段內(nèi)引用時,它只提供偏移地址,其屬性為近屬性,類型保留字為NEAR(類型值為(類型值為-1);當段間引用時,它提供段基址和偏移地址,其屬);當段間引用時,它提供段基址和偏移地址,其屬性為遠屬性,類型保留字為性為遠屬
31、性,類型保留字為FAR(類型值為(類型值為-2)。)。4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 指令助記符:表示計算機所要執(zhí)行的操作,它是指令系統(tǒng)中各指令的指令助記符:表示計算機所要執(zhí)行的操作,它是指令系統(tǒng)中各指令的助記符,如助記符,如MOVMOV、ADDADD、MULMUL等。等。 操作數(shù):操作數(shù)則給出在指令執(zhí)行操作過程中所需要的操作數(shù)據(jù),它操作數(shù):操作數(shù)則給出在指令執(zhí)行操作過程中所需要的操作數(shù)據(jù),它可以有多個操作數(shù),也可沒有。是否有操作數(shù)是根據(jù)指令功能而定。對于可以有多個操作數(shù),也可沒有。是否有操作數(shù)是根據(jù)指令功能而定。對于雙操作數(shù),操作數(shù)雙操作數(shù),操作數(shù)1 1稱為目的稱為目的( (目標目
32、標) )操作數(shù),操作數(shù)操作數(shù),操作數(shù)2 2稱為源操作數(shù)。需要稱為源操作數(shù)。需要存放執(zhí)行結(jié)果的指令,結(jié)果存放在目的操作數(shù)中。在前面講過,立即數(shù)不存放執(zhí)行結(jié)果的指令,結(jié)果存放在目的操作數(shù)中。在前面講過,立即數(shù)不能為目的操作數(shù)的原因在于不能存放指令執(zhí)行結(jié)果。能為目的操作數(shù)的原因在于不能存放指令執(zhí)行結(jié)果。 例如:完成例如:完成(BX)(BX)、(AX)(AX)兩個寄存器內(nèi)容相加,結(jié)果存放在兩個寄存器內(nèi)容相加,結(jié)果存放在(BX)(BX)寄存器寄存器中,指令如下:中,指令如下: STARTSTART:ADDADDBX, AXBX, AX;BX(BX)+(AX)BX(BX)+(AX)其中,其中,STARTS
33、TART可代表該指令的首地址??纱碓撝噶畹氖椎刂贰?2 2)偽指令語句)偽指令語句偽指令語句格式:偽指令語句格式: 變量變量 偽指令助記符操作數(shù)偽指令助記符操作數(shù)1 1,操作數(shù),操作數(shù)2 2,;注釋;注釋 變量:是用在偽指令語句前面,用空格與偽指令助記符分開,變量表示其變量:是用在偽指令語句前面,用空格與偽指令助記符分開,變量表示其所在偽指令的第一個參數(shù)的偏移地址,用所在偽指令的第一個參數(shù)的偏移地址,用DBDB、DWDW、DDDD、DQDQ、DTDT和和LABLELABLE等等來定義。它常用作操作數(shù)的直接尋址或相對尋址。變量也有三種屬性,即:來定義。它常用作操作數(shù)的直接尋址或相對尋址。變量也
34、有三種屬性,即:4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) (1)段屬性:變量可反映它所定義段的段基址,該段基址必須在一個段)段屬性:變量可反映它所定義段的段基址,該段基址必須在一個段寄存器中。寄存器中。(2)偏移屬性:變量可反映它所在段的偏移地址,即從段基址到定義變)偏移屬性:變量可反映它所在段的偏移地址,即從段基址到定義變量位置之間的字節(jié)數(shù)。對于量位置之間的字節(jié)數(shù)。對于16位段是位段是16位無符號數(shù),對于位無符號數(shù),對于32位段則是位段則是32位位無符號數(shù)。無符號數(shù)。(3)類型屬性:變量類型屬性是指定義該變量所保留的字節(jié)數(shù)。如:)類型屬性:變量類型屬性是指定義該變量所保留的字節(jié)數(shù)。如:BYT
35、E(1個字節(jié)個字節(jié))數(shù)據(jù),則類型屬性值為;數(shù)據(jù),則類型屬性值為;WORD(個字節(jié)個字節(jié))數(shù)據(jù),則類數(shù)據(jù),則類型屬性值為等等。型屬性值為等等。 操作數(shù):操作數(shù)給出在偽指令中所定義的數(shù)據(jù),它可以有多個,也可操作數(shù):操作數(shù)給出在偽指令中所定義的數(shù)據(jù),它可以有多個,也可沒有,是否有操作數(shù)是根據(jù)需要而定,匯編程序在匯編時使用所定義的數(shù)沒有,是否有操作數(shù)是根據(jù)需要而定,匯編程序在匯編時使用所定義的數(shù)據(jù)。若有操作數(shù)可用來對指定單元進行初始化,也可用分配存儲空間而不據(jù)。若有操作數(shù)可用來對指定單元進行初始化,也可用分配存儲空間而不存入確定的數(shù)值。存入確定的數(shù)值。3)宏指令語句)宏指令語句宏指令語句格式:宏指令語
36、句格式:標號標號宏指令助記符操作數(shù)宏指令助記符操作數(shù)1,操作數(shù),操作數(shù)2,;注釋;注釋其中其中“標號標號”同指令語句中的標號,宏指令助記符是由程序員根據(jù)需要命同指令語句中的標號,宏指令助記符是由程序員根據(jù)需要命名的,具體宏指令的定義見第章。名的,具體宏指令的定義見第章。需要注意的是:在同一個程序中,同樣的標號或變量的定義只允許出現(xiàn)一需要注意的是:在同一個程序中,同樣的標號或變量的定義只允許出現(xiàn)一次,否則匯編程序會指示出錯。次,否則匯編程序會指示出錯。4.1 匯編語言程序結(jié)構(gòu)匯編語言程序結(jié)構(gòu) 偽指令又稱偽操作,它們不像機器指令那樣在程序運行期間由計算機來偽指令又稱偽操作,它們不像機器指令那樣在程
37、序運行期間由計算機來執(zhí)行的,而是在匯編程序?qū)R編語言源程序進行匯編期間由匯編程序處理的執(zhí)行的,而是在匯編程序?qū)R編語言源程序進行匯編期間由匯編程序處理的操作。它們可以完成像處理器選擇、定義程序模式、定義數(shù)據(jù)、分配存儲空操作。它們可以完成像處理器選擇、定義程序模式、定義數(shù)據(jù)、分配存儲空間等等。在間等等。在IBMIBM宏匯編中,偽指令有數(shù)十種,本節(jié)只介紹一些經(jīng)常使用的偽指宏匯編中,偽指令有數(shù)十種,本節(jié)只介紹一些經(jīng)常使用的偽指令,若需要其它偽指令可查閱相關(guān)參考書或手冊。令,若需要其它偽指令可查閱相關(guān)參考書或手冊。4.2.1 4.2.1 處理器選擇偽指令處理器選擇偽指令 由于由于3232位位PCPC系
38、列微機有多種系列微機有多種CPUCPU,如,如386386、486486、586586、PentiumPentium等,因此也等,因此也就有多種指令系統(tǒng),這些就有多種指令系統(tǒng),這些CPUCPU指令系統(tǒng)雖然向上兼容,但又擴充了許多新指令。指令系統(tǒng)雖然向上兼容,但又擴充了許多新指令。在編寫程序時,要告訴匯編程序所選擇的處理器,以保證對其擴充指令進行在編寫程序時,要告訴匯編程序所選擇的處理器,以保證對其擴充指令進行匯編,而不至于匯編時出錯,這就需要處理器選擇偽指令對所用指令系統(tǒng)進匯編,而不至于匯編時出錯,這就需要處理器選擇偽指令對所用指令系統(tǒng)進行選擇。此類偽指令主要有以下幾種:行選擇。此類偽指令主要
39、有以下幾種:80868086 ;選擇;選擇80868086指令系統(tǒng)指令系統(tǒng) 80286 80286 ;選擇;選擇8028680286指令系統(tǒng)指令系統(tǒng)8038680386;選擇;選擇8038680386指令系統(tǒng)指令系統(tǒng) 80386P 80386P ;選擇保護方式下的;選擇保護方式下的8038680386指令系統(tǒng)指令系統(tǒng)8048680486;選擇;選擇8048680486指令系統(tǒng)指令系統(tǒng) 80486P 80486P ;選擇保護方式下的;選擇保護方式下的8048680486指令系統(tǒng)指令系統(tǒng)8058680586;選擇;選擇8058680586指令系統(tǒng)指令系統(tǒng) 80586P 80586P ;選擇保護方式
40、下的;選擇保護方式下的8058680586指令系統(tǒng)指令系統(tǒng)8068680686;選擇;選擇8068680686指令系統(tǒng)指令系統(tǒng) MMX MMX ;選擇多媒體擴展指令系統(tǒng);選擇多媒體擴展指令系統(tǒng) 4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 這類偽指令一般放在匯編語言源程序的開頭或特殊需要的地方。如不這類偽指令一般放在匯編語言源程序的開頭或特殊需要的地方。如不給出,則匯編程序默認為給出,則匯編程序默認為8086CPU8086CPU和和80878087協(xié)處理器的指令系統(tǒng)。若程序中協(xié)處理器的指令系統(tǒng)。若程序中使用了一條使用了一條8038680386所增加的指令,則可在該指令前加一行所增加的指
41、令,則可在該指令前加一行“80386”80386”,在,在其后可用其后可用“8086”8086”偽指令使之恢復偽指令使之恢復8086CPU8086CPU指令系統(tǒng)。指令系統(tǒng)。 注意:()有關(guān)注意:()有關(guān)“選擇保護方式下的指令系統(tǒng)選擇保護方式下的指令系統(tǒng)”的含義是指的含義是指包括特權(quán)指令在內(nèi)的指令系統(tǒng)。此外,上述偽指令均支持相應的協(xié)處理器包括特權(quán)指令在內(nèi)的指令系統(tǒng)。此外,上述偽指令均支持相應的協(xié)處理器指令。指令。()若處理器選擇偽指令放在程序段之外,如果需要再給出另一種處理()若處理器選擇偽指令放在程序段之外,如果需要再給出另一種處理器選擇偽指令,則應在結(jié)束當前段之后給出。例如:器選擇偽指令,則
42、應在結(jié)束當前段之后給出。例如: 80386 80386;設置;設置3232位位386386指令系統(tǒng)模式指令系統(tǒng)模式CODESEGCODESEG SEGMENT SEGMENTCODESEG ENDSCODESEG ENDS 8086 8086;恢復;恢復1616位位80868086指令系統(tǒng)模式指令系統(tǒng)模式 CODESEG CODESEG SEGMENT SEGMENT CODESEG ENDS CODESEG ENDS4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 4.2.2 4.2.2 變量與符號常量定義偽指令變量與符號常量定義偽指令1 1變量定義偽指令變量定義偽指令 這類偽指令可以為
43、數(shù)據(jù)分配存儲單元或進行數(shù)據(jù)初始化,并賦予一個這類偽指令可以為數(shù)據(jù)分配存儲單元或進行數(shù)據(jù)初始化,并賦予一個變量名及初值。根據(jù)數(shù)據(jù)定義的長度,有以下幾種偽指令:變量名及初值。根據(jù)數(shù)據(jù)定義的長度,有以下幾種偽指令:(1 1)DBDB:用來定義字節(jié)數(shù)據(jù),其后每個數(shù)據(jù)占有一個字節(jié)(:用來定義字節(jié)數(shù)據(jù),其后每個數(shù)據(jù)占有一個字節(jié)(8 8位),其類位),其類型保留字為型保留字為BYTEBYTE,類型屬性值為,類型屬性值為1 1。(2 2)DWDW:用來定義字數(shù)據(jù),其后每個數(shù)據(jù)占有一個字(:用來定義字數(shù)據(jù),其后每個數(shù)據(jù)占有一個字(1616位),其低位位),其低位字節(jié)在第一個字節(jié)地址中,高位字節(jié)在第二個字節(jié)地址中
44、,即高位數(shù)據(jù)在字節(jié)在第一個字節(jié)地址中,高位字節(jié)在第二個字節(jié)地址中,即高位數(shù)據(jù)在高地址中,低位數(shù)據(jù)在低地址中,其類型保留字為高地址中,低位數(shù)據(jù)在低地址中,其類型保留字為WORDWORD,類型屬性值為,類型屬性值為2 2。(3 3)DDDD:用來定義雙字數(shù)據(jù),其后每個數(shù)據(jù)占有兩個字(:用來定義雙字數(shù)據(jù),其后每個數(shù)據(jù)占有兩個字(3232位),其類位),其類型保留字為型保留字為DWORDDWORD,類型屬性值為,類型屬性值為4 4。(4 4)DFDF:用來定義三字數(shù)據(jù),其后每個數(shù)據(jù)占有三個字(:用來定義三字數(shù)據(jù),其后每個數(shù)據(jù)占有三個字(4848位),可用位),可用來存放遠地址,其類型保留字為來存放遠地
45、址,其類型保留字為FWORDFWORD,類型屬性值為,類型屬性值為6 6。這一偽指令只能。這一偽指令只能用于用于386386及以上機型中。及以上機型中。(5 5)DQDQ:用來定義四字數(shù)據(jù),其后每個數(shù)據(jù)占有四個字(:用來定義四字數(shù)據(jù),其后每個數(shù)據(jù)占有四個字(6464位),可用位),可用來存儲雙精度浮點數(shù),其類型保留字為來存儲雙精度浮點數(shù),其類型保留字為QWORDQWORD,類型屬性值為,類型屬性值為8 8。(6 6)DTDT:用來定義五字數(shù)據(jù),其后每個數(shù)據(jù)占有五個字(:用來定義五字數(shù)據(jù),其后每個數(shù)據(jù)占有五個字(8080位),其類位),其類型保留字為型保留字為TWORDTWORD,類型屬性值為,
46、類型屬性值為1010。 ;其它與結(jié)構(gòu)有關(guān)偽指令;其它與結(jié)構(gòu)有關(guān)偽指令4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 下面通過例子對下面通過例子對DBDB、DWDW和和DDDD進行說明。進行說明。例例4.14.1 操作數(shù)可以是常數(shù)或是表達式(該表達式必操作數(shù)可以是常數(shù)或是表達式(該表達式必須能求得一個常數(shù)),如:須能求得一個常數(shù)),如:DATABDATABDB DB 8080,2020,0FFH0FFHDATAWDATAWDW DW 100H100H,-20-20,5050* *5050DATADDATADDD DD 12345678H12345678H,50+5050+50 匯編程序在匯
47、編期間可以將所定義的數(shù)據(jù)存入?yún)R編程序在匯編期間可以將所定義的數(shù)據(jù)存入存儲器(內(nèi)存)中。注意:若首位數(shù)據(jù)是字母時,存儲器(內(nèi)存)中。注意:若首位數(shù)據(jù)是字母時,其前必須加其前必須加“0”0”,以跟變量或標號區(qū)分;若操作數(shù),以跟變量或標號區(qū)分;若操作數(shù)是表達式,則將表達式的值存入存儲器中;數(shù)據(jù)存是表達式,則將表達式的值存入存儲器中;數(shù)據(jù)存放一般以十六進制表示,負數(shù)用其補碼存放。變量放一般以十六進制表示,負數(shù)用其補碼存放。變量DATABDATAB、DATAWDATAW和和DATADDATAD分別代表所定義第一個數(shù)據(jù)的分別代表所定義第一個數(shù)據(jù)的首地址。例首地址。例4.14.1所定義的數(shù)據(jù)在內(nèi)存中的存放如
48、圖所定義的數(shù)據(jù)在內(nèi)存中的存放如圖4.14.1所示。所示。4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 例例4.24.2 操作數(shù)可以是字符串。在定義字符串操作數(shù)可以是字符串。在定義字符串時,一定要用時,一定要用DBDB偽指令,如:偽指令,如: STRING1 STRING1DBDBABCDABCD STRING2 STRING2DBDBAA,B B ,CC, DD 字符串要用單引號括起來,在匯編時將字字符串要用單引號括起來,在匯編時將字符的符的ASCIIASCII碼存到存儲器中。碼存到存儲器中。STRING1STRING1和和STRING2STRING2在存儲器中存放的結(jié)果是相同的,如在
49、存儲器中存放的結(jié)果是相同的,如圖圖4.24.2所示。所示。 例例4.34.3 設置預留存儲空間或定義數(shù)組。這設置預留存儲空間或定義數(shù)組。這時操作數(shù)可用時操作數(shù)可用“?”或重復運算符或重復運算符DUPDUP。如:。如: TAB1 TAB1 DB DB0 0,?,?,?,?,0 0 TAB2 TAB2 DW DW3232,?,?,4848 匯編時,在匯編時,在“?”的地方不存入數(shù)據(jù),只的地方不存入數(shù)據(jù),只保留相應類型空間,如圖保留相應類型空間,如圖4.34.3(a a)所示。)所示。 4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 重復運算符重復運算符DUPDUP的運用格式為:的運用格式為:
50、 COUNT DUP COUNT DUP(操作數(shù)(操作數(shù)1 1,操作數(shù),操作數(shù)2 2, ) 其中,其中,COUNTCOUNT為一正整數(shù),用來指定括號中為一正整數(shù),用來指定括號中操作數(shù)的重復次數(shù),它與操作數(shù)的重復次數(shù),它與DUPDUP間用空格分開。間用空格分開。DUPDUP還允許多層嵌套,即還允許多層嵌套,即DUPDUP中的操作數(shù)也可以中的操作數(shù)也可以是是DUPDUP。如:。如: ARRAY1 ARRAY1 DB DB2 DUP(12 DUP(1,2)2) ARRAY2 ARRAY2 DB DB100 DUP(100 DUP(?) ) ARRAY3 ARRAY3 DW DW10 DUP(2 DU
51、P(110 DUP(2 DUP(1,2)2),3)3) ARRAY1 ARRAY1定義的數(shù)組是將定義的數(shù)組是將1 1、2 2在存儲器中存儲在存儲器中存儲2 2遍,共占用遍,共占用4 4個字節(jié)空間;個字節(jié)空間;ARRAY2ARRAY2是在存儲器是在存儲器中預留了中預留了100100個字節(jié)空間;個字節(jié)空間;ARRAY3ARRAY3定義的數(shù)組共定義的數(shù)組共占用占用5050個字空間。匯編后的結(jié)果如圖個字空間。匯編后的結(jié)果如圖4.34.3(b b)所示。所示。4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 例例4.44.4 可以用可以用DWDW偽指令把變量或標號的偏移偽指令把變量或標號的偏移地址或
52、用地址或用DDDD偽指令把變量或標號的偏移地址和偽指令把變量或標號的偏移地址和段基址存入存儲器(第一個字為偏移地址,第二段基址存入存儲器(第一個字為偏移地址,第二個字為段基址)。如:若個字為段基址)。如:若VAR1VAR1、VAR2VAR2為變量,為變量,LAB1LAB1、LAB2LAB2為標號,則存儲它們的地址可用下為標號,則存儲它們的地址可用下面?zhèn)沃噶睿好鎮(zhèn)沃噶睿篈DDRTAB1ADDRTAB1DWDWVAR1VAR1 DW DWLAB1LAB1ADDRTAB2ADDRTAB2DDDDVAR2VAR2 DD DDLAB2LAB2 匯編結(jié)果如圖匯編結(jié)果如圖4.44.4所示。所示。4. 4.
53、匯編語言中常用偽指令匯編語言中常用偽指令 例例4.54.5 用LABEL偽指令可以將同一個數(shù)據(jù)區(qū)定義成不同類型數(shù)據(jù)區(qū),以適應不同類型數(shù)據(jù)的存取操作;也可以定義指向同一指令的NEAR和FAR類型標號,由其它程序段來調(diào)用FAR標號,在同一程序段內(nèi)調(diào)用NEAR標號。LABEL偽指令的格式為:變量或標號名LABEL類型保留字例如:DBYTELABELBYTE DWORDDW1234H,5678HDBYTE將DWORD空間又定義成字節(jié)空間,DBYTE為字節(jié)變量。執(zhí)行語句:MOVAL,DWORD;該語句為非法,兩個操作數(shù)類型不一致MOVAL,DBYTE;該語句為合法語句,結(jié)果為:(AL)=34H MOVA
54、X,DWORD;結(jié)果為:(AX)=1234H又例如:FARSUB LABEL FARNEARSUB:MOV AX,BX CMP AX,0 JENEARSUB ;若(AX)=0,則轉(zhuǎn)到標號NEARSUB若從另一個程序段轉(zhuǎn)到指令MOV AX,BX處執(zhí)行,可用指令: JMPFARSUB4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 2 2符號常量定義偽指令符號常量定義偽指令在編寫程序時,常遇到同一個表達式出現(xiàn)多次的情況,為提高程序的可讀在編寫程序時,常遇到同一個表達式出現(xiàn)多次的情況,為提高程序的可讀性,也便于調(diào)試和修改,用性,也便于調(diào)試和修改,用EQUEQU偽指令將這個表達式定義為符號常量,在
55、偽指令將這個表達式定義為符號常量,在出現(xiàn)表達式的地方,用符號常量代替。當對表達式修改時,只需修改定義出現(xiàn)表達式的地方,用符號常量代替。當對表達式修改時,只需修改定義處表達式即可。符號常量定義偽指令的格式為:處表達式即可。符號常量定義偽指令的格式為:符號常量名符號常量名EQUEQU表達式表達式符號常量名符號常量名= =數(shù)字表達式數(shù)字表達式其中其中EQUEQU中的表達式可以是常數(shù)、數(shù)字表達式、變量、標號、寄存器名或中的表達式可以是常數(shù)、數(shù)字表達式、變量、標號、寄存器名或指令助記符等。需要注意的是:指令助記符等。需要注意的是:(1 1)在)在EQUEQU表達式中,如果有變量或標號表達式,則在該語句前
56、應該先給表達式中,如果有變量或標號表達式,則在該語句前應該先給出它們的定義。出它們的定義。(2 2)同一個源程序,)同一個源程序,EQUEQU所定義的符號常量不允許重復定義,否則匯編程所定義的符號常量不允許重復定義,否則匯編程序給出錯誤。序給出錯誤?!?”=”所定義的符號常量允許重復定義。所定義的符號常量允許重復定義。(3 3)同一源程序中,同一符號常量不允許同時用)同一源程序中,同一符號常量不允許同時用EQUEQU和和“=”=”同時定義。同時定義。(4 4)所定義的符號常量在內(nèi)存中不分配存儲單元。)所定義的符號常量在內(nèi)存中不分配存儲單元。4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令
57、例例4.64.6 說明說明EQUEQU和和“=”=”的用法。的用法。 CONSTANT CONSTANTEQUEQU100100;100100賦給符號常量賦給符號常量 X XEQUEQUCONSTANT+50CONSTANT+50;X X的值為的值為150150 BS BSEQU EQU BX+SIBX+SI;BSBS與與BX+SIBX+SI等價等價 DBYTE DBYTEDBDB10 DUP(?) 10 DUP(?) DWORD EQU WORD PTR DBYTE DWORD EQU WORD PTR DBYTE;將;將DBYTEDBYTE定義為新的名字和類型定義為新的名字和類型 M ME
58、QUEQUMOVMOV;M M與與MOVMOV等價等價 VALUE VALUE= =8 8; VALUE=8VALUE=8 VALUE VALUE = =VALUE+1VALUE+1;VALUE=9VALUE=9利用上面定義,可有:利用上面定義,可有: M M AL AL,CONSTANT CONSTANT ;(;(ALAL)=100=100 MOV MOV BS BS,VALUEVALUE;將;將9 9存入由存入由BX+SIBX+SI指定的單元指定的單元而下面是錯誤的,例如:而下面是錯誤的,例如: CONSTANT CONSTANTEQUEQU100100 CONSTANT CONSTANT
59、EQUEQUCONSTANT+100CONSTANT+100;CONDTANTCONDTANT被重復定義了被重復定義了 Y Y= =8 8 Y YEQUEQU2020;Y Y被被“=”=”和和EQUEQU同時定義了同時定義了4. 4. 匯編語言中常用偽指令匯編語言中常用偽指令 3 3模塊定義偽指令模塊定義偽指令 為了使程序設計具有模塊功能,匯編語言提供了模塊定義偽指令為了使程序設計具有模塊功能,匯編語言提供了模塊定義偽指令 NAME/TITLENAME/TITLE、ENDEND。 (1 1)模塊定義偽指令)模塊定義偽指令NAME/TITLENAME/TITLE 指令格式:指令格式:NAMENA
60、ME模塊名模塊名 (TITLE(TITLE標題標題) ) 該語句為源程序模塊開始的第一個語句,匯編程序?qū)⒔o出程序員所定該語句為源程序模塊開始的第一個語句,匯編程序?qū)⒔o出程序員所定義的義的“模塊名模塊名”為模塊的名字。若程序中沒有使用為模塊的名字。若程序中沒有使用NAMENAME,則可以使用,則可以使用TITLETITLE。TITLETITLE偽指令可指定列表文件的每一頁上打印的標題,同時匯編程偽指令可指定列表文件的每一頁上打印的標題,同時匯編程序?qū)⒂眯驅(qū)⒂谩皹祟}標題”中的前中的前6 6個字符作為模塊名,個字符作為模塊名,“標題標題”最多可有最多可有6060個字符。個字符。若源程序既無若源程序既
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)字化轉(zhuǎn)型趨勢及實施方案
- 鍋爐工聘用合同
- 三農(nóng)行業(yè)現(xiàn)代農(nóng)業(yè)園區(qū)規(guī)劃與設計指導書
- 三農(nóng)村農(nóng)業(yè)綜合開發(fā)方案
- 2025年東營貨運上崗證模擬考試
- 2025年東莞貨運資格證安檢考試題
- 2025年安順貨運從業(yè)資格證模擬考試保過版
- 2025年遼陽貨運從業(yè)資格模擬考試
- 2025年荊州貨運車從業(yè)考試題
- 2024年高考化學一輪復習2.2離子反應離子方程式練習含解析
- 《義務教育道德與法治課程標準》解讀
- 2024年臨滄永德縣人民法院聘用制書記員招聘考試真題
- 2025年春新滬科版物理八年級下冊全冊教學課件
- 2025年國家廣播電視總局監(jiān)管中心招聘5人高頻重點提升(共500題)附帶答案詳解
- 中醫(yī)院發(fā)展中醫(yī)重點???、學科加強中醫(yī)藥人才培養(yǎng)的具體措施
- 2025年中國私域電商行業(yè)市場運行態(tài)勢、市場規(guī)模及發(fā)展趨勢研究報告
- 財務核算管理制度
- 2024年山東省淄博市中考英語試題(含答案)
- 2025年浙江省重點高中提前自主招生數(shù)學模擬試卷(含答案)
- 弱電智能化勞務分包合同
- 電網(wǎng)調(diào)度基本知識課件
評論
0/150
提交評論