版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第4章 指令系統(tǒng)與匯編語言程序設(shè)計(jì) 【內(nèi)容簡(jiǎn)介】 首先講述8086的尋址方式、指令系統(tǒng)、匯編語言語句格式、保護(hù)方式編程指令,然后講述匯編語言程序設(shè)計(jì)、宏以及DOS功能調(diào)用,最后簡(jiǎn)要說明32位微處理器指令系統(tǒng)的功能與使用。 【重點(diǎn)難點(diǎn)】 重點(diǎn)是8086尋址方式、指令系統(tǒng)與匯編程序設(shè)計(jì)。難點(diǎn)是匯編語言程序設(shè)計(jì)。第4章 指令系統(tǒng)與匯編語言程序設(shè)計(jì) 4.1 概述 4.2 8086尋址方式 4.3 8086指令系統(tǒng) 4.4 匯編語言程序格式與常用偽指令 4.5 匯編語言程序設(shè)計(jì) 4.6 匯編語言程序上機(jī)過程4.1 概述 4.1.1 指令與程序 4.1.2 匯編語言基本概念指令與程序操作碼操作數(shù)圖4.1
2、指令的基本格式 所謂指令,就是指示計(jì)算機(jī)進(jìn)行某一工作的命令,而程序是為求解某一問題或進(jìn)行某項(xiàng)工作的若干條指令的有序集合。指令如圖所示。一臺(tái)計(jì)算機(jī)全部指令的集合稱為指令系統(tǒng)。操作碼域說明指令的類型與功能,操作數(shù)域也稱為地址域,說明數(shù)據(jù)在存儲(chǔ)器中的地址及操作結(jié)果存放的地址。 表示一條指令的二進(jìn)制數(shù)稱為指令字,按長(zhǎng)度可分為單字節(jié)、雙字節(jié)、三字節(jié)甚至四字節(jié)等。 按操作數(shù)的個(gè)數(shù)又可分為無操作數(shù)、單操作數(shù)、雙操作數(shù)以至三操作數(shù)指令,也稱為無地址、一地址、二地址以至三地址指令。 其中存放結(jié)果的稱為目的操作數(shù)或目的地址,其它則稱為源操作數(shù)或源地址。 用二進(jìn)制代碼表示指令系統(tǒng)的語言稱為機(jī)器語言,用以設(shè)計(jì)的程序稱
3、為機(jī)器語言程序。例如以下兩條指令可構(gòu)成一段程序,是把數(shù)據(jù)20H經(jīng)寄存器CL,與累加器AL中的數(shù)相加,結(jié)果在AL中。 10110001 00100000 00000010 11000001匯編語言基本概念 用英文助記符表示指令系統(tǒng)的語言稱為匯編語言,比如用ADD、SUB、JMP表示加、減、轉(zhuǎn)移等操作。用匯編語言指令編寫的程序稱為匯編語言程序。 在計(jì)算機(jī)中,一條匯編語言指令對(duì)應(yīng)于一條機(jī)器語言指令。因此,匯編語言指令實(shí)際上是機(jī)器指令的符號(hào)化表示。例如上一節(jié)的機(jī)器語言程序可由如下匯編語言指令來表示。 MOVCL,20H ADD AL,CL 匯編語言程序,人們易于編寫、識(shí)別和理解。但是必須轉(zhuǎn)換成機(jī)器語言
4、,計(jì)算機(jī)才能被識(shí)別和執(zhí)行。這一轉(zhuǎn)換過程稱為匯編,由專門的匯編程序進(jìn)行。通常,人們把用匯編語言編寫的程序稱為源程序,經(jīng)匯編而生成的機(jī)器語言程序稱為目標(biāo)程序或目標(biāo)代碼。 另外,還有一些用來說明匯編過程,或?qū)R編過程進(jìn)行輔助說明的指令,稱為偽指令。4.2 8086尋址方式 在指令中,操作數(shù)或操作數(shù)的地址可用多種方式來表示,統(tǒng)稱為尋址方式。同一條指令可有不同的尋址方式,以說明不同的操作對(duì)象。 4.2.1 數(shù)據(jù)類型 4.2.2 尋址方式4.2.1 數(shù)據(jù)類型 在計(jì)算機(jī)中,二進(jìn)制數(shù)據(jù)有多種類型或用途。一種是指令處理的對(duì)象,即操作數(shù);另一種是指令字;第三種是操作數(shù)的地址。在指令中,操作數(shù)又分為兩種,一種是參加
5、運(yùn)算或由計(jì)算機(jī)處理的對(duì)象,即數(shù)據(jù)操作數(shù),簡(jiǎn)稱為數(shù)據(jù);另一種表示轉(zhuǎn)移指令的目標(biāo)地址,即轉(zhuǎn)移地址。 1. 數(shù)據(jù)操作數(shù) 按照存儲(chǔ)的位置,可分為三種:立即數(shù)、寄存器數(shù)據(jù)和存儲(chǔ)器數(shù)據(jù)。 2. 轉(zhuǎn)移地址操作數(shù) 表示轉(zhuǎn)移目標(biāo)地址,可在轉(zhuǎn)移指令中直接給出,也可根據(jù)某一尋址方式求得。4.2.2 尋址方式 根據(jù)操作數(shù)的兩大類型,尋址方式也分為兩類,即數(shù)據(jù)尋址方式和轉(zhuǎn)移地址尋址方式。 1. 數(shù)據(jù)尋址方式 在數(shù)據(jù)尋址方式中,有以下7種。 (1)立即數(shù) 立即數(shù)是指指令操作數(shù)域直接給出的就是參加運(yùn)算或進(jìn)行某種操作的數(shù)據(jù),又稱即時(shí)數(shù),有8位、16位等形式。對(duì)于16位數(shù)據(jù),低字節(jié)在先,高字節(jié)在后。例如指令: MOV AL,5
6、 執(zhí)行后(AL)=05H,操作示意圖如圖(a)所示。 又如指令: MOVAX,2790H ;操作示意圖如圖(b)所示。 立即數(shù)只能是源操作數(shù),不能是目的操作數(shù)。 (2)寄存器尋址 是指指令操作數(shù)域給出的是存放操作數(shù)的寄存器。對(duì)于8位操作數(shù),寄存器有AL、AH、BL、BH、CL、CH、DL、DH;對(duì)于16位操作數(shù),寄存器有AX、BX、CX、DX、SI、DI、SP、BP。 例如指令: MOV BX,AX 操作示意圖如圖所示。 (3)直接尋址 是指令操作數(shù)域給出的是存放操作數(shù)地址的偏移量,也稱為有效地址,常用EA表示,尋址方式如圖所示。例如指令: MOV BX,2000H 執(zhí)行前(DS)= 4000
7、H,EA=2000H,(42000H)=1FH,(42001H)=75H。 執(zhí)行后(BX)= 751FH,操作示意圖如圖所示。 如果操作數(shù)存放在其它段中,應(yīng)指定段寄存器,又如指令: MOV AX,ES:2100H 執(zhí)行前(ES)=1000H,EA=2100H, (12100H)=2AH,(12101H)=17H 執(zhí)行后(AX)=172AH 在匯編語言中,可以使用符號(hào)地址代替數(shù)值地址。例如: MOV AX,VALUE VALUE是符號(hào)地址。符號(hào)地址出現(xiàn)在指令中,可省略方括號(hào),例如 MOV AX,DATA。 (4)寄存器間接尋址 是指令操作數(shù)域給出的是存放操作數(shù)地址偏移量的寄存器。寄存器主要有BX
8、、BP、SI和DI。若沒有特別說明, BX、SI、DI默認(rèn)操作數(shù)在數(shù)據(jù)段(DS)中。BP默認(rèn)操作數(shù)在堆棧段(SS)中。段寄存器中的的基地址左移4位與16位偏移量相加,生成20位的物理地址,如圖所示。 例如指令: MOV AX,BX 設(shè)(DS)=3000H,(BX)=3000H,執(zhí)行后(AX)=2C7DH,操作示意圖如圖所示。 又如指令:MOV AX,ES:SI;段寄存器為ES,數(shù)據(jù)在附加段中。 (5)寄存器相對(duì)尋址 指令操作數(shù)域給出的是一個(gè)基址寄存器和一個(gè)偏移量,基地址與偏移量相加,作為操作數(shù)地址的偏移地址EA,如圖所示。例如指令: MOV AX,DATADI執(zhí)行前(DS)=3000H, (D
9、I)=2000H, DATA=300H,執(zhí)行后(AX)=201AH,操作示意圖如圖所示。 (6)基址加變址尋址 指令操作數(shù)域給出的是一個(gè)基址寄存器和一個(gè)變址寄存器,兩寄存器中的數(shù)據(jù)相加,作為操作數(shù)的偏移地址EA?;芳拇嫫髦饕蠦X、BP,變址寄存器主要有SI和DI。其中BX默認(rèn)DS, BP默認(rèn)SS,允許使用段跨越,如圖所示。 例如指令:MOV AX,BXDI 或 MOV AX,BX+DI 執(zhí)行前(DS)=2100H,(BX)=0158H,(DI)=10A5H, 執(zhí)行后(AX)=1234H,操作示意圖如圖所示。 (7)相對(duì)基址加變址尋址 指令操作數(shù)域給出一個(gè)基址寄存器、變址寄存器和一個(gè)偏移量,
10、兩寄存器中的數(shù)據(jù)及偏移量相加,作為操作數(shù)的偏移地址EA?;芳拇嫫髦饕蠦X、BP,變址寄存器主要有SI和DI。BX默認(rèn)DS, BP默認(rèn)SS。 例如指令: MOV AX,MASKBXDI MOV AX,MASKBX+DI MOV AX,MASK+BX+DI 執(zhí)行前(DS)=3000H,(BX)=2000H,(DI)=1000H, MASK=0250H 執(zhí)行后(AX)=4675H,操作示意如圖所示。 2. 轉(zhuǎn)移地址尋址方式 主要用來確定轉(zhuǎn)移指令和CALL指令的目標(biāo)地址,其目標(biāo)地址可能在當(dāng)前代碼段內(nèi),也可能在當(dāng)前代碼段外,故有4中方式。 (1)段內(nèi)相對(duì)尋址 轉(zhuǎn)移地址由IP的當(dāng)前值與指令中給出的8位
11、或16位偏移量相加而生成。偏移量是一個(gè)帶符號(hào)的數(shù),用補(bǔ)碼表示。其中8位偏移量稱為段內(nèi)短轉(zhuǎn)移SHORT,轉(zhuǎn)移范圍為-128+127;16位偏移量稱為段內(nèi)近轉(zhuǎn)移NEAR,轉(zhuǎn)移范圍-32768+32767。其示意如圖所示。 段內(nèi)相對(duì)尋址的特點(diǎn)是代碼段寄存器CS的值保持不變。指令格式如下: JMP SHORT OPR ;IP(IP)+8位偏移量 JMP NEAR PTR OPR ;IP(IP)+16位偏移量 (2)段內(nèi)間接尋址 轉(zhuǎn)移指令的偏移地址存放在一個(gè)16位的寄存器或存儲(chǔ)器單元中,用來取代IP中的當(dāng)前值。該寄存器或存儲(chǔ)器單元可由數(shù)據(jù)尋址方式中除立即數(shù)之外的任何一種方式得到。其示意如圖所示。 段內(nèi)間
12、接尋址的特點(diǎn)是CS的值不變,IP的值由16位寄存器或存儲(chǔ)器單元中的數(shù)據(jù)所取代。 例如指令: JMP BX ;BX中的數(shù)送入指令指針I(yè)P中 又如指令: JMP WORD PTR BXSI ;按照基址加變址的方式獲取操作數(shù),送入IP中 (3)段間直接尋址 在指令中直接給出16位段地址和16位偏移地址,分別送入CS和IP中。 例如指令:JMP FAR PTR NEXTSUB 段間尋址由FAR來說明,其中NEXTSUB是符號(hào)地址,指令直接給出,包括轉(zhuǎn)移目標(biāo)的偏移地址和段地址。 (4)段間間接尋址 轉(zhuǎn)移地址存放在存儲(chǔ)器中的兩個(gè)連續(xù)字單元中,第一個(gè)字是偏移地址,第二個(gè)字是段地址。存儲(chǔ)器單元地址可用數(shù)據(jù)尋址
13、方式中除立即數(shù)和寄存器直接尋址以外的任何一種尋址方式來確定,如圖所示。 例如指令: JMP DWORD PTR BX 由BX確定兩個(gè)連續(xù)存儲(chǔ)器單元,取出其中的數(shù)分別送入IP和CS中.4.3 8086指令系統(tǒng) 8086指令系統(tǒng)按功能可分為6種類型,即數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算指令、串操作指令、程序控制指令和處理器控制指令。 4.3.1 數(shù)據(jù)傳送類指令 4.3.2 算術(shù)運(yùn)算類指令 4.3.3 邏輯運(yùn)算與移位類指令 4.3.4 串操作類指令 4.3.5 控制轉(zhuǎn)移類指令 4.3.6 處理器控制類指令4.3.1 數(shù)據(jù)傳送類指令 數(shù)據(jù)傳送類指令共有14條,可分為4種類型:通用數(shù)據(jù)傳送指令、地址傳
14、送指令、標(biāo)志寄存器傳送指令和輸入輸出指令。 1. 通用數(shù)據(jù)傳送指令 (1)傳送指令 MOV 格式:MOV DST,SRC 功能:DST(SRC) 說明:DST表示目的操作數(shù)地址,SRC表示源操作數(shù)地址,其中目的操作數(shù)不能是立即數(shù)、CS和IP寄存器;兩存儲(chǔ)器單元之間和兩段寄存器之間不能直接傳送;立即數(shù)不能直接傳送到段寄存器;允許段跨越,不影響標(biāo)志位。源/目操作數(shù)傳送關(guān)系如圖所示。 例如指令: MOV AX,DX ;源與目操作數(shù)均為16位 MOV AL,ES:BX ;目的操作數(shù)8位,即說明源操作數(shù)也為8位 【例4.1】 將地址為ADD1存儲(chǔ)器單元中的數(shù)據(jù)傳送到同段內(nèi)地址為ADD2的存儲(chǔ)器單元中。
15、解:使用傳送指令,程序如下: MOV AL,ADD1 MOV ADD2,AL 【例4.2】將立即數(shù)DAT1傳送到段寄存器ES中。 解:由于ES不能直接傳送立即數(shù),因此需要借用其它寄存器來實(shí)現(xiàn),程序如下: MOV AX,DAT1 MOV ES,AX (2)堆棧操作指令 壓棧指令 PUSH 格式:PUSH SRC 功能:SP(SP)-2 (SP)+1,(SP)(SRC) 彈棧指令 POP 格式:POP DST 功能:DST(SP)+1,(SP) SP(SP)+2 說明:堆棧操作指令以字為單位,可以使用除立即數(shù)以外的其它尋址方式,允許段跨越;PUSH CS 合法,但POP CS非法;不影響狀態(tài)標(biāo)志位
16、。 (3)交換指令 XCHG 格式:XCHG OPR1,OPR2 功能:(OPR1)(OPR2) 說明:XCHG指令不適用段寄存器和立即數(shù),不允許兩存儲(chǔ)器單元直接交換,兩操作數(shù)可以是8位或16位。允許段跨越,不影響狀態(tài)標(biāo)志位。例如指令: XCHG AL,BL ;兩操作數(shù)均為8位 XCHG AX,SS:SI ;AX寄存器指明操作數(shù)為16位 (4)換碼指令 XLAT 格式:XLAT OPR 或 XLAT 功能:AL(BX)+(AL) 說明:OPR表示表格中的地址,BX存放表格首地址,AL存放待查值(偏移量),查得結(jié)果送AL中,不影響狀態(tài)標(biāo)志位。 【例4.5】在以DATA為首地址的主存區(qū)域中連續(xù)存放
17、著09的平方表,試編寫查表程序。 解:首地址存入寄存器BX中,待查數(shù)據(jù)X送入AL中。 MOV BX,OFFSET DATA MOV AL,X XLAT DATA 或 XLAT 2. 地址傳送指令 (1)有效地址送寄存器指令 LEA 格式:LEA REG,SRC 功能:REGSRC 說明:將源操作數(shù)的有效地址傳送到指定的寄存器REG中,源操作數(shù)可以是除立即數(shù)和寄存器尋址以外的其它尋址方式;允許段跨越;不影響狀態(tài)標(biāo)志位。 【例4.6】將例中DATA首地址存入寄存器BX中。 解:使用LEA指令,程序如下: LEA BX,DATA (2)指定寄存器與段寄存器DS置數(shù)指令 LDS 格式:LDS REG,
18、SRC 功能:REG(SRC) DS(SRC+2) 說明:把存儲(chǔ)器中兩個(gè)連續(xù)字單元中的數(shù)據(jù)傳送到指定寄存器和DS中,不影響狀態(tài)標(biāo)志。 例如指令: LDS SI,1508H ;把DS和1508H所指定單元的字操作數(shù)送入寄存器SI,下一單元的字操作數(shù)送入段寄存器DS中。 (3)指定寄存器與段寄存器ES置數(shù)指令 LES 格式:LES REG,SRC 功能:REG(SRC) ES(SRC+2) 說明:與指令LDS功能相同,段寄存器選擇ES。 例如指令:LES DI,DI 3. 狀態(tài)標(biāo)志寄存器傳送指令 (1)狀態(tài)標(biāo)志寄存器低8位送AH指令 LAHF 格式:LAHF 功能:AH(PSW的低字節(jié)) 說明:不
19、影響狀態(tài)標(biāo)志位。 (2)寄存器AH送狀態(tài)標(biāo)志寄存器低8位指令 SAHF 格式:SAHF 功能:PSW的低字節(jié)(AH) 說明:狀態(tài)標(biāo)志寄存器的低8位由裝入的數(shù)值來確定。 (3)狀態(tài)標(biāo)志寄存器壓棧指令 PUSHF 格式:PUSHF 功能:SP(SP)-2 (SP)+1,(SP)(PSW) 說明:不影響狀態(tài)標(biāo)志位。 (4)狀態(tài)標(biāo)志寄存器彈棧指令 POPF 格式:POPF 功能:PSW(SP)+1,(SP) SP(SP)+2 說明:影響狀態(tài)標(biāo)志寄存器,由裝入的數(shù)值來確定。 4輸入輸出指令 有兩條,即IN和OUT,實(shí)現(xiàn)AL或AX與外設(shè)端口之間的數(shù)據(jù)傳送。 (1)輸入指令 IN 格式:IN AL,PORT
20、 IN AX,PORT IN AL,DX IN AX,DX 功能:AL(PORT) AX(PORT+1,PORT) AL(DX) AX(DX)+1,(DX) 其中PORT是I/O端口地址,且在00H0FFH之間。 (2)輸出指令 OUT 格式:OUT PORT,AL (2)輸出指令 OUT 格式:OUT PORT,AL OUT PORT,AX OUT DX,AL OUT DX,AX 功能:PORT(AL) PORT+1,PORT(AX) (DX)(AL) (DX)+1,(DX)(AX) 說明:當(dāng)端口地址為00H0FFH時(shí),可直接尋址;當(dāng)端口地址為0100H0FFFFH時(shí),必須使用寄存器DX間接
21、尋址;不影響狀態(tài)標(biāo)志位。4.3.2 算術(shù)運(yùn)算類指令 算術(shù)運(yùn)算指令有20條,分5種類型,可對(duì)4種類型的數(shù)據(jù)進(jìn)行運(yùn)算,即無符號(hào)二進(jìn)制數(shù)、帶符號(hào)二進(jìn)制數(shù)、無符號(hào)壓縮型BCD碼和無符號(hào)非壓縮型BCD碼。運(yùn)算結(jié)果影響狀態(tài)標(biāo)志位。 1. 加法指令 (1)加法指令 ADD 格式:ADD DST,SRC 功能:DST(DST)+(SRC) 說明: 源/目操作數(shù)地址如圖所示,其中目的操作數(shù)不能使用立即數(shù),兩存儲(chǔ)器單元之間不允許直接加法運(yùn)算;允許段跨越; ADD指令不區(qū)分兩個(gè)加數(shù)是無符號(hào)數(shù)還是帶符號(hào)數(shù),運(yùn)算結(jié)果的二進(jìn)制形式相同, 影響狀態(tài)標(biāo)志位。 例如指令: ADD AL,BX ;AL寄存器指明操作是字節(jié)操作 A
22、DD WORD PTR BX,12H ;WORD PTR指明內(nèi)存操作數(shù)為字操作數(shù) 又如指令:ADD AX,BX 設(shè)(AX)=1234H,(BX)=0F7C9H 指令執(zhí)行后(AX)=09FDH,OF=0,SF=0,ZF=0,AF=0,PF=0,CF=1 (2)帶進(jìn)位加法指令 ADC 格式:ADC DST,SRC 功能:DST(DST)+(SRC)+CF 說明:進(jìn)位位CF的值加到兩數(shù)和的最低位,其它與ADD指令相同。 【例4.7】試編寫程序,計(jì)算雙字4A750000H + 78912365H 之和。 解:按照雙字操作,由寄存器DX和AX組成32位累加器,先用ADD指令進(jìn)行低字運(yùn)算,再用ADC指令進(jìn)
23、行高字運(yùn)算,程序如下: MOV AX, 0000H MOV DX, 4A75H ADD AX, 2365H ADC DX, 7891H (3)加1指令 INC 格式:INC DST 功能:DST(DST)+1 說明:操作數(shù)可以是除立即數(shù)之外的其它尋址方式,可以字節(jié)運(yùn)算,也可以字運(yùn)算,且不區(qū)分無符號(hào)數(shù)還是帶符號(hào)數(shù);允許段跨越;影響除CF之外的其它狀態(tài)標(biāo)志位。 2. 減法指令 (1)減法指令 SUB 格式:SUB DST,SRC 功能:DST(DST)-(SRC) 說明: 源/目操作數(shù)地址如圖所示,目的操作數(shù)不能使用立即數(shù),兩存儲(chǔ)器單元不能直接進(jìn)行減法運(yùn)算;允許段跨越。 不區(qū)分操作數(shù)是無符號(hào)還是符
24、號(hào)數(shù),運(yùn)算結(jié)果的二進(jìn)制形式相同,影響狀態(tài)標(biāo)志位。 例如指令:SUB AX,BX 設(shè)(AX)=578FH,(DS)=1000H,(BX)=2000H,(12000H)=7890H 指令執(zhí)行后 (AX)=0DEFFH,OF=0,SF=1,ZF=0,AF=0,PF=1,CF=1 (2)帶借位減法指令 SBB 格式:SBB DST,SRC 功能:DST(DST)-(SRC)-CF 說明:被減數(shù)減去減數(shù),同時(shí)再減進(jìn)位位CF的值,其它與減法指令SUB相同。 (3)減1指令 DEC 格式:DEC DST 功能:DST(DST)1 說明:同INC指令。 例如指令:DEC CX (4)求補(bǔ)指令 NEG 格式:N
25、EG DST 功能:DST0(DST) 說明:操作數(shù)同INC指令,影響所有狀態(tài)標(biāo)志位,操作數(shù)為零時(shí)CF=1,其它情況下CF=0。 例如指令:NEG AX 設(shè)(AX)=0FFFFH 指令執(zhí)行后(AX)=0001H,OF=0,SF=0,ZF=0,AF=1,PF=0,CF=1 (5)比較指令CMP 格式:CMP DST,SRC 功能:(DST)(SRC)置狀態(tài)標(biāo)志位 說明:進(jìn)行減法運(yùn)算,不送結(jié)果,置狀態(tài)標(biāo)志位。 3. 乘法指令 (1)無符號(hào)數(shù)乘法指令MUL 格式:MUL SRC 功能:AX(AL)(SRC) 字節(jié)操作 DX,AX(AX)(SRC) 字操作 說明: 源/目操作數(shù)均為無符號(hào)數(shù); 目的操作
26、數(shù)必須是累加器AX或AL,源操作數(shù)可以是除立即數(shù)之外的其它尋址方式;源操作數(shù)允許段跨越; 除OF和CF之外的狀態(tài)標(biāo)志無定義;執(zhí)行MUL指令后,若乘積的高字/高字節(jié)為0,則OF=CF=0;否則,OF=CF=1。 【例4.9】將DAT1和DAT2兩個(gè)字節(jié)單元的無符號(hào)數(shù)相乘,乘積存放在DAT3字單元中。 解:使用無符號(hào)指令,程序如下: MOV AL,DAT1 MUL DAT2 MOV DAT3,AX (2)帶符號(hào)數(shù)乘法指令I(lǐng)MUL 格式:IMUL SRC 功能:操作數(shù)為帶符號(hào)數(shù),其它與MUL相同。 說明:源/目操作數(shù)均為帶符號(hào)數(shù); 同MUL指令; 除OF和CF之外的標(biāo)志無定義;執(zhí)行IMUL指令后,若
27、乘積的高字/高字節(jié)是符號(hào)擴(kuò)展位時(shí),則OF=CF=0;否則,OF=CF=1。 4除法指令 (1)無符號(hào)數(shù)除法指令DIV 格式:DIV SRC 功能:AL(AX)/(SRC)的商 AH余數(shù) AX(DX,AX)/(SRC)的商 DX余數(shù) 說明: 字節(jié)運(yùn)算時(shí)16位的被除數(shù)存放在AX中,字運(yùn)算時(shí)32位的被除數(shù)存放在DX,AX中;除數(shù)可以是除立即數(shù)之外的其它尋址方式,允許段跨越; 所有狀態(tài)標(biāo)志位無定義。 (2)帶符號(hào)數(shù)除法指令I(lǐng)DIV 格式:IDIV SRC 功能:操作數(shù)是帶符號(hào)數(shù),其它與DIV相同。 說明:被除數(shù)的長(zhǎng)度不是除數(shù)的倍時(shí),被除數(shù)高位符號(hào)擴(kuò)展,其它與DIV指令相同。 【例4.10】設(shè)(AX)=
28、0400H,(BL)=0B4H,執(zhí)行指令 DIV BL和IDIV BL。 解: 執(zhí)行指令 DIV BL 由于(AX)和(BL)為無符號(hào)數(shù),因此指令DIV BL執(zhí)行后: (AL)=05H AL商 (AH)=7CH AH余數(shù) 執(zhí)行指令 IDIV BL 由于( AX)和(BL)為帶符號(hào)的補(bǔ)碼數(shù),因此指令I(lǐng)DIV BL執(zhí)行后: (AL)=0F3H=-13D AL商 (AH)=24H=36D AH余數(shù) 在除法運(yùn)算時(shí)若商溢出,直接轉(zhuǎn)入0型中斷處理。 (3)CBW 符號(hào)位擴(kuò)展指令 格式:CBW 字節(jié)轉(zhuǎn)換為字 CWD 字轉(zhuǎn)換為雙字 功能:字節(jié)擴(kuò)展 AH(AL)的符號(hào)位 字?jǐn)U展 DX(AX)的符號(hào)位 5十進(jìn)制調(diào)
29、整指令 在BCD碼數(shù)據(jù)運(yùn)算后必須修正,該類指令共有6條。 (1)非壓縮BCD碼加法調(diào)整指令 AAA 格式:AAA 功能:AL把AL中的和調(diào)整成非壓縮BCD碼格式 AH(AH)+調(diào)整產(chǎn)生的進(jìn)位值 說明:影響狀態(tài)標(biāo)志CF和AF,其余標(biāo)志位無定義。 例如指令:ADD AL,BL AAA (2)壓縮BCD碼加法調(diào)整指令 DAA 格式:DAA 功能:AL把AL中的和調(diào)整成壓縮BCD碼格式 說明:兩加數(shù)為壓縮BCD碼,狀態(tài)標(biāo)志OF無定義,影響其余狀態(tài)標(biāo)志位。 例如指令:ADD AL,BL DAA (3)非壓縮BCD碼減法調(diào)整指令A(yù)AS 格式:AAS 功能:AL把AL中的差調(diào)整成非壓縮BCD碼格式 AH(A
30、H)-調(diào)整產(chǎn)生的借位 說明:兩操作數(shù)為非壓縮BCD碼,影響狀態(tài)標(biāo)志CF和AF,其余標(biāo)志位無定義。 (4)壓縮BCD碼減法調(diào)整指令 DAS 格式:DAS 功能:(AL)把AL中的差調(diào)整成壓縮BCD碼格式 說明:兩操作數(shù)為壓縮BCD碼,狀態(tài)標(biāo)志OF無定義,影響其余標(biāo)志 (5)非壓縮BCD碼乘法調(diào)整指令A(yù)AM 格式:AAM 功能:AX把AL中的乘積調(diào)整成非壓縮的BCD碼格式 說明:兩乘數(shù)為非壓縮BCD碼,影響狀態(tài)標(biāo)志SF、ZF和PF,其余標(biāo)志位無定義。 例如指令: MUL AL,BL AAM (6)非壓縮BCD碼除法調(diào)整指令 AAD 格式:AAD 功能:AL10(AH)+(AL) AH0 說明: 在
31、指令DIV之前使用,被除數(shù)是兩位非壓縮BCD碼,存放在AX中,AH中存放十位數(shù)字,AL中存放個(gè)位數(shù)字,且高4位均為0;除數(shù)是一位非壓縮的BCD碼,高4位為0;調(diào)整結(jié)果在AL中,AH中清0;執(zhí)行其后的DIV指令后,AL中為一位非壓縮BCD碼的商,AH中為一位BCD碼的余數(shù); 影響狀態(tài)標(biāo)志SF、ZF和PF,其余OF、CF和AF標(biāo)志位無定義。4.3.3 邏輯運(yùn)算與移位類指令 邏輯運(yùn)算與移位指令有13條,分為3類,即邏輯運(yùn)算指令、移位指令和循環(huán)移位指令,可對(duì)位/16位寄存器或存儲(chǔ)器中的數(shù)據(jù)進(jìn)行操作。 1. 邏輯運(yùn)算指令 邏輯運(yùn)算指令有5條,其中源/目操作數(shù)地址同算術(shù)運(yùn)算指令。 (1)邏輯“與”指令 A
32、ND 格式:AND DST,SRC 功能:DST(DST)(SRC) 說明:使?fàn)顟B(tài)標(biāo)志CF和OF清0,AF無定義,SF、ZF和PF由運(yùn)算結(jié)果設(shè)置。 例如指令: AND AX,1110 1111 0111 1111B ;使AX中第7、12位清0,其余位不變 (2)邏輯“或”指令 OR 格式:OR DST,SRC 功能:DST(DST)(SRC) 說明:對(duì)狀態(tài)標(biāo)志位的影響同AND指令。 例如指令: OR BX, 0001 0000 1000 0000B ;使BX中第7位、12位置1,其余位不變。 (3)邏輯“異或”指令 XOR 格式:XOR DST,SRC 功能:DST(DST)(SRC) 說明:
33、對(duì)狀態(tài)標(biāo)志位的影響同AND指令。 例如指令: XOR AL,1010 0000B ;使AL的第5、7位取反,其余位不變。 【例4.11】 將AX和CF清零。 解:實(shí)現(xiàn)方法有多種,如下: 方法1: AND AX,0 方法2: XOR AX,AX 方法3: SUB AX,AX (4)邏輯“非”指令 NOT 格式:NOT DSTDST 功能:DST( DST ) 說明:不影響標(biāo)志位。 (5) TEST測(cè)試指令 格式:TEST DST,SRC 功能:(DST)(SRC) 置狀態(tài)標(biāo)志,不送結(jié)果 說明:執(zhí)行過程與AND指令相同,設(shè)置狀態(tài)標(biāo)志,不送結(jié)果;對(duì)狀態(tài)標(biāo)志位的影響同AND指令。 例如指令: TEST
34、 AX,0040H ;測(cè)試AX中第6位是否為1 2移位指令 移位指令有4條,包括算術(shù)/邏輯左移與右移,其作用如圖所示。 (1)算術(shù)左移指令 SAL 格式:SAL DST,CNT 功能:左移,如圖(a)所示,相當(dāng)于操作數(shù)乘以2。 說明: DST可以是除立即數(shù)之外的任一種尋址方式,移位次數(shù)由CNT決定,CNT可以是1或寄存器CL;DST可以是字節(jié),也可以是字; 影響狀態(tài)標(biāo)志CF、SF、PF和ZF,AF無定義,OF只在CNT=1時(shí)有效。 (2)算術(shù)右移指令SAR 格式:SAR DST,CNT 功能:右移,如圖(b)所示,相當(dāng)于操作數(shù)除以2。 說明:操作數(shù)同指令SAL,對(duì)狀態(tài)標(biāo)志位的影響同指令SAL。
35、 (3)邏輯左移指令SHL 格式:SHL DST,CNT 功能:左移,如圖(c)所示,相當(dāng)于無符號(hào)數(shù)乘2。 說明:操作數(shù)同指令SAL,對(duì)狀態(tài)標(biāo)志位的影響同指令SAL。 (4)邏輯右移指令 SHR 格式:SHR DST,CNT 功能:右移,如圖(d)所示,相當(dāng)于無符號(hào)數(shù)除2。 說明:操作數(shù)同SAL指令,對(duì)狀態(tài)標(biāo)志位的影響同指令SAL。 3循環(huán)移位指令 循環(huán)移位指令有4條,包括帶進(jìn)位/不帶進(jìn)位的循環(huán)左移與右移,其作用如圖所示。 (1)循環(huán)左移指令 ROL 格式:ROL DST,CNT 功能:循環(huán)左移,如圖(a)所示。 說明:影響狀態(tài)標(biāo)志位CF,OF只在CNT=1時(shí)有效,不影響SF、PF、ZF和AF
36、。 (2)循環(huán)右移指令 ROR 格式:ROR DST,CNT 功能:循環(huán)右移,如圖(b)所示。 說明:同指令ROL。 (3)帶進(jìn)位循環(huán)左移指令 RCL 格式:RCL DST,CNT 功能:帶進(jìn)位循環(huán)左移,如圖(c)所示。 說明:同指令ROL。 (4)帶進(jìn)位循環(huán)右移指令 RCR 格式:RCR DST,CNT 功能:帶進(jìn)位循環(huán)右移,如圖(d)所示。 說明:同指令ROL。 【例4.12】在寄存器DX和AX中存放有32位無符號(hào)二進(jìn)制數(shù),試編寫程序,實(shí)現(xiàn)乘運(yùn)算。 解:由于是32位數(shù)據(jù),因此需要先對(duì)低16位左移,再對(duì)高16位帶進(jìn)位左移,重復(fù)兩遍,即乘4,程序如下: SHL AX, 1 RCL DX, 1
37、SHL AX, 1 RCL DX, 14.3.4 串操作類指令 在程序設(shè)計(jì)中經(jīng)常遇到成組數(shù)據(jù)處理,比如對(duì)一串字符進(jìn)行處理,可以是字節(jié)串,也可以是字串。所處理的字符長(zhǎng)度可達(dá)64KB字節(jié)。串操作指令隱含寄存器和標(biāo)志位的作用如表所示。串操作指令有5條,重復(fù)前綴有3條。表4.1 串指令的寄存器和標(biāo)志位作用寄存器作用SI源串變址寄存器,段地址在DS中(允許段超越前綴修改)DI目的串變址寄存器,段地址在ES中(不允許修改)CX重復(fù)執(zhí)行次數(shù)計(jì)數(shù)器AL/AXLODS指令目的操作數(shù),STOS指令的源操作數(shù)FLAGDFDF=0時(shí)SI、DI自動(dòng)增值(字節(jié)增1,字增2)DF=1時(shí) SI、DI自動(dòng)減值(字節(jié)減1,字減2
38、)ZF控制比較/掃描操作結(jié)果 1串傳送指令 MOVS 格式:MOVS DST,SRC MOVSB (字節(jié)) MOVSW (字) 功能:(DI)(SI) 字節(jié)操作:SI(SI)1,DI(DI)1 字操作:SI(SI)2,DI(DI)2 說明: 指令MOVS在操作數(shù)地址的前面用關(guān)鍵字BYTE/WORD PTR說明是字節(jié)傳送還是字傳送; 當(dāng)標(biāo)志位DF=0時(shí),地址遞增;DF=1時(shí),地址遞減; 2. 串比較指令CMPS 格式:CMPS SRC,DST CMPSB (字節(jié)) CMPSW (字) 功能:(SI)-(DI) 置狀態(tài)狀態(tài)標(biāo)志,不送結(jié)果 字節(jié)操作:SI(SI)1,DI(DI)1 字操作:SI(SI
39、)2,DI(DI)2 說明:同指令MOVS。 3.串掃描指令SCAS 格式:SCAS DST SCASB (字節(jié)) SCASW (字) 功能:用AL/AX中的數(shù)據(jù)減去DI指示的數(shù)據(jù),置狀態(tài)標(biāo)志,但不送結(jié)果。 字節(jié)操作:(AL)-(DI),DI(DI)1 字操作時(shí):(AX)-(DI),DI(DI)2 說明:同指令MOVS。 4. 串裝入指令 LODS 格式:LODS SRC LODSB (字節(jié)) LODSW (字) 功能:從SI指示的存儲(chǔ)器單元讀取數(shù)據(jù),送入AL/AX中。 字節(jié)操作:(AL)(SI),SI(SI)1 字 操 作:(AX)(SI),SI(SI)2 說明:同指令MOVS。 5. 串存
40、儲(chǔ)指令STOS 格式:STOS DST STOSB (字節(jié)) STOSW (字) 功能:把AL/AX中的數(shù)據(jù)傳送到DI指示的存儲(chǔ)器單元中。 字節(jié)操作:(DI)(AL),DI(DI)1 字操作時(shí):(DI)(AX),DI(DI)2 說明:同指令MOVS。 6. 串重復(fù)前綴指令 串重復(fù)前綴指令有三條,用來修飾串操作指令,使之重復(fù)執(zhí)行。 (1)重復(fù)前綴指令 格式:REP String primitive ;可作用于指令MOVS、LODS或STOS (2)相等時(shí)重復(fù)前綴指令 格式:REPE/REPZ String primitive ;可作用于指令CMPS或SCAS (3)不相等時(shí)重復(fù)前綴指令 格式:R
41、EPNE/REPNZ String primitive ;可作用于指令CMPS或SCAS 【例4.13】 若在主存TABLE起始的區(qū)域中存放有1K字節(jié)的數(shù)據(jù),試編程將該數(shù)據(jù)塊傳送到NEXT起始的區(qū)域中。 解:首先設(shè)置源/目操作數(shù)起始地址,然后使用重復(fù)傳送指令編程,程序如下: MOV AX,SEG TABLE ;SEG是取值運(yùn)算符,將TABLE標(biāo)號(hào)所在段的段地址送入累加器AX中 MOV DS,AX MOV AX,SEG NEXT MOV ES,AX MOV SI,OFFSET TABLE ;OFFSET是取值運(yùn)算符,將TABLE所在段的段內(nèi)偏移地址送入寄存器SI中 MOV DI,OFFSET N
42、EXT MOV CX,1024 CLD ;使DF=0 REP MOVSB控制轉(zhuǎn)移類指令 控制轉(zhuǎn)移指令有28條,分5種類型,主要用于控制程序的執(zhí)行流程。 1. 無條件轉(zhuǎn)移指令 可段內(nèi)轉(zhuǎn)移,也可以段間轉(zhuǎn)移,有4種尋址方式,詳見4.2.2 節(jié)。 格式:JMP OPR ;其中OPR為標(biāo)號(hào) 功能:段內(nèi)轉(zhuǎn)移 IPOPR偏移地址,CS不變 段間轉(zhuǎn)移 CSOPR段地址,IPOPR偏移地址 2. 條件轉(zhuǎn)移指令 以狀態(tài)標(biāo)志寄存器(PSW)相應(yīng)位的值為依據(jù),滿足條件則轉(zhuǎn)移,屬段內(nèi)短轉(zhuǎn)移,相對(duì)偏移量為-128+127字節(jié)。 (1)單標(biāo)志位轉(zhuǎn)移指令 JZ/JE OPR 功能:若ZF=1,結(jié)果為0,轉(zhuǎn)移到OPR處執(zhí)行程序
43、,否則順序執(zhí)行。 JNZ/JNE OPR 功能:若ZF=0,結(jié)果不為0,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JC OPR 功能:若CF=1,有進(jìn)位,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JNC OPR 功能:若CF=0,無進(jìn)位,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JO OPR 功能:若OF=1,有溢出,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JNO OPR 功能:若OF=0,無溢出,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JS OPR 功能:若SF=1,結(jié)果為負(fù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JNS OPR 功能:若SF=0,結(jié)果為正,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。
44、 JPE/JP OPR 功能:若PF=1,奇偶標(biāo)志為1,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JPO/JNP OPR 功能:若PF=0,奇偶標(biāo)志為0,轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 (2)無符號(hào)數(shù)比較轉(zhuǎn)移指令 JA/JNBE OPR 功能:若CF=0或ZF=0,被減數(shù)高于減數(shù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JNA/JBE OPR 功能:若CF=1或ZF=1,被減數(shù)低于或等于減數(shù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JNAE/JB OPR 功能:若CF=1,被減數(shù)低于減數(shù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JAE/JNB OPR 功能:若CF=0,被減數(shù)不低于減數(shù),
45、轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 (3)帶符號(hào)數(shù)比較轉(zhuǎn)移指令 JL/JNGE OPR 功能:若SFOF=1,被減數(shù)小于減數(shù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JNL/JGE OPR 功能:若SFOF=0,被減數(shù)大于或等于減數(shù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JLE/JNG OPR 功能:若ZF=1或SFOF=1,被減數(shù)小于或等于減數(shù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 JNLE/JG OPR 功能:若ZF=0且SFOF=0,被減數(shù)大于減數(shù),轉(zhuǎn)移到OPR處執(zhí)行程序,否則順序執(zhí)行。 2. 循環(huán)控制指令 控制程序的重復(fù)執(zhí)行,以CX中的值或CX與ZF標(biāo)志位的值結(jié)合,作為轉(zhuǎn)移條件
46、,屬段內(nèi)短轉(zhuǎn)移,相對(duì)偏移量為-128+127字節(jié)。 (1)循環(huán)指令 格式:LOOP OPR 功能:CX(CX)1,測(cè)試(CX)0,轉(zhuǎn)移到標(biāo)號(hào)處繼續(xù)循環(huán),否則退出循環(huán)。 (2)相等或?yàn)?時(shí)轉(zhuǎn)移 格式:LOOPZ/LOOPE OPR 功能:CX(CX)1,測(cè)試(CX)0且ZF=1,轉(zhuǎn)移到標(biāo)號(hào)處繼續(xù)循環(huán),否則退出循環(huán)。 (3)不相等或不為0時(shí)轉(zhuǎn)移 格式:LOOPNZ/LOOPNE OPR 功能:CX(CX)1,測(cè)試(CX)0且ZF=0,轉(zhuǎn)移到標(biāo)號(hào)處繼續(xù)循環(huán),否則退出循環(huán)。 (4)測(cè)試轉(zhuǎn)移指令 格式:JCXZ OPR 功能:測(cè)試(CX)=0,轉(zhuǎn)移到標(biāo)號(hào)處繼續(xù)循環(huán),否則順序執(zhí)行。 【例4.14】 編寫程
47、序,求1+2+3+100的累加和,結(jié)果保存在AX寄存器中。 解:采用循環(huán)累加的方法編程,程序如下: MOV AX,0 MOV CX,100 LP: ADD AX,CX LOOP LP 3. 子程序調(diào)用與返回指令 子程序通過指令CALL調(diào)用,執(zhí)行完后,通過指令RET返回,有種尋址方式,可以段內(nèi)調(diào)用,也可以段間調(diào)用。 (1)子程序調(diào)用指令 格式:CALL DST ;其中DST為子程序名(也稱為過程名)。 功能: 段內(nèi)調(diào)用 SP(SP)2 (SP)+1,(SP)(IP) ;返回地址壓棧 IPDST偏移地址 段間調(diào)用 SP(SP)2 (SP)+1,(SP)(CS) ;返回段地址壓棧 SP(SP)2 (
48、SP)+1,(SP)(IP) ;返回偏移地址壓棧 IPDST偏移地址 CSDST段地址 (2)子程序返回指令 RET 作為子程序的最后一條指令,從堆棧中彈出斷點(diǎn)地址,裝入IP或IP與CS中,即返回到主程序的斷點(diǎn)處。若帶參數(shù)(指令RET N),使堆棧指針SP移動(dòng)N個(gè)偶數(shù)字節(jié)單元。 格式:RET 或 RET N ;其中N是一個(gè)整型表達(dá)式 功能: 段內(nèi)返回 IP(SP)+1,(SP) SP(SP)+2 帶參數(shù)返回時(shí)還要再執(zhí)行下面的一步操作 SP(SP)+N 段間返回 IP(SP)+1,(SP) SP(SP)+2 CS(SP)+1,(SP) SP(SP)+2 帶參數(shù)返回時(shí)還要再執(zhí)行下面的一步操作 SP
49、(SP)+N4. 中斷指令 (1)中斷指令I(lǐng)NT 格式:INT OPR 功能:SP(SP)2 (SP)+1,(SP)PSW SP(SP)2 (SP)+1,(SP)(CS) SP(SP)2 (SP)+1,(SP)(IP) IP(OPR4) CS(OPR4+2) 其中OPR為中斷類型碼,其值在0255范圍內(nèi)。 (2)溢出中斷指令I(lǐng)NTO 格式:INTO 功能:PSW、CS、IP壓棧 IP(10H) CS(12H) (3)中斷返回指令I(lǐng)RET 格式:IRET 功能:IP(SP)+1,(SP) SP(SP)+2 CS(SP)+1,(SP) SP(SP)+2 PSW(SP)+1,(SP) SP(SP)+
50、2 指令I(lǐng)NT和INTO只影響控制標(biāo)志IF和TF,使IF=TF=0,不影響其余標(biāo)志位;中斷返回指令I(lǐng)RET影響所有標(biāo)志位。4.3.6 處理器控制類指令 處理器控制指令只完成簡(jiǎn)單的控制功能,指令中不設(shè)地址碼,共有12條,分為兩類,其中標(biāo)志類指令影響相應(yīng)狀態(tài)標(biāo)志位外,其余指令不影響狀態(tài)標(biāo)志位,如表所示。指令類型助記符格式功能說明標(biāo)志操作指令STD方向標(biāo)志置1 (地址減量) DF=1 CLD方向標(biāo)志清0 (地址增量) DF=0 STC進(jìn)位標(biāo)志置1 CF=1 CLC進(jìn)位標(biāo)志清0 CF=0 CMC進(jìn)位標(biāo)志取反 CF=CF STI中斷允許標(biāo)志置1(開中斷) IF=1 CLI中斷允許標(biāo)志清0(關(guān)中斷) IF
51、=0 系統(tǒng)控制指令ESC換碼,向外處理機(jī)提供數(shù)據(jù) HLT處理器暫停,直到出現(xiàn)中斷復(fù)位信號(hào) NOP空操作,占有一個(gè)字節(jié),不執(zhí)行任何操作 LOCK總線鎖定 WAIT等待狀態(tài),定期檢查TEST信號(hào) 表4.2 處理器控制指令4.4 匯編語言程序格式與常用偽指令 匯編語言有約定的書寫格式,這就要求讀者在編程時(shí),嚴(yán)格遵循約定CLC的格式,合理使用偽指令和宏。 4.4.1 匯編語言程序格式 4.4.2 常量、變量、表達(dá)式與運(yùn)算符 4.4.3 常用偽指令 4.4.4 宏指令 4.4.5 條件匯編 4.4.6 保護(hù)方式編程指令4.4.1 匯編語言程序格式1匯編語言程序格式 一個(gè)完整的匯編語言程序往往需要分成若干
52、段來書寫。一般情況下,格式如下: NAME1 SEGMENT 語句1 NAME1 ENDS NAME2 SEGMENT 語句 NAME2 ENDS END 標(biāo)號(hào) 其中,NAME1,NAME2分別為段名,由段定義偽指令 SEGMENT/ENDS來說明,最后的END是程序結(jié)束偽指令。 任何一個(gè)匯編語言源程序必須有一個(gè)邏輯代碼段和一條指示源程序結(jié)束的偽指令END。堆棧段、數(shù)據(jù)段和附加段可根據(jù)程序的需要選用。2匯編語言語句格式 在匯編語言程序中,指令又稱為語句。在一個(gè)程序中,除述指令外,通常還有一些偽指令。下面對(duì)8086匯編語言中的3種基本語句予以介紹 (1)指令語句 在8086指令系統(tǒng)中,一條指令就
53、是一條語句,書寫格式如下: 標(biāo)號(hào): 操作碼 操作數(shù) ;注釋 各字段之間用空格隔開,兩個(gè)操作數(shù)之間用逗號(hào)隔開,方括號(hào)表示可選項(xiàng)。 標(biāo)號(hào):是由字母開頭的字符串組成,以冒號(hào)“:”結(jié)束,表示一條指令的符號(hào)地址。標(biāo)號(hào)最長(zhǎng)31個(gè)字符,由字母AZ、數(shù)字09和一些特殊字符?、.、_、$組成。但是數(shù)字不能作為標(biāo)號(hào)的第一個(gè)字符,圓點(diǎn)僅能用作標(biāo)號(hào)第一個(gè)字符。 助記符:表示操作性質(zhì)的指令,如果帶有前綴,用空格分開。 操作數(shù):指令操作的對(duì)象,按指令要求,可能有一個(gè)、兩個(gè)或者沒有。操作數(shù)有兩個(gè)時(shí)用逗號(hào)“,”分開。操作數(shù)可以是常數(shù)、寄存器名、標(biāo)號(hào)、變量或表達(dá)式等。 注釋:以分號(hào)“;”開頭,是對(duì)語句或程序的說明,僅在源程序清
54、單中列出,不作其它處理。 (2)偽指令語句 是一種說明性的語句,用來對(duì)匯編過程進(jìn)行控制,比如對(duì)數(shù)據(jù)列表、存儲(chǔ)空間分配、程序起始地址及段定義等,匯編時(shí)不生成目標(biāo)代碼。偽指令語句格式如下: 符號(hào)名 偽指令 參數(shù) ;注釋 符號(hào)名:同標(biāo)號(hào),但是后面沒有冒號(hào)“:”,在不同的偽指令語句中,符號(hào)名可以是常量名、變量名、過程名、段名、結(jié)構(gòu)名、記錄名等。 偽指令:是要求匯編程序完成具體操作的命令,比如數(shù)據(jù)定義偽指DB、DW、DD等,段定義偽指令SEGMENT和ENDS等。 參數(shù):是對(duì)匯編過程的進(jìn)一步說明,可以是常量、變量、標(biāo)號(hào)、過程名、結(jié)構(gòu)名、記錄名或一些專用符號(hào),比如BYTE、FAR等;參數(shù)的個(gè)數(shù)由偽指令確定
55、。 注釋:與指令語句中的注釋相同。 (3)宏指令語句 宏指令是將程序中多次使用的程序段定義為一條指令,即宏指令。在對(duì)宏指令匯編時(shí),以原程序代碼取代宏指令。宏指令格式如下: 標(biāo)號(hào): 宏指令名 參數(shù)1 ,參數(shù)2 , ;注釋 4.4.2 常量、變量、表達(dá)式與運(yùn)算符 在匯編語言程序中,數(shù)據(jù)的表示形式大體上分為兩種類型,即常量與變量。用運(yùn)算符把常量或變量連接起來的式子,稱為表達(dá)式。表達(dá)式也可作為語句中的操作數(shù)。 1常量 在匯編語言程序中保持不變的量稱為常量,有兩種,即數(shù)字常量與字符串常量。 (1)數(shù)字常量 數(shù)字常量有多種,即二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制等常量。例如: 10011001B,274Q,2
56、89D和0B2E4H等。 (2)字符串常量 字符串常量是用單引號(hào)括起來的一個(gè)或多個(gè)字符,在存儲(chǔ)器中以ASCII碼的形式存儲(chǔ),比如A,存儲(chǔ)為41H,0123存儲(chǔ)為30H,31H,32H,33H。 2變量 變量代表存放在某存儲(chǔ)單元中的數(shù)據(jù),在程序運(yùn)行期間可以改變,常以變量名的形式出現(xiàn)在程序中。變量名是在程序中建立起來、可認(rèn)為是存放數(shù)據(jù)的存儲(chǔ)單元的符號(hào)地址。變量名的取名規(guī)則與標(biāo)號(hào)相同。例如SUM、PORT_VAL、NEXT、LOP1等。變量必須在使用之前定義,一般在數(shù)據(jù)段中進(jìn)行。 【例4.15】定義三個(gè)變量DATA1、DATA2、DATA3。 解:在程序中的數(shù)據(jù)段定義,語句如下: DATA SEGM
57、ENT DATA1 DB 12H DATA2 DW 1234H DATA3 DD 12345678H DATA ENDS (1)變量的屬性 經(jīng)過定義后的變量有三種屬性,即段屬性、偏移量屬性和類型屬性。即變量所在段的段基值、距段起始地址的偏移地址、變量占用存儲(chǔ)器單元的字節(jié)數(shù)。 (2)變量的定義 變量必須在使用之前定義,由匯編語言提供的偽指令來實(shí)現(xiàn)的,即為變量分配存儲(chǔ)器單元,預(yù)置初值,常用的偽指令有DB、DW、DD、DQ、DT等。其格式如下: 變量名 偽指令名 表達(dá)式 ;定義一個(gè)數(shù)據(jù)存儲(chǔ)區(qū) 表達(dá)式可以是數(shù)值表達(dá)式、地址表達(dá)式、字符串、?、或 N DUP(表達(dá)式),也可以有多個(gè)。 數(shù)值表達(dá)式:為變量
58、定義數(shù)值數(shù)據(jù)。例如偽指令: SUM DB 45,89H,10010101B NUMBER DW 4576H,1,128 TOTAL DD 7897AFE2H,4567H 數(shù)據(jù)存放時(shí),低字節(jié)存放在低地址單元中,高字節(jié)存放在高地址單元中。 地址表達(dá)式:為變量定義存儲(chǔ)器地址。只能使用DW和DD定義。其中DW變量的偏移地址,而DD定義變量的偏移地址和段地址。例如: ADDR1 DW OFFSET SUM ;取偏移地址 ADDR2 DD NUMBER ;定義偏移地址和段地址 字符串:可作為表達(dá)式使用,存放字符的ASCII碼值。例如偽指令:XYZ DB ABCD ;按字節(jié)依次存儲(chǔ)A、B、C、D的ASCII
59、碼值 DATA DW CD,76 ;按字依次存放CD和76的ASCII碼值 N DUP(表達(dá)式):可以復(fù)制某個(gè)(或某些)操作數(shù),也可以嵌套。 例如偽指令: DATA1 DB 2 DUP(4, 3 DUP(1),30H) DATA2 DB 3 DUP(?) (3)變量的使用 經(jīng)過DB,DW、DD等偽指令定義后可使用,即直接引用它的變量名。 【例4.16】 數(shù)值變量的引用。 解:首先定義變量,然后引用,程序如下: DA1 DB 0FFH DA2 DW 2345H MOV AL,DA1 ;使用前面定義的變量DA1 MOV BX,DA2 ;使用前面定義的變量DA2 【例4.17】 地址變量的引用。 解
60、:引用變量名,取其偏移量,程序如下: DA3 DB 10H DUP(0) DA4 DW 20H DUP(1) MOV DA3SI,AL MOV DX,DA4BXDI 3表達(dá)式與運(yùn)算符 表達(dá)式是用運(yùn)算符或操作符把常量、變量、標(biāo)號(hào)等連接起來而構(gòu)成的式子,在程序匯編的過程中確定。在8086匯編語言中主要有三類型的運(yùn)算符和兩類操作符。其中運(yùn)算符有算術(shù)運(yùn)算符、邏輯運(yùn)算符和關(guān)系運(yùn)算符;操作符有數(shù)值返回操作符和屬性操作符。 (1)算術(shù)運(yùn)算符 算術(shù)運(yùn)算符如表所示。 +、-:?jiǎn)文窟\(yùn)算符,表示數(shù)的正負(fù)。 、*、/ 、MOD:加、減、乘、除,其操作數(shù)與運(yùn)算結(jié)果均為整數(shù);除法運(yùn)算結(jié)果只取商的整數(shù)部分;減法運(yùn)算符用于變
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年中粘煤項(xiàng)目投資申請(qǐng)報(bào)告代可行性研究報(bào)告
- 2024年數(shù)字單向動(dòng)力三軸儀項(xiàng)目資金申請(qǐng)報(bào)告代可行性研究報(bào)告
- 清工包干合同模板
- 特種車租車合同模板
- 公司招聘學(xué)徒合同模板
- 協(xié)信合同模板
- 長(zhǎng)期租賃車位合同模板
- 商鋪出讓合同模板
- 2023年福建省公務(wù)員錄用考試《行測(cè)》答案解析
- 暗股協(xié)議合同模板
- 地球-我們的家園課件
- 2023年執(zhí)業(yè)藥師繼續(xù)教育考試題庫與答案(通用版)
- 紀(jì)委遴選筆試真題
- 世界外國(guó)語小學(xué)英語教材kids-story-1B
- 零售藥店的培訓(xùn)記錄培訓(xùn)計(jì)劃培訓(xùn)試題及答案
- 企業(yè)移交清單模板(基礎(chǔ)版)
- 日語學(xué)習(xí)興趣小組課件
- 體外循環(huán)下二尖瓣置換術(shù)的麻醉討論課件
- 山東省濟(jì)南市歷城二中2022-2023學(xué)年高二上學(xué)期期中考試語文試題 word版含答案
- 北師大版高中數(shù)學(xué)選修4-6初等數(shù)論初步全套課件
- 三甲級(jí)綜合醫(yī)院全科室崗位說明書匯編(專業(yè)完整模板)
評(píng)論
0/150
提交評(píng)論