版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
3.1概述3.280X86的尋址方式3.3指令格式3.480X86指令系統(tǒng)習(xí)題與思考題第3章80X86尋址方式和指令系統(tǒng)
3.1概述計算機的工作就是運行程序,而程序由存儲在存儲器中的指令序列構(gòu)成。機器語言指令由二進制代碼組成。指令語句一般由操作碼(OC)和操作數(shù)(OD)兩部分組成,指令的一般格式如下:操作碼由便于記憶的助記符表示,操作碼表示計算機執(zhí)行什么操作;操作數(shù)可能指明了參與操作的數(shù)本身,或規(guī)定了操作數(shù)的地址。
8086/8088系統(tǒng)中一條指令的操作數(shù)可以是雙操作數(shù)(源操作數(shù)和目的操作數(shù)),也可以是單操作數(shù),有的指令還可以沒有操作數(shù)或隱含操作數(shù)。80386/80486系統(tǒng)中的指令則有多個操作數(shù)。操作數(shù)主要分為三類:立即數(shù):立即數(shù)即常數(shù),是一個固定數(shù)值的操作數(shù)寄存器:寄存器操作數(shù)存放在CPU的某個寄存器中存儲器操作數(shù):存儲器操作數(shù)則存放在內(nèi)存的數(shù)據(jù)區(qū)中。
3.280X86的尋址方式在80X86系統(tǒng)中,尋址方式通常分為兩種:一種為尋找操作數(shù)的地址,稱為數(shù)據(jù)尋址;使用MOV指令來描述數(shù)據(jù)尋址模式,它可實現(xiàn)在寄存器之間,寄存器與存儲器之間操作數(shù)的傳送。一種為尋找要執(zhí)行的下一條指令的地址,即程序轉(zhuǎn)移或子程序調(diào)用時的目的地址或入口地址,稱為程序轉(zhuǎn)移地址尋址方式。使用JUMP及CALL指令表明了怎樣更改程序流程。3.2.1數(shù)據(jù)的尋址方式數(shù)據(jù)的尋址方式一般針對源操作數(shù)而言,以通用傳送指令MOVDST,SRC為例:SRC為源操作數(shù),指令執(zhí)行過程中原值保持不變;DST為目的操作數(shù),原值不保留,MOV指令完成從源操作數(shù)向目的操作數(shù)拷貝數(shù)據(jù)的功能。1.立即尋址(ImmediateAddressing)
操作數(shù)包含在指令碼中,由指令給出。立即操作數(shù)可以是常數(shù),如果操作數(shù)以字母開頭,匯編程序要求操作數(shù)在其前加0。例如:在匯編語言中以0A2H描述操作數(shù)A2H。
ASCII碼字符也可用于描述立即數(shù),例如:MOVAH,‘B’指令將ASCII碼B所對應(yīng)的數(shù)據(jù)42H放入寄存器AH中。立即尋址通常用于給寄存器賦值,并且只適用于源操作數(shù)字段,不能用于目的操作數(shù)字段,要求源操作數(shù)與目的操作數(shù)長度一致。立即數(shù)可以是8位或16位的。在80386及其后繼機型中,立即數(shù)也可是32位操作數(shù)?!纠?.1】MOVAL,100指令執(zhí)行后,(AL)=64H【例3.2】MOVCL,01001100B指令執(zhí)行后,(CL)=4CH【例3.3】MOVAX,1234H指令執(zhí)行后,(AX)=1234H,其中(AH)=12H,(AL)=34H。
立即數(shù)如果是多字節(jié)數(shù),則高位字節(jié)存放在高地址中,低位字節(jié)存放在低地址中,如下圖所示。2.寄存器尋址(RegisterAddressing)
指令指定寄存器號,操作數(shù)存放在指令規(guī)定的CPU內(nèi)部寄存器中??捎糜诩拇嫫鲗ぶ返臑橥ㄓ眉拇嫫?。在微處理器中,對于8位操作數(shù),寄存器可以是AH、AL、BH、BL、CH、CL、DH和DL;對于16位操作數(shù),寄存器可以是AX、BX、CX、DX、SP、BP、SI和DI。在80386及其后繼機型中,對于32位操作數(shù),32位寄存器包括EAX、EBX、ECX、EDX、ESP、EBP、EDI和ESI。在使用寄存器尋址方式時,MOV、PUSH和POP指令也會使用到16位寄存器CS、ES、DS、SS、FS和GS。這些寄存器在指令中,使用的寄存器類型要匹配,8位和16位,16位和32位及8位和32位寄存器是不能混用的。有些指令可除外,如:SHLAX,CL。寄存器尋址不需要訪問存儲器,也不需要使用總線周期,操作在CPU內(nèi)部進行,因而可取得較高的運算速度。【例3.4】MOVAX,BX
指令執(zhí)行前,(AX)?=?5678H,(BX)?=?1234H;指令執(zhí)行后,(AX)?=?1234H,(BX)?=?1234H。除上述兩種尋址方式外,以下各種尋址方式的操作數(shù)均在代碼段以外的存儲區(qū)中,尋址方式通過不同的途徑求得操作數(shù)的偏移地址,即有效地址EA。3.直接尋址(DirectAddressing)
直接尋址由指令直接給出操作數(shù)的有效地址EA,操作數(shù)本身在存儲單元中,通常存放在數(shù)據(jù)段,默認的段寄存器為DS。操作數(shù)有效地址格式為:[數(shù)值]或符號或[符號]【例3.5】MOVAX,[2040H]
指令執(zhí)行情況如圖3.2所示。執(zhí)行結(jié)果為:(AX)?=?6A4BH在匯編語言指令中可以用符號地址代替數(shù)值地址?!纠?.6】MOVAX,[TABLE];或MOVAX,TABLE;這兩者等價,此處TABLE為存放操作數(shù)單元的符號地址。如果要對其他段寄存器所指出的存儲區(qū)進行直接尋址,則在指令前必須用前綴指出段寄存器名?!纠?.7】MOVAX,ES:[2000H];將ES段的2000H和2001H兩單元的內(nèi)容傳送到AX中。4.寄存器間接尋址(RegisterIndirectAddressing)
操作數(shù)的有效地址存放在基址寄存器或變址寄存器中,而操作數(shù)則在存儲器中。對16位數(shù)進行寄存器間接尋址時可用的寄存器是基址寄存器BX、BP和變址寄存器SI、DI。使用BP時默認的段寄存器為SS,使用其他寄存器默認的段寄存器為DS。在32位尋址時8個32位通用寄存器均可用。操作數(shù)有效地址格式為:[間接尋址的寄存器]。尋址寄存器放在方括號中。【例3.8】MOVBX,[BP]指令執(zhí)行前,(BP)?=?4000H,指令執(zhí)行情況如圖3.3所示。執(zhí)行結(jié)果為:(BX)?=?50A0H。【例3.9】MOVAX,ES:[SI];寄存器間接尋址方式可用于表格處理,執(zhí)行完一條指令后,只需修改寄存器的內(nèi)容就可以取出表格中的下一項。5.寄存器相對尋址(RegisterRelativeAddressing)
操作數(shù)的有效地址為指令中規(guī)定的間接尋址寄存器的內(nèi)容和指令中指定的位移量之和。操作數(shù)存放在存儲器中。操作數(shù)有效地址格式為:位移量[間接尋址的寄存器]或[位移量
+?間接尋址的寄存器]
參與尋址的寄存器要加方括號。在32位尋址時,8個32位通用寄存器均可用。16位尋址時,可用的寄存器仍為BX、BP、SI和DI。【例3.10】MOVAX,TAB[SI]如果TAB為16位的符號地址,其值為3080H,(SI)=?2000H,默認的段寄存器為DS,則EA?=?TAB?+?(SI)?=?3080H?+?2000H?=?5080H指令執(zhí)行情況如下圖所示。執(zhí)行結(jié)果為(AX)?=?1234H。這種尋址方式可用于表格處理或訪問一維數(shù)組中的元素。把表格的首地址設(shè)置為位移量,利用修改間接寄存器的值來存取表格中的任意一個元素。表3.2寄存器相對尋址示例6.基址變址尋址(BasedIndexedAddressing)
操作數(shù)的有效地址是一個基址寄存器和變址寄存器的內(nèi)容之和,操作數(shù)本身在存儲單元中。操作數(shù)有效地址格式為:[基址寄存器][變址寄存器]。寄存器要放在方括號中。在32位尋址時,8個32位通用寄存器均可用?!纠?.11】MOVAX,[BX][SI]如果(BX)?=?0200H,(SI)?=?0010H,(DS)?=?3000H,則:EA=(BX)+(SI)=0200H+0010H=0210H
物理地址=(DS)×10H+EA=3000H×10H+0210H?=?30210H
若30210H和30211H中分別存放的數(shù)值為56H、78H,則指令執(zhí)行結(jié)果(AX)?=?7856H。
這種尋址方式同樣適用于數(shù)組或表格處理,首地址存放在基址寄存器中,變址寄存器訪問數(shù)組中各元素。因兩個寄存器都可以修改,所以它比寄存器相對尋址方式更靈活。
注意:兩個寄存器不能均為基址寄存器,也不能均為變址寄存器。7.相對基址變址尋址(RelativeBasedIndexedAddressing)
操作數(shù)的有效地址為指令中規(guī)定的1個基址寄存器和1個變址寄存器的內(nèi)容及指令中指定的位移量三者之和。操作數(shù)本身在存儲單元中。操作數(shù)有效地址格式為:
位移量[基址寄存器][變址寄存器]
尋址寄存器要放在方括號中。在32位尋址時,8個32位通用寄存器均可用?!纠?.12】MOVAX,TAB[BX][SI]如果(BX)?=?1000H,(SI)?=?2000H,TAB?=?0150H則EA?=?(BX)?+?(SI)?+TAB?=?3150H指令執(zhí)行情況如圖3.5所示。執(zhí)行結(jié)果為(AX)?=?1234H。這種尋址方式通常用于對二維數(shù)組的訪問。位移量為數(shù)組起始地址?;芳拇嫫骱妥冎芳拇嫫鞣謩e存放行和列的值,利用相對基址變址尋址就可以直接訪問二維數(shù)組中指定的某個元素。表3.3相對基址變址尋址示例8.隱含尋址(ConcealedAddressing)
有些指令的指令碼中不包含指明操作數(shù)地址的部分,而其操作碼本身隱含地指明了操作數(shù)的地址。如:LODSB;表示SI的內(nèi)容送到AL,SI指針加1。以上的數(shù)據(jù)尋址方式同樣適用于與存儲器單元統(tǒng)一編址的I/O端口,一個I/O口地址就是一個存儲單元地址。對I/O端口的訪問只能用存儲器訪問指令。如果I/O端口是按照獨立的I/O空間編址的,則I/O口和存儲器單元各有自己的地址,可以使用不同的指令,對I/O端口的尋址有以下兩種方式。(1)直接端口尋址方式。端口地址用8位地址碼表示,在指令碼中。格式如下:INAL(AXorEAX),port8;
OUTport8,AL(AXorEAX)
如:INAL,21H。這條指令表示從I/O地址為21H的端口中讀取數(shù)據(jù)到AL中。(2)間接端口尋址方式。端口地址為16位,并規(guī)定存放在寄存器DX中。格式如下:INAL(AXorEAX),DX;
OUTDX,AL(AXorEAX)DX中是16位端口地址,范圍為0000H~FFFFH。如:INAL,DX。這條指令表示從DX寄存器內(nèi)容所指定的端口中讀取數(shù)據(jù)到AL中。9.比例變址尋址(ScaledIndexedAddressing)
該尋址方式和后面2種尋址方式中均涉及到比例因子,這些是80386及其后繼機型中特有的尋址方式,8086/8088不支持這幾種尋址方式。
比例變址尋址使用1個變址寄存器的內(nèi)容乘以比例因子與位移量之和來訪問存儲器。在32位尋址時,在不加段超越前綴時,除ESP以外的任何32位通用寄存器均可作為變址寄存器。操作數(shù)有效地址格式為位移量
[變址寄存器?*?比例因子]或[位移量
+?變址寄存器?*?比例因子]
可以表示成多種形式組合。尋址寄存器要放在方括號中。比例因子可取1、2、4或8,分別對應(yīng)存儲序列元素的大小為1、2、4或8個字節(jié)。當(dāng)比例因子為1時將被隱含。【例3.13】MOVEAX,ARRAY[4*EBX]
有效地址EA?=?ARRAY?+?4*EBX,將DS:EA中雙字的內(nèi)容送入EAX中。10.基址比例變址尋址(BasedScaledIndexedAddressing)
基址比例變址尋址使用2個32位寄存器來訪問存儲器(1個基址寄存器和1個變址寄存器)。操作數(shù)有效地址格式為[基址寄存器][變址寄存器?*?比例因子]或[基址寄存器
+?變址寄存器?*?比例因子]
可以表示成多種形式組合。尋址寄存器要放在方括號中。在不加段超越前綴時,除EBP、ESP是默認SS為段選擇器外,其余6個通用寄存器均以DS為默認段選擇器。操作數(shù)的有效地址為變址寄存器的內(nèi)容乘以比例因子與基址寄存器之和。同樣,比例因子可取1、2、4或8,分別對應(yīng)存儲序列元素的大小為1、2、4或8個字節(jié)?!纠?.14】MOVAX,[EBX?+?4*ECX]
有效地址EA?=EBX+?4*ECX,將DS:EA中字的內(nèi)容送入AX中。11.相對基址比例變址尋址
相對基址比例變址尋址操作數(shù)的有效地址為變址寄存器的內(nèi)容乘以比例因子、基址寄存器的內(nèi)容、位移量三者之和。操作數(shù)有效地址格式為位移量[基址寄存器][變址寄存器?*?比例因子]或[位移量
+?基址寄存器
+?變址寄存器?*?比例因子]
可以表示成多種形式組合。尋址寄存器要放在方括號中。它所允許使用的寄存器和比例因子同上?!纠?.15】MOVAL,ARRAY[EBP?+?2*EDI]
有效地址EA?=ARRAY?+?EBP?+?2*EDI,將SS:EA中字節(jié)的內(nèi)容送入AL中。3.2.2程序轉(zhuǎn)移地址尋址方式程序執(zhí)行順序是由CS和IP的內(nèi)容來決定的。程序轉(zhuǎn)移及調(diào)用指令通過改變IP和CS內(nèi)容,就可改變程序執(zhí)行順序。根據(jù)程序轉(zhuǎn)移地址相對于當(dāng)前程序地址的關(guān)系,可分為段內(nèi)、段外。又根據(jù)轉(zhuǎn)移地址是否直接出現(xiàn)在指令中,分為直接、間接。所以有四種程序轉(zhuǎn)移尋址方式:段內(nèi)直接尋址、段內(nèi)間接尋址、段間直接尋址及段間間接尋址。1.段內(nèi)直接尋址(IntrasegmentDirectAddressing)
段內(nèi)直接尋址方式也稱為相對尋址方式。指令碼中包括一個位移量disp,轉(zhuǎn)移的有效地址為:EA?=?(IP)?+?disp。位移量在指令碼中是用補碼形式表示的8位或16位有符號數(shù)。當(dāng)位移量是8位時,稱為短程轉(zhuǎn)移;當(dāng)位移量是16位時,稱為近程轉(zhuǎn)移。指令的匯編語言格式為JMPSHORT
符號地址JMPNEARPTR
符號地址
【例3.16】請看下列程序段中的jmpshortnext指令執(zhí)行情況。地址機器碼
5B1B:00172BC3 subax,bx
5B1B:0019B80000movax,0
5B1B:001CEB03 jmp
0021;等效為jmp
shortnext,轉(zhuǎn)移到標(biāo)號next處
5B1B:001E03C3 addax,bx
5B1B:002041 inccx
5B1B:002150 next:?pushax
5B1B:0022BE0200mov
si,25B1B:001CEB03 jmp0021;等效為jmpshortnext,轉(zhuǎn)移到標(biāo)號next處5B1B:001E03C3 addax,bx5B1B:002041 inccx
5B1B:002150next:?pushax
本例中,jmpnext指令的當(dāng)前(IP)=001EH,相對偏移量為03H,EA=001EH+03H=0021H,因此指令跳轉(zhuǎn)到0021H處執(zhí)行指令。段內(nèi)直接尋址過程如下圖所示。對于386及其后繼機型中,代碼段的有效地址存放在EIP中,位移量為8位或32位。2.段內(nèi)間接尋址(IntrasegmentIndirectAddressing)
程序轉(zhuǎn)移的有效地址是一個寄存器或存儲單元的內(nèi)容。這個寄存器或存儲單元的內(nèi)容可以用數(shù)據(jù)尋址方式中除立即數(shù)以外的任何一種尋址方式獲得,所得到的有效地址用來取代IP寄存器的內(nèi)容。指令的匯編語言格式為JMP寄存器JMP存儲單元由于以上兩種尋址方式僅修改IP的內(nèi)容,?所以這種尋址方式只能在段內(nèi)進行程序轉(zhuǎn)移?!纠?.17】JMPBX如果(BX)?=?1020H,則指令執(zhí)行后(IP)?=?1020H【例3.18】JMPTABLE[BX][SI]如果(DS)?=
2000H,(BX)?=?1020H,(SI)?=?0002H,TABLE?=?0010H,(21032H)?=?1234H,指令執(zhí)行后EA=(BX)+(SI)+TABLE
=1020H+0002H+0010H=1032H則:(DS)×10H+EA=2000H×10H+1032H=21032H所以(IP)=1234H寄存器尋址相對基址變址尋址2000H:1032H34H12H對于386及其后繼機型,除16位尋址方式外,還可使用32位尋址方式,修改EIP的內(nèi)容?!纠?.19】JMPEBX如果(EBX)?=?20001002H,則指令執(zhí)行后(EIP)?=?20001002H3.段間直接尋址(IntersegmentDirectAddressing)
指令中直接給出程序轉(zhuǎn)移的代碼段地址和偏移地址來取代當(dāng)前的CS和IP。指令的匯編語言格式為:JMPFARPTR
符號地址;其中FARPTR表示段間轉(zhuǎn)移的操作符。
【例3.20】請看下列程序段中的jmpfarptrnext指令執(zhí)行情況。
地址機器碼 代碼段1
5B16:00172BC3 subax,bx
5B16:0019B80000 movax,0
5B16:001CEA24001B5B jmp
5B1B:0024
;等效為jmp
farptr
next
5B16:002103C3 addax,bx
地址機器碼 代碼段2
5B1B:0024 ?50 next:pushax
5B1B:0025BE0200 mov
si,2本例中,jmpfarptr
next指令等價于jmp5B1B:0024,執(zhí)行該指令,程序跳轉(zhuǎn)到代碼段2,(CS)?=?5B1BH,(IP)?=?0024H。段間直接尋址過程如圖3.7所示。next:pushax對于386及其后繼機型,段間轉(zhuǎn)移應(yīng)修改CS和EIP的內(nèi)容,方法與16位尋址方式相同。4.段間間接尋址(IntersegmentIndirectAddressing)
程序轉(zhuǎn)移的有效地址是一個存儲單元中連續(xù)4個字節(jié)的內(nèi)容。這個存儲單元的內(nèi)容可以用數(shù)據(jù)尋址方式中除立即數(shù)和寄存器方式以外的任何一種尋址方式獲得。將所尋址的存儲單元前2個字節(jié)內(nèi)容送IP,后2個字節(jié)內(nèi)容送CS。指令的匯編語言格式為:JMPDWORDPTR存儲單元?!纠?.21】JMPDWORDPTR[BX]
如果(BX)?=?1034H,且從1034H開始的連續(xù)4個存儲單元內(nèi)容分別為12H、34H、56H、78H,則指令執(zhí)行后(IP)=1234H,(CS)=5678H。該指令的段間間接尋址過程如圖3.8所示。對于386及其后繼機型,除16位尋址方式外,還可使用32位尋址方式,方法與16位尋址方式相同。
3.3指令格式
本節(jié)將介紹助記符指令格式和指令編碼格式,并了解助記符指令是如何翻譯成機器碼的,即了解編譯程序的工作。轉(zhuǎn)至3.480X86指令系統(tǒng)3.3.1助記符指令格式匯編語言源程序中助記符指令書寫的基本格式為
(標(biāo)號):(前綴指令)操作碼(操作數(shù));(注釋)標(biāo)號代表某條指令所存單元的符號地址。后邊要加上冒號“:”。標(biāo)號為程序轉(zhuǎn)移、循環(huán)提供了轉(zhuǎn)移目標(biāo)地址。標(biāo)號由字母、數(shù)字(0,…,9)及特殊符號(?,·,@,-,$)組成,且通常以字母開頭。字符總數(shù)必須不大于31個。不允許使用保留字(關(guān)鍵字)。前綴指令與操作碼、操作碼與操作數(shù)之間必須以空格分開。有時在操作碼前面加前綴,它和操作碼配合使用,從而實現(xiàn)某些附加操作。
操作碼是指令語句中不可缺少的;多個操作數(shù)間是以‘,’隔開的;帶括號的項是可選項,如果有此項時,不能加括號;注釋是為閱讀方便而加的說明,并用分號‘;’作為間隔符。匯編程序?qū)ζ洳贿M行處理。例如:DONE:MOVAX,BX;將寄存器BX的內(nèi)容傳送到AX中,BX的內(nèi)容不變?!鼧?biāo)號↑操作碼↑操作數(shù)↑注釋3.3.2指令編碼格式指令編碼格式是指每條指令所對應(yīng)的二進制編碼(即機器碼)的表示格式。
8086指令系統(tǒng)的操作指令由1~7個字節(jié)組成,其包括操作碼、尋址方式及操作數(shù)部分(位移量、立即數(shù)),即:⑴⑵⑶⑷⑴在操作碼字節(jié)中,OPCODE規(guī)定了處理器執(zhí)行的操作,如加、減、傳送等,具體操作采用編碼表示。D位規(guī)定了數(shù)據(jù)流的方向,指明了尋址方式字節(jié)指定的R/M和REG域之間的數(shù)據(jù)流動方向。當(dāng)D?=?0時,REG域指定的寄存器操作作為源操作數(shù);當(dāng)D?=?1時,REG域指定的寄存器操作作為目的操作數(shù),而源操作數(shù)來自R/M域中的存儲器或另一個寄存器。W位用于表示操作數(shù)的長度是字節(jié)或字。當(dāng)W?=?0時,操作數(shù)為字節(jié);當(dāng)W?=?1時,操作數(shù)為字。表3.4寄存器地址編碼寄存器地址編碼與W位之間的編碼關(guān)系如表3.4所示。⑵尋址方式字節(jié)中各個域的含義如下:MOD域:選擇尋址類型,指定R/M域為寄存器還是存儲器,如果為存儲器,還要指定是否有偏移量,偏移量為8位還是16位。MOD域與R/M域之間的組合關(guān)系如下表所示。REG域:規(guī)定寄存器操作數(shù)。采用三位編碼表示8個寄存器。R/M域:表示寄存器或存儲器,受MOD域控制。如為寄存器,則與寄存器域相同,如為存儲器,則有8種組合的尋址方式。⑶指令編碼格式中的位移量表示指令中直接給出尋址方式所需的偏移量。
8位偏移量占1個字節(jié),16位偏移量占2個字節(jié),低8位偏移量在前,高8位偏移量在后。⑷立即數(shù)表示指令中直接給出操作數(shù)。
8位立即數(shù)占1個字節(jié),16位立即數(shù)占2個字節(jié),低8位在前,高8位在后?!纠?.22】寫出指令“MOVAL,[DI+0008]”的機器碼。
MOVAL,[DI+0008]的機器碼由操作碼字節(jié)、尋址字節(jié)和兩個字節(jié)的偏移量構(gòu)成。根據(jù)指令查閱指令編碼相關(guān)手冊得到操作碼字節(jié)內(nèi)容為:100010DW。從指令中得到目的操作數(shù)是AL的內(nèi)容,D=1,W=0,則操作碼字節(jié)內(nèi)容為10001010B=8AH。?當(dāng)D?=?0時,REG域指定的寄存器操作作為源操作數(shù)當(dāng)D?=?1時,REG域指定的寄存器操作作為目的操作數(shù),而源操作數(shù)來自R/M域中的存儲器或另一個寄存當(dāng)W?=?0時,操作數(shù)為字節(jié);當(dāng)W?=?1時,操作數(shù)為字?!纠?.22】寫出指令“MOVAL,[DI+0008]”的機器碼。?源操作數(shù)[DI+0008]由表3.5指定尋址字節(jié)中的MOD(10B)和R/M域(101B),尋址字節(jié)中的REG域由目的操作數(shù)寄存器AL指定,查表3.4得到REG域為000B,則尋址字節(jié)內(nèi)容為:10000101B=85H。最終得到的指令編碼內(nèi)容為:8A850800H。
8086指令系統(tǒng)為了指定段寄存器,還提供了“段跨越前綴”的特殊字節(jié),其格式如圖3.10所示。圖3.10段跨越前綴字節(jié)格式
80386/80486指令系統(tǒng)的32位數(shù)操作指令由1~14個字節(jié)組成,其中包括前綴、操作碼、尋址方式及操作數(shù)部分,即其中,前綴由操作數(shù)長度前綴(66H)和地址碼長度前綴(67H)組成;操作數(shù)由位移量、立即數(shù)組成。
3.480X86指令系統(tǒng)指令系統(tǒng)是指微處理器所能執(zhí)行全部指令的集合。不同微處理器具有不同的指令系統(tǒng)。
80X86系列的CPU中,其指令系統(tǒng)的機器代碼是完全向上兼容的。
80X86指令系統(tǒng)按功能可分為以下9類:
(1)數(shù)據(jù)傳送類指令;
(2)算術(shù)運算類指令;
(3)邏輯運算和移位類指令;
(4)位操作指令;
(5)串操作指令;
(6)控制轉(zhuǎn)移類指令;
(7)處理器控制指令;
(8)高級語言類指令;
(9)操作系統(tǒng)型指令。√√√√表3.6縮寫符號及其說明3.4.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令用于實現(xiàn)立即數(shù)到寄存器或存儲器、CPU內(nèi)部寄存器之間、寄存器與存儲器之間、累加器與I/O口之間的數(shù)據(jù)傳送。除標(biāo)志位傳送指令之外,數(shù)據(jù)傳送類指令不會影響標(biāo)志寄存器中的標(biāo)志位。這類指令又分為通用數(shù)據(jù)傳送、地址傳送、標(biāo)志傳送和輸入輸出等4組指令。1.通用數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令包括最基本的傳送指令、堆棧指令、數(shù)據(jù)交換指令、換碼指令。指令的基本格式和操作如表3.7所示。表3.7通用傳送指令1)基本的傳送指令基本的傳送指令包括MOV、MOVSX、MOVZX。其中MOVSX、MOVZX僅在386及其后繼機型中可用。●傳送指令(move)——MOV
指令格式:MOVDST,SRC
指令功能:將源操作數(shù)SRC的內(nèi)容傳送到目的操作數(shù)DST所指單元,而源操作數(shù)的內(nèi)容保持不變,完成字節(jié)、字或雙字傳送。源操作數(shù)可以是通用寄存器(REGn)、段寄存器(SEG)、立即數(shù)(DATAn)和存儲單元(MEMn)。目的操作數(shù)可以是通用寄存器(REGn)、段寄存器(SEG)、存儲單元(MEMn)。存儲單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。在使用MOV指令時應(yīng)注意以下幾點:(1)目的操作數(shù)不得為立即數(shù)。如:MOV12H,BL為非法指令。(2)不影響標(biāo)志位。(3)操作數(shù)類型必須一致。如:MOVAX,BL為非法指令,應(yīng)為MOVAL,BL。(4)源操作數(shù)為非立即數(shù)時,兩操作數(shù)之一必為寄存器。如:MOV[DX],[SI]為非法指令,不能在兩個存儲單元之間進行數(shù)據(jù)傳送。(5)目的操作數(shù)為段寄存器(CS和IP或EIP不能作為目的寄存器),源操作數(shù)不得為立即數(shù)。(6)不能在段寄存器之間進行直接數(shù)據(jù)傳送。如:MOVDS,ES為非法指令。
幾個不能傳送操作的解決辦法是通過AX作橋梁。存儲器←存儲器:
MOVAX,MEM1
MOVMEM2,AX段寄存器←段寄存器:
MOVAX,SEG1
MOVSEG2,AX段寄存器←立即數(shù):
MOVAX,DATA
MOVSEG,AX●帶符號擴展傳送指令——MOVSX
指令格式:MOVSXREG16(32),REG8(16)/MEM8(16)
指令功能:將源操作數(shù)符號擴展送入目的寄存器,可以是8位符號擴展到16位或32位,也可以是16位符號擴展到32位。源操作數(shù)可以是8位或16位的寄存器或存儲單元的內(nèi)容,而目的操作數(shù)則必須是16位或32位的寄存器。該指令執(zhí)行后不影響標(biāo)志位。【例3.23】MOVSXEAX,CX如果(CX)=0AB20H,CX中的內(nèi)容為負數(shù),符號位=1。則指令執(zhí)行后,(EAX)=FFFFAB20H,●零擴展傳送指令——MOVZX
指令格式:MOVZXREG16(32),REG8(16)/MEM8(16)
指令功能:將源操作數(shù)作零擴展送入目的寄存器,不管源操作數(shù)的符號位是否為1,高位均作零擴展。有關(guān)源操作數(shù)、目的操作數(shù)及對標(biāo)志位的影響均與MOVSX的相同。【例3.24】MOVZXEAX,CL
如果(CL)?=?0FAH,CL中的符號位?=?1。指令執(zhí)行后,(EAX)?=?000000FAH,2)堆棧指令:堆棧指令包括壓棧PUSH、PUSHA、PUSHAD、PUSHF、PUSHFD出棧POP、POPA、POPAD、POPF、POPFDPOPF、POPFD指令由裝入值來確定標(biāo)志位的值外,其余指令均不影響標(biāo)志位。
PUSHA/PUSHAD、POPA/POPAD用于386及其后繼機型。堆棧的存取在16位指令中必須以字為單位進行壓入彈出操作。在32位指令中必須以雙字為單位進行壓入彈出操作?!?壓棧/出棧指令——PUSH/POP
指令格式:PUSHSRC;POPDST
指令功能:執(zhí)行PUSH指令時,將(E)SP的內(nèi)容減2(16位指令中)或減4(32位指令中),指向新的棧頂位置。執(zhí)行POP指令時,正好相反。每彈出一個字或雙字至目的操作數(shù)地址中,(E)SP的內(nèi)容加2或加4。
PUSH指令的源操作數(shù)可以是通用寄存器(REG)、段寄存器(SEG)、立即數(shù)(DATA)和存儲單元(MEM),它可使用所有的尋址方式,8086系統(tǒng)不允許使用立即數(shù)尋址方式,但在386及其后繼機型中允許立即數(shù)進棧。
POP指令的目的操作數(shù)可以是通用寄存器(REG)、段寄存器(SEG)和存儲單元(MEM),不允許使用立即數(shù)尋址方式。
CS值可壓入堆棧,但不能彈出一個字到CS寄存器。PUSHCSPUSH1234HPOP[EBX]在8086系統(tǒng)中非法,在80386及其后繼機型中合法?!纠?.25】PUSHAX如果(AX)?=?1234H,(SP)?=?0100H,則指令執(zhí)行后,(SP)?=?00FEH,【例3.26】POPAXPOPAX指令執(zhí)行前與執(zhí)行后的情況如圖3.12所示。圖3.12POPAX的執(zhí)行示意圖【例3.27】1、如果將AX,BX兩個寄存器的內(nèi)容互換,則可執(zhí)行下列程序段實現(xiàn)。2、如果保持寄存器進出棧前后內(nèi)容不變,則出棧的順序與進棧的順序相反。PUSH AXPUSH BXPOP AXPOP BXPUSH AXPUSH BXPOP BXPOP AX●所有寄存器壓棧/出棧指令——PUSHA/PUSHAD;POPA/POPAD指令格式:PUSHA ;POPA
PUSHAD ;POPAD指令功能:PUSHA將所有16位通用寄存器(AX,CX,DX,BX,SP,BP,SI,DI)依次進棧,指令執(zhí)行后,(SP)←(SP)-16仍指向棧頂;PUSHAD將所有32位通用寄存器(EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI),依次進棧,指令執(zhí)行后(ESP)←(ESP)-32指向棧頂。POPA將堆棧中16位的數(shù)據(jù)依次彈出至所有16位通用寄存器,彈出順序為:DI,SI,BP,SP,BX,DX,CX,AX,指令執(zhí)行后,(SP)←(SP)+16指向棧頂;POPAD將堆棧中32位的數(shù)據(jù)依次彈出至所有32位通用寄存器,彈出順序為:EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX,指令執(zhí)行后,(ESP)←(ESP)?+32指向棧頂?!纠?.28】PUSHAD
如果指令執(zhí)行前32位通用寄存器的內(nèi)容為AX,CX,DX,BX,SP,BP,SI,DI●標(biāo)志進出棧指令——PUSHF/PUSHFD;POPF/POPFD指令格式:PUSHF ; POPF
PUSHFD ; POPFD
指令功能:將FLAGS/EFLAGS標(biāo)志寄存器中內(nèi)容壓入堆棧;從堆棧中彈出字或雙字至FLAGS/EFLAGS標(biāo)志寄存器中?!纠?.29】若要求將陷阱標(biāo)志TF置位,則可用如下程序段實現(xiàn):
PUSHF
POP AX
OR AH,01H
PUSH
AX
POPF00000001
3)數(shù)據(jù)交換指令數(shù)據(jù)交換指令包括XCHG、CMPXCHG、XADD和BSWAP等指令。其中,CMPXCHG、XADD和BSWAP用于386及其后繼機型。●交換指令(exchange)——XCHG
指令格式:XCHGDST,SRC
指令功能:將兩個操作數(shù)的內(nèi)容相互交換。兩操作數(shù)長度可以是字節(jié)、字或雙字,且類型必須一致,不能同時為存儲器操作,其中之一必為寄存器。操作數(shù)可用除立即數(shù)外的任何尋址方式。兩個操作數(shù)可以同時為寄存器,但不允許同時都為段寄存器。該指令執(zhí)行后不影響標(biāo)志位。例如:XCHGAH,BL
XCHGES,AX
XCHGEAX,ARRAY[4*EBX]●比較交換指令(compareandexchange)——?CMPXCHG
指令格式:CMPXCHGDST,SRC
指令功能:將累加器中的內(nèi)容與目的操作數(shù)相比較。如果它們相等,則將源操作數(shù)拷貝到目的操作數(shù)所指單元,且置ZF為1;如果它們不相等,將目的操作數(shù)拷貝到累加器中,且置ZF為0。該指令對8位、16位、32位數(shù)都適用。目的操作數(shù)可以是通用寄存器REGn和存儲單元MEMn。源操作數(shù)只能為REGn。存儲單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。例如:CMPXCHGBX,DX如果(BX)?=?(AX),則(BX)?=?(DX),且ZF?=?1;如果(BX)?≠?(AX),則(AX)?=?(BX),且ZF?=?0。●變換加指令(exchangeandadd)——XADD
指令格式:XADDDST,SRC
指令功能:XADD指令和其他的加法指令一樣,將源操作數(shù)和目的操作數(shù)之和存入目的操作數(shù)所指存儲單元。不同之處在于,在相加完成后,原來的目的操作數(shù)將被存入源操作數(shù)所指存儲單元內(nèi),改變了源操作數(shù)的內(nèi)容。目的操作數(shù)可以是通用寄存器REGn和存儲單元MEMn。源操作數(shù)只能為REGn。存儲單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。該指令執(zhí)行后對標(biāo)志位的影響與加指令的相同。例如:XADDAL,DL如果(AL)?=?12H,(DL)?=?34H,則當(dāng)指令執(zhí)行后,(AL)?=?46H,而(DL)?=?12H。●字節(jié)交換指令(byteswap)——BSWAP
指令格式:BSWAPREG32
指令功能:將指令指定的32位寄存器的字節(jié)次序變反。即1、4字節(jié)互換,2、3字節(jié)互換。該指令執(zhí)行后不影響標(biāo)志位。例如:BSWAPEAX如果指令執(zhí)行前,(EAX)=44223366H,則指令執(zhí)行后,(EAX)=66332244H,
4)換碼指令
XLAT為換碼指令(translate),也稱為查表轉(zhuǎn)換指令,是用查表方式將一種代碼轉(zhuǎn)換成另一種代碼。
指令格式:XLAT
該類指令是隱含尋址。指令中規(guī)定(E)BX指向存放在某一內(nèi)存表格的首地址AL為表格中某一元素與表格首地址之間的偏移量表格中的內(nèi)容即為要替換的代碼指令執(zhí)行后在AL中得到轉(zhuǎn)換后的代碼。指令執(zhí)行后不影響標(biāo)志位。34H35H36H……TABLE+0TABLE+1TABLE+2
【例3.30】十進制數(shù)0~9與BCD碼和字型碼的相互轉(zhuǎn)換如表3.8所示。請編寫指令,將5轉(zhuǎn)換成共陽極LED顯示的字型代碼。表3.8中七段顯示代碼中高電平“1”表示不亮,低電平“0”表示亮。如:共陽極LED顯示的字型代碼“0”(即十進制數(shù)“0”)只有G不亮,為高電平“1”。對于順序排列的表格,可用換碼指令XLAT來實現(xiàn)查表功能。假設(shè)表格存放在內(nèi)存中的首地址以標(biāo)號TABLE表示。將BX指向表格首地址,將表格偏移量(即序號)放入AL中。本例中偏移量為05H。用如下程序段可實現(xiàn)查表換碼功能:MOV AX,SEGTABLE;將標(biāo)號的段地址用SEG
偽指令提取出來MOV DS,AXMOV BX,OFFSETTABLE;將標(biāo)號的偏移地址用OFFSET偽指令提取出來
MOV AL,05
XLAT ;EA=(BX)+(AL),(AL)=(EA)該程序執(zhí)行后,(AL)=12H
2.地址傳送指令
80X86提供了6條將地址信息傳送到指定寄存器的指令,包括LEA、LDS、LES、LSS、LFS和LGS。其中LSS、LFS和LGS僅用于80386及其后繼機型。該類指令執(zhí)行后不影響標(biāo)志位。
1)有效地址傳送指令——LEA(loadeffectiveaddress)
指令格式:LEAREG,SRC;(REG)←SRC
指令功能:將源操作數(shù)的有效地址EA傳送到指定寄存器中。
源操作數(shù)的尋址方式只能是存儲器尋址方式(即不允許是立即數(shù)和寄存器尋址方式),目的操作數(shù)的寄存器可使用16位或32位寄存器,但不能為段寄存器。【例3.31】參見圖3.15,比較以下兩條指令的執(zhí)行結(jié)果。
LEABX,[DI]
MOV?BX,[DI]第一條指令執(zhí)行后,(BX)?=?0010H;第二條指令執(zhí)行后,(BX)?=?0FF00H。
MOV指令和LEA指令的區(qū)別,前者傳送源操作數(shù)所指單元的內(nèi)容,后者傳送源操作數(shù)的有效地址。圖3.15LEA與MOV指令的區(qū)別【例】設(shè)BX=1000H,DS=6000H,(61005H)=33H,(61006H)=44H。試比較以下兩條指令的執(zhí)行結(jié)果:
LEA
BX,[BX+5]
MOV
BX,[BX+5]LEA指令執(zhí)行后:BX=1005H;MOV指令執(zhí)行后:BX=4433H。
2)指針傳送指令
LDS指令和LES、LFS、LGS、LSS等指令的格式類同,只是指針指定的段寄存器不同而已。
指令格式:LDSREG,MEM;(REG)←(MEM),(DS)←(MEM+2)或(DS)←(MEM+4)
指令功能:?將源操作數(shù)MEM所指定存儲單元中連續(xù)4個單元的前兩個單元的內(nèi)容作為有效地址存入指令指定的16位寄存器(REG)中,后兩個單元的內(nèi)容裝入指令指定的段寄存器(DS)中;當(dāng)指令指定的是32位寄存器時,將該存儲單元中連續(xù)存放的4個單元的內(nèi)容作為有效地址裝入該寄存器中,而其后的2個單元的內(nèi)容裝入指令指定的段寄存器(DS)中。源操作數(shù)MEM的尋址方式只能是存儲器尋址方式(即不允許是立即數(shù)和寄存器尋址方式),目的操作數(shù)(REG)不能為段寄存器(SEG)。
【例3.32】LDSBX,TABLE[SI]如果指令執(zhí)行前,TABLE=0200H,(SI)=0008H,(DS)=4000H,(BX)=5A80H,則EA=TABLE+(SI)=0200H+0008H=0208H。在DS:0208H單元中存放的數(shù)據(jù)如圖3.16所示。指令執(zhí)行后,(BX)?=?1234H(DS)?=?1000H
【例3.33】LSSESP,DS:[0100H]將DS:0100H單元中存放的48位地址分別裝入ESP和SS寄存器中。
6×8
前4個存儲單元后2個存儲單元
3.標(biāo)志傳送指令:用于標(biāo)志寄存器傳送的指令有標(biāo)志送AH指令——LAHFAH送標(biāo)志寄存器指令——SAHF標(biāo)志進棧指令——PUSHF/PUSHFD
標(biāo)志出棧指令——POPF/POPFDLAHF、SAHF指令為隱含尋址。圖3.17LAHF指令功能1)?標(biāo)志送AH指令——LAHF
指令格式:LAHF;(AH)←(FLAGS的低字節(jié))
指令功能:將標(biāo)志寄存器FLAGS的低8位中5個狀態(tài)標(biāo)志位(不包括OF)分別傳送到AH的對應(yīng)位,如圖3.17所示。該指令的執(zhí)行不影響標(biāo)志位。
2)?AH送標(biāo)志寄存器——SAHF
指令格式:SAHF ;(FLAGS的低字節(jié))←(AH)
指令功能:SAHF指令與LAHF指令功能相反,即將AH中相應(yīng)位(D7、D6、D4、D2、D0)的狀態(tài)分別傳送到標(biāo)志寄存器FLAGS的對應(yīng)位(SF、ZF、AF、PF、CF),而FLAGS其他位不受影響。
4.輸入輸出指令
80X86提供了IN和OUT輸入輸出指令,也稱為累加器專用指令。該類指令僅限于用累加器AL、AX、EAX傳送信息。輸入輸出指令只有兩種尋址方式:直接尋址方式和寄存器間接尋址方式。輸入輸出指令執(zhí)行后不影響標(biāo)志位。1)輸入指令(input)——IN:用于I/O端口到CPU的數(shù)據(jù)輸入操作。INAL,port
;(AL)←(port)INAX,port
;(AX)←(port+1,port)INEAX,port
;(EAX)←(port+3,port+2,port+1,port)INAL,DX
;(AL)←((DX))INAX,DX
;(AX)←((DX)+1,(DX))INEAX,DX
;(EAX)←((DX)+3,(DX)+2,(DX)+1,(DX))
2)輸出指令(output)——OUT:用于CPU到I/O端口的數(shù)據(jù)輸出操作。OUTport
,AL;(port)←(AL)OUTport
,AX;(port+1,port)←(AX)OUTport
,EAX;(port+3,port+2,port+1,port)←(EAX)OUTDX
,AL;((DX))←(AL)OUTDX
,AX;((DX)+1,(DX))←(AX)OUTDX
,EAX;((DX)+3,(DX)+2,(DX)+1,(DX))←(EAX)例如:INAL,41H;表示從端口地址為41H中輸入字節(jié)數(shù)到AL中INAX,41H;表示從端口地址為41H中輸入字到AX中MOVDX,A378H
;將端口地址A378H送入DX寄存器中OUTDX,EAX
;表示從EAX輸出雙字數(shù)據(jù)到(DX)~(DX)+3所指的四個端口中3.4.2算術(shù)運算類指令
80X86提供了加、減、乘、除等各類算術(shù)運算指令,這些指令可處理4種類型的數(shù)據(jù):有符號的二進制數(shù)、無符號的二進制數(shù)、無符號的組合十進制數(shù)和無符號的分離十進制數(shù)。轉(zhuǎn)至3.4.4位操作指令表3.9算術(shù)運算指令續(xù)表
1.加減法指令:加減法指令有不帶進(借)位的加減法指令A(yù)DD、SUB;帶進(借)位的加減法指令A(yù)DC、SBB;增減量指令I(lǐng)NC、DEC;特殊減法指令即求補指令NEG;比較指令CMP。
1)?ADD/SUB——加/減法指令指令格式:ADDDST,SRC ;SUBDST,SRC
指令功能:ADD指令將目的操作數(shù)與源操作數(shù)相加之和送到目的操作數(shù)所指單元中。SUB指令將目的操作數(shù)與源操作數(shù)相減之差送到目的操作數(shù)所指單元中。指令執(zhí)行后源操作數(shù)保持不變,但指令會影響SF、ZF、CF、AF、PF和OF等6個標(biāo)志位。指令中源操作數(shù)可以是通用寄存器REGn、立即數(shù)DATAn和存儲單元MEMn。目的操作數(shù)可以是REGn和MEMn,但不得為立即數(shù)。源操作數(shù)和目的操作數(shù)都不能是段寄存器,存儲單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。使用加、減法指令時,應(yīng)注意源操作數(shù)為非立即數(shù)時,兩操作數(shù)之一必為寄存器,兩存儲單元之間不能進行加、減法運算。兩操作數(shù)類型必須一致,可以同時為字節(jié)、字或雙字。
例如:ADDAX,DI ;(AX)←(AX)?+?(DI)SUBBL,5FH ;(BL)←(BL)?-?5FHADD[EBP],AL ;((EBP))←((EBP))?+?(AL)ADDAX,[EBX+2*ECX];將(EBX+2*ECX)所指向的存儲
;單元中的內(nèi)容加上AX的內(nèi)容,
;并將結(jié)果存入AX中下邊3條指令是非法的。ADDDS,BX ;操作數(shù)不允許為段寄存器SUB[DI],[BP] ;不允許兩操作數(shù)都為存儲單元ADD34H,EAX ;目的操作數(shù)不能為立即數(shù)
2)?ADC/SBB——帶進/借位加/減法指令指令格式:ADCDST,SRC ;SBBDST,SRC
指令功能:帶進/借位的加/減法指令將進/借位標(biāo)志位的值(CF)一起與操作數(shù)相加/減。該組指令主要針對出現(xiàn)在8086中超過16位的數(shù)據(jù)或80386及其后繼機型中超過32位的數(shù)據(jù)進行多字節(jié)加/減法的運算中。其中CF的當(dāng)前值是由程序中本指令之前的指令產(chǎn)生的。其他規(guī)定均與ADD/SUB指令相同。
3)?INC/DEC——增減量指令指令格式:INC DST ;DECDST
指令功能:INC/DEC將目的操作數(shù)的內(nèi)容加/減1。用于循環(huán)程序中指針修改。該組指令影響OF、SF、ZF、AF、DF標(biāo)志位,但不影響CF位。目的操作數(shù)可以是REGn和MEMn。目的操作數(shù)不能是段寄存器,目的操作數(shù)不得為立即數(shù)。存儲單元可通過數(shù)據(jù)尋址的各種尋址方式尋址。對于非立即數(shù)存儲器增減量,數(shù)據(jù)必須用字節(jié)、字、雙字這些類型來描述。例如,DEC[SI]這條指令,可以是一個字節(jié)、字或雙字大小的減量,DECBYTEPTR[SI]:表明是一個字節(jié)型的存儲器數(shù)據(jù),DECWORDPTR[SI]:是指一個字型的存儲器數(shù)據(jù),DECDWORDPTR[SI]:指的是一個雙字型的存儲器數(shù)據(jù)。
【例3.34】求26584336H+3619FECAH=??內(nèi)存中數(shù)據(jù)存放形式如圖3.18所示。請給出使用8位加法指令完成兩數(shù)之和的程序段。8086指令程序段為:
LEA SI,ARY1 ;ARY1偏移地址送SI
LEADI,ARY2 ;ARY2偏移地址送DI
LEABX,SUM ;SUM偏移地址送BX
MOVCX,4 ;循環(huán)4次
CLC ;清進位CF標(biāo)志AGAIN:MOVAL,[SI]
ADCAL,[DI] ;帶進位加
MOV[BX],AL;結(jié)果存入SUM
INCSI ;調(diào)整指針
INCDI
INCBX
DECCX ;循環(huán)計數(shù)器減1
JNZAGAIN ;若未處理完,則轉(zhuǎn)AGAIN圖3.19給出第0字節(jié)相加之后標(biāo)志位的值;圖3.20給出第0、1字節(jié)相加過程中進位如何將2個字節(jié)加法組合成字相加。圖3.19加法結(jié)果對標(biāo)志位的影響圖3.20進位將2個8位加法組合成16位相加
【例3.35】若(AL)?=?11H,請給出執(zhí)行SUBAL,33H指令后對標(biāo)志位的影響。圖3.21給出減指令執(zhí)行后標(biāo)志位的值。圖3.21減法結(jié)果對標(biāo)志位的影響
4)求補指令(negate)——NEG指令格式:NEGDST
指令功能:對一個操作數(shù)取補碼,即相當(dāng)于用0減去目的操作數(shù),并將結(jié)果送回到目的操作數(shù)??衫肗EG指令得到補碼表示的負數(shù)的絕對值?!纠?.36】若(AX)?=?0FF0EH?=?[-242]補,則執(zhí)行NEGAX后,即得到
(AX)?=?00F2H?=│-242│=?+242
請給出執(zhí)行NEGAX指令后對標(biāo)志位的影響。指令執(zhí)行后標(biāo)志位的值為:
CF?=?1(最高位D15向前有借位)SF=0(符號位為0)
AF?=?1(D3位有借位) PF=0(奇數(shù)個‘1’)
OF?=?0(無溢出)? ZF?=?0(結(jié)果非零)
5)比較指令(compare)——CMP
指令格式:CMPDST,SRC 指令功能:比較指令是一個只改變標(biāo)志位的減法,而目的操作數(shù)、源操作數(shù)不發(fā)生改變。指令中兩操作數(shù)類型必須一致,目的操作數(shù)不為立即數(shù),兩操作數(shù)之一必為寄存器。兩操作數(shù)不允許為段寄存器。例如:
CMPBX,8000H
CMPAX,BX
CMP[DI],CH
CMPBX,[EDI+ESI]比較指令后面常常會跟一個跳轉(zhuǎn)指令,以檢測標(biāo)志位,控制程序的走向。
CMP指令執(zhí)行后可根據(jù)標(biāo)志位判斷比較結(jié)果。根據(jù)ZF判斷兩個數(shù)是否相等。若ZF?=?1,則兩數(shù)相等。若兩個數(shù)不相等,則分兩種情況考慮:①比較的是兩個無符號數(shù):若CF?=?0,則(DST)≥(SRC);若CF?=?1,則(DST)<(SRC)。②比較的是兩個有符號數(shù):若OF⊕SF?=?0,則(DST)>(SRC);若OF⊕SF?=?1,則(DST)<(SRC)。
2.乘法指令乘法指令有單操作數(shù)的無符號數(shù)乘法指令MUL和有符號數(shù)乘法指令I(lǐng)MUL指令。
386及其后繼機型中還增加了雙操作數(shù)和三操作數(shù)有符號數(shù)乘法指令I(lǐng)MUL指令。乘法指令的操作數(shù)的類型可以是字節(jié)、字或者雙字。僅80386及其后繼機型可以對32位的雙字型數(shù)據(jù)使用乘法指令。
1)無符號數(shù)乘法指令(multiple)——MUL指令格式:MULSRC 指令功能:將目的操作數(shù)乘以源操作數(shù),結(jié)果存放到目的操作數(shù)中。目的操作數(shù)是隱含尋址,必須為累加器,用于存放被乘數(shù)及乘積的一部分。源操作數(shù)用于存放乘數(shù),可以是寄存器或存儲器中的數(shù)據(jù),但不允許為立即數(shù)。乘法指令執(zhí)行完后的結(jié)果總是一個兩倍于原數(shù)據(jù)大小的數(shù)據(jù)。當(dāng)兩個8位數(shù)相乘時,16位乘積存放在AX中;當(dāng)兩個16位數(shù)相乘時,32位乘積存放在DX:AX中,其中高位字存放在DX中,低位字存放在AX中;當(dāng)兩個32位數(shù)相乘時,64位乘積存放在EDX:EAX中,其中高位字存放在EDX中,低位字存放在EAX中。當(dāng)乘法指令執(zhí)行完后,一些標(biāo)志位(CF和OF)會改變,產(chǎn)生預(yù)期的結(jié)果。其他的標(biāo)志位也會改變,不過它們的結(jié)果是無法預(yù)知的,因而不能被利用。
CF、OF表示乘積值的范圍:若AH(字節(jié)乘)/DX(字乘)/EDX(雙字乘)乘積值高位為零,則CF?=?OF?=?0。若AH中存有積的有效值,則CF?=?OF?=?1。
【例3.37】若(AL)?=?0C5H,(BL)?=?11H,求執(zhí)行指令MULBL后的乘積值。
(AL)?=?0C5H為無符號數(shù)的197;
(BL)?=11H為無符號數(shù)的17,則執(zhí)行后,(AX)?=?0D15H為無符號數(shù)的3349。D15H=110100010101B=211+210+28+24+22+20=3349AH中存有積的有效值,所以CF=OF=1
2)有符號數(shù)乘法指令(signedmultiple)——IMUL
分為三種:有符號單操作數(shù)乘法指令、有符號雙操作數(shù)乘法指令、有符號三操作數(shù)乘法指令?!裼蟹枂尾僮鲾?shù)乘法指令指令格式:IMULSRC 指令功能:與MUL相同,只是必須是有符號數(shù)。對于有符號數(shù),IMUL執(zhí)行
溫馨提示
- 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年涂料產(chǎn)品綠色認證服務(wù)合同
- 2025年度數(shù)據(jù)中心承建與數(shù)據(jù)中心冷卻系統(tǒng)合同4篇
- 2025年度農(nóng)業(yè)保險產(chǎn)品定制服務(wù)合同8篇
- 二零二五年度農(nóng)村土地經(jīng)營權(quán)流轉(zhuǎn)合同示范文本
- 2025年度苗木養(yǎng)護與生態(tài)園林景觀優(yōu)化合同3篇
- 2025版門崗信息化管理平臺建設(shè)合同范本4篇
- 二零二五年度體育產(chǎn)業(yè)投資入股合同3篇
- 二零二五年度牛羊肉產(chǎn)品研發(fā)與技術(shù)轉(zhuǎn)移合同3篇
- 二零二五年度促銷員權(quán)益保護及糾紛處理合同3篇
- 2025年度個人貨車出租及運輸服務(wù)合同3篇
- 紅色革命故事《王二小的故事》
- 《白蛇緣起》賞析
- 海洋工程用高性能建筑鋼材的研發(fā)
- 蘇教版2022-2023學(xué)年三年級數(shù)學(xué)下冊開學(xué)摸底考試卷(五)含答案與解析
- 英語48個國際音標(biāo)課件(單詞帶聲、附有聲國際音標(biāo)圖)
- GB/T 6892-2023一般工業(yè)用鋁及鋁合金擠壓型材
- 冷庫安全管理制度
- 2023同等學(xué)力申碩統(tǒng)考英語考試真題
- 家具安裝工培訓(xùn)教案優(yōu)質(zhì)資料
- 在雙減政策下小學(xué)音樂社團活動有效開展及策略 論文
- envi二次開發(fā)素材包-idl培訓(xùn)
評論
0/150
提交評論