匯編語言程序設(shè)計(jì)第3章.ppt_第1頁
匯編語言程序設(shè)計(jì)第3章.ppt_第2頁
匯編語言程序設(shè)計(jì)第3章.ppt_第3頁
匯編語言程序設(shè)計(jì)第3章.ppt_第4頁
匯編語言程序設(shè)計(jì)第3章.ppt_第5頁
已閱讀5頁,還剩241頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章 尋址方式和指令系統(tǒng),3.1 尋址方式 3.2 指令系統(tǒng),3.1 尋 址 方 式,3.1.1 尋址方式和有效地址概念 操作數(shù)地址的表示有3種情況: (1) 直接放在指令中。指令的操作數(shù)部分就是操作數(shù)本身。這種操作數(shù)叫做立即數(shù),對(duì)應(yīng)的指令尋址方式稱為立即數(shù)尋址。 (2) 放在CPU的某個(gè)內(nèi)部寄存器中。指令的操作數(shù)部分是CPU的一個(gè)寄存器。這種指令尋址方式稱為寄存器尋址。 (3) 放在某個(gè)存儲(chǔ)單元中,指令的操作數(shù)部分包含著該操作數(shù)所在的內(nèi)存地址。這種指令尋址方式稱為存儲(chǔ)器尋址。,每個(gè)存儲(chǔ)單元在存儲(chǔ)器中所具有的地址稱為存儲(chǔ)單元的物理地址,段基地址(簡(jiǎn)稱段地址)是指每一段的起始地址,單元與段基地址的距離稱為段內(nèi)偏移地址,也叫偏移量。物理地址是由存儲(chǔ)單元所在段的基地址和段內(nèi)偏移地址這兩個(gè)部分組成。以MOV指令為例,若有: MOV DSBUFFER,AL 這里,DSBUFFER表示內(nèi)存的某一單元地址,稱為邏輯地址。DS對(duì)于實(shí)地址方式就是段基址,對(duì)于保護(hù)方式則可通過段管理部件形成段基址。BUFFER為段內(nèi)偏移地址,段內(nèi)偏移地址有16位和32位兩種。段基址和段內(nèi)偏移地址相加,形成線性地址,對(duì)實(shí)地址方式而言,該線性地址就是物理地址。對(duì)保護(hù)方式而言,線性地址經(jīng)管理部件再變換成32位物理地址。,段內(nèi)偏移地址可以由基址寄存器內(nèi)容、變址寄存器內(nèi)容、比例因子和位移量這4個(gè)基本部分組合而成。由4個(gè)基本部分組合而成的偏移地址稱為有效地址EA(Effective Address),比例因子可取1、2、4、8中的任一個(gè),基址寄存器內(nèi)容、變址寄存器內(nèi)容和位移量可為正數(shù)也可為負(fù)數(shù)。有效地址EA的組合及計(jì)算方法是: 有效地址EA基址(變址比例因子)位移量,可用作基址、變址的寄存器和比例因子、位移量的取值規(guī)定是: 工作于實(shí)地址方式下的16位尋址:基址寄存器可以是BX或BP寄存器,變址寄存器可以是SI或DI寄存器,比例因子或者沒有或者為1。位移量可以是0、8位或16位。 工作于保護(hù)方式下的32位尋址:基址寄存器可以是任何32位通用寄存器中的一個(gè),變址寄存器可以是除ESP外的任何32位通用寄存器中的一個(gè),比例因子可以是1、2或4或8,位移量可以是0、8位或32位。,3.1.2 數(shù)據(jù)尋址方式 1立即數(shù)尋址 直接出現(xiàn)在指令中的操作數(shù)稱為立即數(shù),它緊跟在操作碼的后面,其本身就是代碼的一部分,這種尋址方式叫做立即數(shù)尋址。立即數(shù)可以是8位、16位或32位。 例3-1 MOV AL, 20 MOV BX, 2568H MOV ECX,25685678H 這3條指令中的立即數(shù)依次是8位、16位和32位,對(duì)應(yīng)的寄存器也分別是8位的AL、16位的BX和32位的ECX。執(zhí)行指令MOV BX,2568H的結(jié)果是(BX)=2568H ,執(zhí)行過程見圖3-1。,說明: 立即數(shù)只能作源操作數(shù),不能作為目的操作數(shù),一般用于給寄存器賦初值; 立即數(shù)既可以是二進(jìn)制數(shù)、十進(jìn)制數(shù),也可以是十六進(jìn)制數(shù); 低位字節(jié)數(shù)存放在存儲(chǔ)單元的低地址字節(jié),高位字節(jié)數(shù)存放在存儲(chǔ)單元的高地址字節(jié),如:MOV AX,im中的立即數(shù)im,其低8位字節(jié)iml存儲(chǔ)在低地址字節(jié)單元中,高8位字節(jié)imh存儲(chǔ)在高地址字節(jié)單元中,指令的存儲(chǔ)與執(zhí)行過程如圖3-2所示。,圖3-1 例3-1立即數(shù)尋址示意圖,圖3-2 立即數(shù)尋址及數(shù)據(jù)存儲(chǔ)示意圖,2寄存器尋址 寄存器尋址又稱寄存器直接尋址。操作數(shù)直接存放在寄存器中,由指令指定的寄存器進(jìn)行尋址,即操作數(shù)包含在指令規(guī)定的8位、16位或32位寄存器中。如: INC DL MOV DS,AX MOV EBX,ECX 三條指令表明操作數(shù)分別存于8位DL、16位的AX和32位的ECX中。,例3-2 設(shè)(CX)=1234H,(AX)=5678H,執(zhí)行指令 MOV CX,AX 其結(jié)果是:(CX)=5678H,(AX)不變,仍為5678H,執(zhí)行過程見圖3-3。 說明:雖然操作數(shù)可使用CPU內(nèi)部通用寄存器中的任意一個(gè),且它們都能參與算術(shù)/邏輯運(yùn)算和存放運(yùn)算結(jié)果。由于AX和EAX是累加器,若結(jié)果是存放在AX或EAX中,通常指令執(zhí)行的時(shí)間要短一些。,圖3-3 例3-2寄存器尋址執(zhí)行情況,3直接尋址 指令中的操作數(shù)部分直接給出的是操作數(shù)的有效地址EA的尋址方式稱為存儲(chǔ)器直接尋址,簡(jiǎn)稱直接尋址。有效地址EA是和操作碼一起放在存儲(chǔ)器代碼段中,它可以是16位或32位整數(shù)。但操作數(shù)一般在數(shù)據(jù)段DS中。 設(shè)要訪問的數(shù)據(jù)存放在DS所指向的數(shù)據(jù)段中,實(shí)地址模式下物理地址的計(jì)算方法是: 物理地址=10H(DS)+有效地址,圖3-4 例3-3直接尋址執(zhí)行情況,例3-3 設(shè)操作數(shù)存放在DS所指向的數(shù)據(jù)段中,(DS)=2000H,(21000H)=34H ,(21001H)=12H ,(BX)=5678H,執(zhí)行指令MOV BX,1000H后的結(jié)果為:(BX)=1234H,指令中的16位地址偏移量是低位字節(jié)在低地址存儲(chǔ)單元中,高位字節(jié)在高地址存儲(chǔ)單元中。執(zhí)行過程如圖3-4所示。 例3-4 執(zhí)行指令MOV AX,BEGIN的結(jié)果是:將內(nèi)存中從BEGIN開始的連續(xù)兩個(gè)單元內(nèi)容送入AX中。,說明: 直接尋址方式,是以數(shù)據(jù)段的地址為基礎(chǔ),可在多達(dá)64 KB的范圍內(nèi)尋找操作數(shù)。 缺省情況下,認(rèn)為操作數(shù)有效地址的作用域是DS所指向的數(shù)據(jù)段,但允許使用段超越前綴指定為其他段,即對(duì)于尋找操作數(shù)來說,還允許操作數(shù)在以代碼段、堆棧段或附加段為基準(zhǔn)的區(qū)域中,即只要在指令中指明是段超越的,則16位地址偏移量可以與CS、SS、ES、FS或GS相加,作為操作數(shù)的地址,如MOV AX,ES2000H。, 指令中操作數(shù)的有效地址既可以是一個(gè)數(shù)字,也可以是一個(gè)符號(hào)地址,如例3-4中的BEGIN就是一個(gè)符號(hào)地址。 直接尋址主要用于單個(gè)操作數(shù)的相對(duì)尋址場(chǎng)合,如簡(jiǎn)單的標(biāo)量操作數(shù)尋址和靜態(tài)分配的數(shù)組的起始地址尋址等。,4寄存器間接尋址 操作數(shù)在存儲(chǔ)器中,但操作數(shù)地址的偏移量包含在寄存器中,這種尋址方式稱為寄存器間接尋址。寄存器間接尋址可以是16位尋址,也可以是32位尋址。若使用BX、SI、DI、BP 4個(gè)寄存器中的一個(gè),則為16位尋址;若使用的是EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP中的一個(gè),則為32位尋址。以BX、SI、DI、EAX、EBX、ECX、EDX、ESI、EDI間接尋址時(shí),則默認(rèn)操作數(shù)在DS段中;以BP、EBP、ESP間接尋址時(shí),則默認(rèn)操作數(shù)在SS段中。 寄存器的使用規(guī)定對(duì)16位尋址和32位尋址是不一樣的。,圖3-5 寄存器間接尋址示意圖,(1) 16位尋址時(shí),偏移地址放在SI、DI、BP或BX中,段默認(rèn)有兩種情況: 若以SI、DI、BX間接尋址,通常操作數(shù)在現(xiàn)行數(shù)據(jù)段區(qū)域中,即數(shù)據(jù)段寄存器DS左移4位后加上SI、DI、BX中的16位偏移量作為操作數(shù)的地址。例如,MOV AX,SI,操作數(shù)在數(shù)據(jù)段寄存器DS中,16位偏移量在SI中。設(shè)(DS)2000H,(SI)=1000H,21000H單元的內(nèi)容為34H,21001H單元的內(nèi)容為12H,執(zhí)行MOV AX,SI后,AX的內(nèi)容為1234H。指令的執(zhí)行過程如圖3-5所示。, 若是以寄存器BP間接尋址,則操作數(shù)在堆棧段區(qū)域中,即堆棧段寄存器SS左移4位后與BP相加作為操作數(shù)的地址。例如,MOV AX,BP,操作數(shù)在數(shù)據(jù)段寄存器SS中,16位偏移量在BP中。設(shè)(SS)3000H,(BP)=2000H,32000H單元的內(nèi)容為34H,32001H單元的內(nèi)容為12H,執(zhí)行MOV AX,BP后,AX的內(nèi)容為1234H。指令的執(zhí)行過程如圖3-6所示。,圖3-6 BP寄存器間接尋址示意圖,(2) 32位尋址時(shí),偏移地址放在以EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP寄存器中,段默認(rèn)有兩種情況: 通用寄存器EAX、EBX、ECX、EDX、ESI、EDI默認(rèn)段寄存器為DS。 通用寄存器ESP、EBP默認(rèn)段寄存器為SS。,例3-5 MOV EBX,EAX;默認(rèn)DS為段基址,傳送雙字給EBX MOV DX, EBX;默認(rèn)DS為段基址,傳送字給DX MOV CH, EAX;默認(rèn)DS為段基址,傳送字節(jié)給CH,說明: 如果操作數(shù)在默認(rèn)段之外,指令中必須加段超越前綴。如 MOV AX,ESSI ;操作數(shù)在數(shù)據(jù)段寄存器ES中,不在默認(rèn)段DS中 MOV AX,DSBP ;操作數(shù)在數(shù)據(jù)段寄存器DS中,不在默認(rèn)段SS中 所以,“ES”和“DS”分別是兩指令的段超越前綴。 若在指令中規(guī)定是段超越的,則BP也可以與其它的段寄存器相加,形成操作數(shù)地址,如MOV AX,DSBP,BP不是與SS段寄存器形成操作數(shù)地址,而是與DS段寄存器形成操作數(shù)地址。 寄存器間接尋址的應(yīng)用場(chǎng)合與直接尋址的應(yīng)用場(chǎng)合相似。 源操作數(shù)與目的操作數(shù)的位數(shù)要匹配。,例3-6 設(shè)(DS)=2000H,(SI)=1200H,(21200H)=56H,執(zhí)行指令MOV AH,SI的結(jié)果是:(AH)=56H ,執(zhí)行過程見圖3-7。,圖3-7 例3-6寄存器間接尋址執(zhí)行情況,例3-7 設(shè)(DS)=2000H,(DI)=2100H,(22100H)=68H,(22101H)=41H,執(zhí)行指令MOV BX,DI的結(jié)果是:(BX)=4168H。,5基址尋址 由指定的基址寄存器內(nèi)容,加上指令中給定的偏移量(要由一個(gè)段寄存器作為地址基準(zhǔn))作為操作數(shù)的地址的尋址方式稱為基址尋址。 在基址尋址方式下,EA基址寄存器+位移量,位移量是常數(shù)且緊跟在操作碼之后,與操作碼一起存放在代碼段中?;芳拇嫫鞯氖褂靡?guī)定對(duì)16位尋址和32位尋址是不一樣的。,(1) 16位尋址情況下,SX和BP作為基址寄存器。在缺省段超越前綴時(shí),BX以DS作為默認(rèn)段寄存器,BP以SS作為默認(rèn)段寄存器。位移量可為8位或16位。 (2) 32位尋址情況下,8個(gè)32位通用寄存器均可作基址寄存器,其中ESP、EBP以SS為默認(rèn)段寄存器,其余6個(gè)通用寄存器均以DS為默認(rèn)段寄存器。位移量為8位或32位。 基址尋址適于對(duì)一維數(shù)組的數(shù)組元素進(jìn)行檢索操作。位移量表示數(shù)組起始地址偏移量,基址表示的是可以變化的數(shù)組元素下標(biāo)。 EA的書寫形式可以是“基址寄存器+位移量”,也可以是“位移量基址寄存器”。基址尋址的執(zhí)行過程示例如圖3-8所示(以例3-8中的MOV DX,EAX1500為例,默認(rèn)段基址是DS)。,圖3-8 基址尋址的執(zhí)行過程示意圖,例3-8 MOV EAX,BX24 ;或 MOV EAX,24BX MOV ECX,EBP50 ;或 MOV ECX,50EBP MOV DX, EAX1500 ;或 MOV DX,1500EAX,例3-9 設(shè)(DS)=2000H,(SI)=1200H,(21206H)=56H,執(zhí)行指令MOV AH,SI+6的結(jié)果是:(AH)=56H ,執(zhí)行過程見圖3-9。,圖3-9 例3-9寄存器相對(duì)尋址執(zhí)行情況,6變址尋址 由指定的變址寄存器內(nèi)容,加上指令中給定的偏移量(要由一個(gè)段寄存器作為地址基準(zhǔn))作為操作數(shù)的地址的尋址方式稱為變址尋址。 在變址尋址方式下,EA變址寄存器+位移量,位移量跟在操作碼之后,與操作碼一起存放在代碼段中。變址寄存器的使用規(guī)定對(duì)16位尋址和32位尋址是不一樣的。 (1) 16位尋址時(shí),僅SI、DI可作變址寄存器,默認(rèn)DS作為段基址寄存器。如: MOV AX,COUNTSI,(2) 32位尋址時(shí),除ESP外的任何通用寄存器均可作變址寄存器, EBP默認(rèn)SS作段基址寄存器,其余的以DS作段基址寄存器。如: MOV EAX,5EBP MOV ECX,DATAEAX EA的書寫形式可以是“變址寄存器+位移量”,也可以是“位移量變址寄存器”,即位移量可以寫在 里,也可以寫在 外面;也可以是一個(gè)數(shù)字,或一個(gè)符號(hào)地址。以MOV AX,COUNTSI為例,默認(rèn)段基址是DS,變址尋址的執(zhí)行過程如圖3-10所示。,圖3-10 變址尋址示意圖,變址尋址適用于對(duì)一維數(shù)組的數(shù)組元素進(jìn)行檢索操作。位移量表示數(shù)組起始地址偏移量,變址表示的是可以變化的數(shù)組元素下標(biāo)。 例3-10 執(zhí)行指令MOV CX,LISTDI的結(jié)果是將內(nèi)存中從DSDI+LIST處開始的連續(xù)兩個(gè)單元內(nèi)容送入CX中,其中LIST是用符號(hào)表示的位移量,變址寄存器使用的是DI,所以默認(rèn)段為DS。,7基址加變址尋址 由指令中的基址寄存器內(nèi)容和變址寄存器內(nèi)容相加得到操作數(shù)的有效地址EA的尋址方式稱為基址加變址尋址,即 EA基址寄存器變址寄存器 如: MOV AX, BXSI ;或 MOV AX,BXSI MOV EAX,EDXEBP ;或 MOV EAX,EDXEBP,基址加變址尋址有16位和32位尋址兩種情況,每種情況下基址、變址寄存器的使用規(guī)定和段寄存器的默認(rèn)規(guī)定與基址尋址、變址尋址相同。但當(dāng)一種尋址方式中既有基址寄存器又有變址寄存器,而兩個(gè)寄存器默認(rèn)的段寄存器又不相同時(shí),一般規(guī)定由基址寄存器來決定默認(rèn)哪一個(gè)段寄存器作段基址指針。缺省時(shí)操作數(shù)所在段由指令中的基址寄存器決定,若使用BP、ESP或EBP,則默認(rèn)操作數(shù)在SS段中;若使用其他基址或變址寄存器,則默認(rèn)操作數(shù)在DS段中。如: MOV AX, BXSI ;基址寄存器是BX,默認(rèn)DS為段基址寄存器 MOV EAX,EBPECX ;基址寄存器是EBP,默認(rèn)SS為段基址寄存器 基址加變址尋址可用于二維數(shù)組操作(如檢索數(shù)組元素)和二重循環(huán)等。,例3-11 設(shè)(DS)=2000H,(SI)= 200H ,(BX)= 1000H ,(21200H)=21H,執(zhí)行指令MOV AL,SI+BX的結(jié)果是:(AL)=21H ,執(zhí)行過程如圖3-11所示。,圖3-11 例3-11基址加變址尋址示意圖,例3-12 執(zhí)行MOV BX,EDI+EAX的結(jié)果是將內(nèi)存中DSEDI+EAX處開始的連續(xù)兩個(gè)單元內(nèi)容送BX中。,8比例變址尋址 變址寄存器的內(nèi)容乘以比例因子再加上位移量得到操作數(shù)有效地址EA的尋址方式稱為比例變址尋址,即 EA變址寄存器比例因子位移量 比例變址尋址只有32位尋址一種情況。如: MOV EAX,TABLEESI*4 ;TABLE是位移量,4是比例因子 其中,乘比例因子的操作是在CPU內(nèi)部由硬件完成的。,例3-13 指令MOV EAX,50ESI*4的位移量是50,比例因子是4,執(zhí)行該指令時(shí),默認(rèn)DS為段基址,執(zhí)行過程如圖3-12所示。,圖3-12 比例變址尋址過程示意圖,例3-14 執(zhí)行指令MOV AX,LIST2*ESI的結(jié)果是將內(nèi)存中從DS:2*ESI+IST處開始的連續(xù)兩個(gè)單元內(nèi)容送AX中;執(zhí)行指令MOV CL,ESI+4*EAX的結(jié)果是將內(nèi)存中DS:ESI+4*EAX處的單元內(nèi)容送CL中;執(zhí)行指令MOV DX,EBP+4*ECX+9的結(jié)果是將內(nèi)存中從DS:EBP+4*ECX+9處開始的連續(xù)兩個(gè)單元內(nèi)容送入DX中。,9基址加比例變址尋址 由變址寄存器的內(nèi)容乘以比例因子再加上基址寄存器的內(nèi)容而得到操作數(shù)有效地址EA的尋址方式稱為基址加比例變址尋址方式,即 EA變址寄存器比例因子基址寄存器 基址加比例變址尋址只有32位尋址一種情況。如: MOV ECX,EDX*8EAX ;或MOV ECX,EDX*8+EAX MOV AX,EBX*4ESI ;或MOV AX,EBX*4ESI 基址加比例變址尋址方式主要用于數(shù)組元素大小為2、4、8字節(jié)時(shí)的二維數(shù)組檢索操作等場(chǎng)合。,例3-15 設(shè)(DS)=2000H,(DI)= 200H,(AX)= 1000H,(21204H)=32H,執(zhí)行指令MOV AL,DI+AX+4的結(jié)果是:(AL)=32H,執(zhí)行過程見圖3-13。,圖3-13 例3-15基址加比例變址尋址執(zhí)行過程示意圖,例3-16 執(zhí)行指令MOV BX,LISTESI+EAX的結(jié)果是將內(nèi)存中從DS:ESI+EAX+LIST處開始的連續(xù)兩個(gè)單元內(nèi)容送入BX中。,10帶位移的基址加變址尋址 由變址寄存器、基址寄存器內(nèi)容和位移量一同相加而得到操作數(shù)有效地址的尋址方式稱為帶位移的基址加變址尋址,即 EA變址寄存器基址寄存器位移量 帶位移的基址加變址尋址分為16位尋址和32位尋址兩種情況。變址、基址寄存器的使用約定和對(duì)段寄存器的默認(rèn)約定與前面所述相同。如: MOV AX,BX+DI+MASK ;或MOV AX,MASK BXDI ADD EDX,ESIEBP0FFFF000H ;或ADD EDX,0FFFF000HESIEBP 以執(zhí)行指令MOV AX,MASK BXDI為例,默認(rèn)DS為段基址,圖3-14是帶位移的基址加變址尋址過程示意圖。,圖3-14 帶位移的基址加變址尋址過程示意圖,11帶位移的基址加比例變址尋址 由變址寄存器內(nèi)容乘以比例因子、基址寄存器內(nèi)容和位移量一同相加而得到操作數(shù)有效地址的尋址方式稱為帶位移的基址加比例變址尋址,即 EA變址寄存器比例因子基址寄存器位移量 帶位移的基址加比例變址尋址只有32位尋址一種情況,這與比例變址尋址、基址加比例變址尋址方式一樣,各種約定和默認(rèn)情況同前所述。尋址過程中,變址寄存器內(nèi)容乘比例因子的操作是在CPU內(nèi)部由硬件完成的,其他操作與圖3-14所示相同。,例3-17 INC EDI*8ECX40 ;或INCEDI*8ECX40 當(dāng)二維數(shù)組的數(shù)組元素大小為2、4、8字節(jié),且數(shù)組起始地址不為0時(shí),適于用帶位移的基址加比例變址尋址方式進(jìn)行數(shù)組檢索操作。,3.1.3 程序存儲(chǔ)器尋址方式 1段內(nèi)相對(duì)尋址 在此尋址方式下,轉(zhuǎn)移后的指令與轉(zhuǎn)移指令本身在同一代碼段中,指令中的地址是一個(gè)相對(duì)于當(dāng)前IP內(nèi)容的位移量,它是一個(gè)帶符號(hào)數(shù),而轉(zhuǎn)移后指令的有效地址為 有效地址=(IP)+位移量 其中位移量是一個(gè)字節(jié)稱為短轉(zhuǎn)移,轉(zhuǎn)移的范圍是-128+127,可用SHORT表示;位移量是兩個(gè)字節(jié)稱為近轉(zhuǎn)移,轉(zhuǎn)移范圍是32 KB,可用NEAR表示。,例3-18 指令JMP SHORT AIM1是短轉(zhuǎn)移,SHORT表示為短轉(zhuǎn)移,AIM1為目的地址;指令JMP NEAR PTR AIM2是近轉(zhuǎn)移,NEAR表示為近轉(zhuǎn)移,AIM2為目的地址。 轉(zhuǎn)移后的目的地址,匯編語言在匯編時(shí),能自動(dòng)計(jì)算目的地址相對(duì)于當(dāng)前IP的內(nèi)容的位移量,然后替換目的地址。此尋址方式不影響代碼段寄存器CS的值,只影響指令指針I(yè)P的值。,2段間直接尋址 在段間直接尋址方式下,轉(zhuǎn)移后的指令與轉(zhuǎn)移指令本身不在同一代碼段中,匯編語言在匯編時(shí),自動(dòng)將指令中的目的地址的段基址和偏移量替換掉CS和IP原先的內(nèi)容。段間直接尋址方式也稱為遠(yuǎn)轉(zhuǎn)移,可用FAR表示。 例3-19 指令JMP FAR PTR AIM是遠(yuǎn)轉(zhuǎn)移,F(xiàn)AR表示為遠(yuǎn)轉(zhuǎn)移,AIM為目的地址。,3存儲(chǔ)器間接尋址 在存儲(chǔ)器間接尋址下,目的地址不直接出現(xiàn)在指令中,而是存儲(chǔ)在一個(gè)寄存器或者一個(gè)內(nèi)存單元中,因此,要先使用除立即數(shù)尋址以外的任意一種數(shù)據(jù)尋址方式獲取目的地址,然后判斷轉(zhuǎn)移到該目的地址是段內(nèi)轉(zhuǎn)移還是段間轉(zhuǎn)移,根據(jù)判斷結(jié)果按照段內(nèi)相對(duì)尋址和段間直接尋址兩種尋址方式的規(guī)則替換CS、IP 的內(nèi)容。 例3-20 指令JMP BX中的BX為目的地址,它將替代IP的內(nèi)容,為段內(nèi)轉(zhuǎn)移;指令JMP WORD PTR LISTSI+DI是用DS:SI+DI+LIST處開始的連續(xù)兩個(gè)單元內(nèi)容作目的地址,并用它替代IP的內(nèi)容,為段內(nèi)轉(zhuǎn)移;指令JMP EAX中的EAX為目的地址,高16位送CS,低16位送IP,為段間轉(zhuǎn)移。,3.2 指 令 系 統(tǒng),80x86的指令系統(tǒng)可以分為以下13個(gè)功能組。 (1) 數(shù)據(jù)傳送指令; (2) 算術(shù)運(yùn)算指令; (3) 邏輯運(yùn)算與移位指令; (4) 串操作指令; (5) 位操作指令; (6) 控制轉(zhuǎn)移指令; (7) 標(biāo)志操作指令; (8) 按條件設(shè)置字節(jié)指令; (9) 操作系統(tǒng)型指令; (10) 處理器控制指令; (11) 高級(jí)語言指令; (12) Cache管理指令; (13) 數(shù)字處理指令。,標(biāo)志操作指令、棧操作的相關(guān)指令已在第2章作過介紹。本節(jié)要介紹的指令包括:數(shù)據(jù)傳送指令、算術(shù)運(yùn)算指令、邏輯運(yùn)算與移位指令、位操作指令、按條件設(shè)置字節(jié)指令SET、操作系統(tǒng)型指令、處理器控制指令、高級(jí)語言指令、Cache管理指令和數(shù)字處理指令,串操作指令、控制轉(zhuǎn)移指令和高級(jí)語言指令將在第5章中介紹,CALL/RET指令將在第6章中介紹,輸入/輸出指令將在第10章中介紹。 需要說明的是,匯編語言對(duì)于指令的大小寫是不敏感的。,3.2.1 數(shù)據(jù)傳送指令 數(shù)據(jù)傳送指令可分為通用傳送指令、地址傳送指令、輸入/輸出指令、查表轉(zhuǎn)換指令XLAT和擴(kuò)展傳送指令MOVSX和MOVZX 1通用傳送指令 這類指令可分為一般傳送指令MOV、入出棧指令和交換指令XCHG。入出棧指令包括:壓棧/彈棧指令PUSH/POP、全部通用寄存器內(nèi)容壓棧和彈棧指令PUSHA/PUSHAD及POPA/POPAD。,1) 傳送指令MOV 格式: MOV OPRD1,OPRD2 功能:將OPRD2的內(nèi)容傳送到OPRD1中,并替換OPRD1中原來的內(nèi)容。 說明:MOV是操作碼,OPRD1和OPRD2分別是目的操作數(shù)和源操作數(shù)。源操作數(shù)可以是累加器、寄存器、存儲(chǔ)器以及立即操作數(shù),而目的操作數(shù)可以是累加器、寄存器和存儲(chǔ)器。數(shù)據(jù)傳送方向的示意圖如圖3-15所示。,圖3-15 MOV指令數(shù)據(jù)傳送方向的示意圖,(1) 除了代碼段寄存器CS和指令指針I(yè)P以外,可在CPU內(nèi)部寄存器之間任意傳送數(shù)據(jù)。 例3-21 MOV AL,BL MOV DL,CH MOV AX,DX MOV CX,BX MOV DS,BX MOV DX,ES MOV BX,DI MOV SI,BP,(2) 立即數(shù)傳送至CPU內(nèi)部的通用寄存器組,給這些寄存器賦初值。 例3-22 MOV CL,4 MOV AX,03FFH MOV SI,057BH,(3) 除了CS和IP以外,可實(shí)現(xiàn)CPU內(nèi)部寄存器與存儲(chǔ)器(所有尋址方式)之間的數(shù)據(jù)傳送,傳送的數(shù)據(jù)可以是一個(gè)字節(jié)、一個(gè)字或者一個(gè)雙字。 例3-23 MOV AL,BUFFER MOV AX,SI MOV EAX,EBX MOV DI,CX MOV SI,BLOCKBP MOV DS,DATASI+BX MOV DESTBP+DI,ES,但是,MOV指令不能實(shí)現(xiàn)存儲(chǔ)單元之間的數(shù)據(jù)傳送。若需要把地址即段內(nèi)的地址偏移量為AREA1的存儲(chǔ)單元的內(nèi)容,傳送至同一段內(nèi)的地址為AREA2的存儲(chǔ)單元中去,MOV指令不能直接完成這樣的傳送。若要實(shí)現(xiàn)兩個(gè)存儲(chǔ)單元之間的數(shù)據(jù)傳送,必須借助CPU的內(nèi)部寄存器來實(shí)現(xiàn)。例3-24給出了傳送方法。,例3-24 MOV AL,AREA1 MOV AREA2,AL (以累加器AL為例) 例3-25 若傳送的數(shù)據(jù)不是個(gè)字節(jié),而是一個(gè)數(shù)據(jù)塊,如100個(gè)數(shù)據(jù),給出所描述的程序段。 分析 解決的方法有兩個(gè): 方法1:采用與例3-24類似的200條指令來完成100個(gè)數(shù)據(jù)的傳送,這些指令的操作是重復(fù)的,每條指令的地址又是變化的。,方法2:為簡(jiǎn)化程序的編制,利用循環(huán)程序,方法是:每次循環(huán)都要修改源地址和目的地址,這就需要把源、目的地址分別放在兩個(gè)寄存器中,用寄存器間接尋址來尋找操作數(shù),修改了寄存器的內(nèi)容,就可以實(shí)現(xiàn)對(duì)地址的修改。再把循環(huán)次數(shù)的控制部分考慮進(jìn)去,就可得如下程序:,MOV SI,OFFSET AREA1 ;目的地址存于SI寄存器中 MOV DI,OFFSET AREA2 ;源地址存于DI寄存器中 MOV CX,100 ;計(jì)數(shù)器存于CX中 AGAIN: MOV AL,DI MOV SI,AL INC SI ;修改目的地址 INC DI ;修改源地址 DEC CX ;修改計(jì)數(shù)器的值 JNZ AGAIN,說明: 程序段中的AREA1和AREA2是立即數(shù)還是存儲(chǔ)單元地址,匯編程序是根據(jù)對(duì)符號(hào)的定義來加以區(qū)別的; 指令I(lǐng)NC和DEC分別是增量、減量指令,JNZ為轉(zhuǎn)移指令,將在第5章中作介紹。 OFFSET AREA1是指地址單元AREA1在段內(nèi)的地址偏移量。如前所述,在80x86中要尋找內(nèi)存操作數(shù)時(shí),必須以段地址(在某個(gè)段寄存器中)加上此單元的段內(nèi)地址偏移量,才能確定某一內(nèi)存單元的物理地址。 上述關(guān)于MOV指令的使用說明,是判斷MOV指令使用正確與否的依據(jù)。例3-26均為正確使用MOV指令的例子,而例3-27均為使用MOV指令不正確的例子。,例3-26 下列的指令均為正確的指令。 MOV AX,BX MOV DS,DX MOV AH,CX MOV BX,WORD PTR DX MOV AL,21H MOV 1000H,BX MOV 2000H,54H,例3-27 下列的指令均為錯(cuò)誤的指令。 MOV 47H,AX ;目的地址不可為立即數(shù) MOV CS,BX ;為CS賦值的方法不對(duì) MOV IP,DX ;為IP賦值的方法不對(duì) MOV CX,1000H ;兩個(gè)存儲(chǔ)單元的數(shù)據(jù)不可直接傳送 MOV DS,SS,2) 地址傳送指令 地址傳送指令主要用于傳送操作數(shù)的地址,包括:裝入有效地址指令LEA、裝入DS、ES、FS、GS、SS指令LDS、LES、LFS、LGS、LSS。 (1) 裝入有效地址指令LEA。 格式: LEA reg,mem 功能: 將有效地址(偏移地址)mem而不是mem的內(nèi)容裝入到一指定寄存器reg中。,說明: 源操作數(shù)必須是一個(gè)內(nèi)存操作數(shù),目的操作數(shù)必須是一個(gè)16位的通用寄存器。 該指令通常用來建立串操作指令所必須的寄存器指針。,例3-28 LEA BX,LIST 將變量LIST的地址偏移量部分送到BX。 例3-29 若BX寄存器的內(nèi)容是0400H,SI寄存器的內(nèi)容是003CH,執(zhí)行指令LEA BX,BX+SI+0F62H后,BX的內(nèi)容是什么? 執(zhí)行這條指令是將BX、SI的內(nèi)容與0F62H相加的結(jié)果送BX,即將0400H+003CH+0F62H=139EH送BX,所以,執(zhí)行完該條指令后(BX)139EH。它與MOV BX,BX+SI+0F62H的區(qū)別是執(zhí)行這條MOV指令,是將139EH表示的單元的內(nèi)容送BX。,例3-30 設(shè)EDX30H,ESI32H,DOLLAR=7580H,執(zhí)行LEA ECX,EDX4*ESIDOLLAR的結(jié)果是將有效地址7678H(30H432H7580H)傳送給ECX。 需指出的是,在很多場(chǎng)合下,LEA指令可以用相應(yīng)的源操作數(shù)為立即數(shù)的MOV指令代替。例如,指令MOV BX,OFFSET VARWORD與指令LEA BX,VARWORD的執(zhí)行效果是完全一樣的。區(qū)別在于前者是用偽指令運(yùn)算符OFFSET(將在第4章中作介紹)取得源操作數(shù),在程序執(zhí)行前,由匯編程序匯編時(shí)賦值;而后者是在執(zhí)行指令時(shí)賦值;LEA的源操作數(shù)可以用各種尋址方式,OFFSET運(yùn)算符的操作數(shù)只能是一個(gè)直接的存儲(chǔ)器符號(hào)。例如,指令LEA DX,TABLESI等效于下列兩條指令: MOV DX,OFFSET TABLE ADD DX,SI,(2) 加載DS/ES/FS/GS/SS指令LDS/LES/LFS/LGS/LSS。 格式: OPRD1,OPRD2 LDS reg, mem LES reg, mem LFS reg, mem LGS reg, mem LSS reg, mem 這里的mem是32位或48位遠(yuǎn)指針,reg是16位或32位任意通用寄存器。,功能:這5條指令的作用是將一個(gè)32位或48位的全地址指針(包括一個(gè)16位段選擇符和一個(gè)16位或32位偏移值)裝入一個(gè)段寄存器和一個(gè)通用寄存器。段寄存器由指令操作碼LDS、LES、LFS、LGS、LSS分別指定為DS、ES、FS、GS、SS,通用寄存器由目的操作數(shù)OPRD1指定。,說明: 對(duì)實(shí)地址方式和虛擬8086方式,這類指令取的是雙16位全地址指針。 例3-31 EXDWORD DD 12345678H LDS SI,EXDWORD 執(zhí)行LDS指令后,將高16位1234H送DS,低16位5678H送SI。 對(duì)16位和32位保護(hù)方式,是將選擇符送操作碼指定的段寄存器,有效地址送指令指定的通用寄存器。,例3-32 EXDWORD DD 12345678H ;定義偏移值 DW 0010H ;定義選擇符 LDS ESI,EXDWORD 執(zhí)行LDS指令后,將低32位偏移值12345678H送令中指定的通用寄存器ESI,將高16位選擇符0010H送DS。 LFS/LGS/LSS只能在80386以上的CPU中使用,主要用于處理不在當(dāng)前數(shù)據(jù)段中的數(shù)據(jù)。 例3-33 執(zhí)行LSS SP,LISTDI的結(jié)果是把DS:DI+LIST所指向單元內(nèi)容前兩個(gè)字節(jié)送到SP中,接下來的兩個(gè)字節(jié)送SS中,此時(shí)即可訪問棧單元。,3) 交換指令XCHG與字節(jié)交換指令BSWAP (1) 交換指令XCHG。 格式:XCHG OPRD1,OPRD2 功能:將源操作數(shù)OPRD2與目的操作數(shù)OPRD1相交換。 說明: 交換可在通用寄存器與累加器之間,通用寄存器之間,通用寄存器與存儲(chǔ)器之間進(jìn)行,但段寄存器不能作為一個(gè)操作數(shù)。兩個(gè)操作數(shù)可以是兩個(gè)寄存器操作數(shù),或一個(gè)寄存器與一個(gè)存儲(chǔ)器操作數(shù),相當(dāng)于三條指令:XCHG reg,reg、XCHG mem,reg和XCHG reg,mem。這里,reg是寄存器操作數(shù),mem是存儲(chǔ)器操作數(shù)。 OPRD1和OPRD2可以是字節(jié)、字或者雙字,但長(zhǎng)度應(yīng)相等。,例3-34 XCHG AL,CL XCHG AX,DI XCHG BX,SI XCHG AX,BUFFER ;設(shè)BUFFER為字單元 XCHG BX,DATASI XCHG AX,WORD PTR SI XCHG BL,1000H,(2) 字節(jié)交換指令BSWAP。 格式: BSWAP reg32 功能:將32位通用寄存器中的雙字以字節(jié)為單位進(jìn)行高、低字節(jié)交換。即對(duì)指定寄存器的32位操作數(shù),將位3124與位70、位2316與位158進(jìn)行交換,也就是將第一個(gè)字節(jié)與第四個(gè)字節(jié)交換,第二個(gè)字節(jié)與第三個(gè)字節(jié)交換。 說明: 這是一條80486擴(kuò)展的指令。, 可用于在兩種不同結(jié)構(gòu)的微處理器之間進(jìn)行數(shù)據(jù)的交換。多字節(jié)結(jié)構(gòu)的數(shù)據(jù)有兩種存儲(chǔ)方式:一種是Intel系列CPU采用的低位結(jié)尾的內(nèi)存字節(jié)排序方法,在這種方法中,多字節(jié)結(jié)構(gòu)數(shù)據(jù)的高位字節(jié)存放在內(nèi)存的高地址單元中;另一種是Motorola系列CPU采用高位結(jié)尾的內(nèi)存字節(jié)排序方法,數(shù)據(jù)存放順序正好與第一種相反。 例3-35 設(shè)(EAX)=12345678H,執(zhí)行指令BSWAP EAX的結(jié)果是:(EAX)=78563412H。,4) 查表轉(zhuǎn)換指令XLAT 格式: XLAT 功能:完成一個(gè)字節(jié)的查表轉(zhuǎn)換。在DSEBX處建立了一個(gè)256字節(jié)的表,用寄存器EBX作為基址,寄存器AL作為表的無符號(hào)下標(biāo)(即表指針),將AL指向的那個(gè)字節(jié)的內(nèi)容送回AL,即(EBX)(AL)AL。,說明: 在使用該指令之前,存儲(chǔ)器內(nèi)需有一個(gè)代碼轉(zhuǎn)換表,表首地址要送到EBX中,相對(duì)于表首的位移量送到AL中,則轉(zhuǎn)換后數(shù)據(jù)的有效地址為 有效地址=表首地址+位移量 即以EBX寄存器內(nèi)容作為表首、AL寄存器內(nèi)容作為位移量所對(duì)應(yīng)的表中數(shù)據(jù)送入寄存器AL中,并替換掉AL原先的內(nèi)容。, 該指令無顯式操作數(shù),操作數(shù)是隱含的。指令默認(rèn)段是數(shù)據(jù)段DS,而偏移量總是從寄存器EBX中得到。 指令執(zhí)行前AL是下標(biāo),執(zhí)行后AL是查表的結(jié)果。若要在其他段中查表,可加段前綴。 XLAT指令用于一些無規(guī)律的代碼轉(zhuǎn)換。,圖3-16 例3-36查表轉(zhuǎn)換指令執(zhí)行過程,例3-36 通過查表轉(zhuǎn)換指令,求09中任意一個(gè)數(shù)的平方。 程序段描述如下: TAB DB 1,4,9,16,25,36,49,64,81 MOV AX,SEG TAB MOV DS,AX MOV BX,OFFSET TAB MOV AL,5 XLAT 執(zhí)行該程序段后,(AL)=25,執(zhí)行過程見圖3-16。,5) 擴(kuò)展傳送指令MOVSX和MOVZX 格式: MOVSX OPRD1,OPRD2 MOVZX OPRD1,OPRD2 功能:MOVSX為帶符號(hào)擴(kuò)展傳送指令,將寄存器或存儲(chǔ)器中的8位符號(hào)數(shù)帶符號(hào)擴(kuò)展成16位或32位,16位符號(hào)數(shù)帶符號(hào)擴(kuò)展成32位,然后傳送給16位或32位寄存器。 MOVZX為零擴(kuò)展傳送指令,將寄存器或存儲(chǔ)器中的8位無符號(hào)數(shù)通過在高位加0擴(kuò)展成16位或32位,16位無符號(hào)數(shù)通過加0擴(kuò)展成32位,然后傳送給16位或32位寄存器。,說明: 對(duì)帶符號(hào)數(shù)補(bǔ)碼,經(jīng)MOVSX擴(kuò)展后的結(jié)果與擴(kuò)展前真值是相等的,只是補(bǔ)碼位數(shù)不同而已;經(jīng)MOVZX擴(kuò)展后,無符號(hào)數(shù)的真值不變。這兩條指令常被用于作除法時(shí)對(duì)被除數(shù)位數(shù)的擴(kuò)展。例如,MOVSX ECX,AL是將AL內(nèi)容帶符號(hào)擴(kuò)展為32位送入ECX;MOVZX EAX,CX是將CX中16位數(shù)高位加0擴(kuò)展為32位送EAX。 擴(kuò)展規(guī)則:對(duì)MOVSX而言,若OPRD2內(nèi)容是正數(shù),則擴(kuò)展后的高8位或16位全填0;若OPRD2內(nèi)容是負(fù)數(shù),則擴(kuò)展后的高8位或16位全填1;對(duì)MOVZX而言,擴(kuò)展后的高8位或16位全填0。, 在MOVSX OPRD1,OPRD2和MOVZX OPRD1,OPRD2中,OPRD1可以是16位或32位的寄存器,而OPRD2可以是16位的寄存器或是8位的存儲(chǔ)單元,OPRD1的長(zhǎng)度必須是OPRD2的長(zhǎng)度的一倍。 該指令僅限于80386以上的CPU。 例3-37 設(shè)(AL)= 42H, (CX)=9687H,(DS)=2000H,(22000H)=0A8H,分別執(zhí)行:MOVSX BX,AL、MOVSX EDX,CX、MOVSX DX,2000H、MOVZX BX,AL和MOVZX DX,2000H 5條指令,5條指令的執(zhí)行結(jié)果如表3-1所示(帶下劃線的數(shù)據(jù)是指令執(zhí)行后按指令的要求應(yīng)填補(bǔ)的內(nèi)容)。,表3-1 例3-37執(zhí)行結(jié)果示意,3.2.2 算術(shù)運(yùn)算指令 這類指令的源操作數(shù)與目的操作數(shù)均為二進(jìn)制數(shù),可以是8位、16位或32位的帶符號(hào)數(shù)或無符號(hào)數(shù)(如果是帶符號(hào)數(shù),則最高位為符號(hào)位),也可以是無符號(hào)的組合、未組合BCD碼數(shù)。算術(shù)運(yùn)算指令還支持十進(jìn)制調(diào)整和數(shù)據(jù)寬度變換指令等。這類指令如加、減、比較等是雙操作數(shù)指令、加1或減1指令等是單操作數(shù)指令、有符號(hào)整數(shù)乘法指令I(lǐng)MUL等是三操作數(shù)指令,而十進(jìn)制調(diào)整和數(shù)據(jù)寬度交換等指令則為無操作數(shù)指令。,除數(shù)據(jù)寬度變換指令外,算術(shù)運(yùn)算指令的操作結(jié)果一般會(huì)影響EFLAGS寄存器中的狀態(tài)標(biāo)志位,主要是影響進(jìn)位標(biāo)志CF、輔助進(jìn)位標(biāo)志AF、符號(hào)標(biāo)志SF、零標(biāo)志ZF、奇偶標(biāo)志PF、溢出標(biāo)志OF。 80X86提供了各種校正操作,故可進(jìn)行十進(jìn)制算術(shù)運(yùn)算。參與加、減運(yùn)算的操作數(shù)如圖3-17所示。從圖3-17可看出,加法和減法指令的目的操作數(shù)可以是累加器、任一通用寄存器或存儲(chǔ)單元,但不能為立即數(shù)。,圖3-17 加減運(yùn)算操作示意圖,1加法/減法指令A(yù)DD/SUB 格式: ADD OPRD1,OPRD2 SUB OPRD1,OPRD2 功能: (1) ADD是將OPRD2的內(nèi)容與OPRD1的內(nèi)容相加,并將相加結(jié)果送到OPRD1中,替換掉OPRD1原來的內(nèi)容,即OPRD1OPRD1+OPRD2。 (2) SUB是用OPRD1的內(nèi)容減去OPRD2的內(nèi)容,并將相減結(jié)果送到OPRD1中,替換掉OPRD1原來的內(nèi)容,即OPRD1OPRD1-OPRD2。,說明: 實(shí)現(xiàn)累加器與立即數(shù),累加器與任一通用寄存器,累加器與存儲(chǔ)單元內(nèi)容相加/減,和/差放在累加器中。 例3-38 ADD AL, 30 ADD AX, 3000H ADD AX, SI ADD AL, DATABX SUB AX, BX SUB EAX, EDX, 實(shí)現(xiàn)任一通用寄存器與立即數(shù)相加/減,與累加器或另一個(gè)通用寄存器相加/減,與存儲(chǔ)單元的內(nèi)容相加/減,和/差放在寄存器中。 例3-39 ADD BX, 3FFH ADD SI, AX ADD DI, CX ADD DX, DATABX+SI SUB DX, 3FFH SUB DI, AX SUB BX, CX SUB BX, BUFBX+SI, 實(shí)現(xiàn)存儲(chǔ)器操作數(shù)與立即數(shù)相加/減,與累加器或別的寄存器相加/減,和/差放至此存儲(chǔ)單元中。 例3-40 ADD BETASI,100 ADD BETASI,AX ADD BETASI,DX SUB BUFSI,200 SUB BUFSI,AX SUB BUFSI,DX, 段寄存器CS和指令指針I(yè)P不能作為OPRD1。OPRD1和OPRD2可以是字節(jié)、字或者雙字,但是長(zhǎng)度應(yīng)當(dāng)相等。 加減指令對(duì)標(biāo)志位CF、OF、PF、SF、ZF和AF的影響如下:,2帶進(jìn)位的加法指令A(yù)DC/帶借位的減法指令SBB 格式: ADC OPRD1,OPRD2 SBB OPRD1,OPRD2 功能:這兩條指令與ADD和SUB指令類似,只是在兩個(gè)操作數(shù)相加/減時(shí),要加/減進(jìn)位標(biāo)志CF的現(xiàn)行值,結(jié)果送至目的操作數(shù): (1) ADC是將OPRD2的內(nèi)容、OPRD1的內(nèi)容和進(jìn)位標(biāo)志CF內(nèi)容相加,并將相加結(jié)果送到OPRD1,即OPRD1OPRD1+OPRD2+CF。 (2) SBB是用OPRD1的內(nèi)容減去OPRD2的內(nèi)容再減去進(jìn)位標(biāo)志CF內(nèi)容,并將相減結(jié)果送到OPRD1,即OPRD1OPRD1-OPRD2-CF。,例3-41 指令A(yù)DC ECX,EAX實(shí)現(xiàn)的功能是將ECX內(nèi)容、EAX的內(nèi)容與CF內(nèi)容相加,相加結(jié)果送到EAX中; 指令SBB DI,100實(shí)現(xiàn)的功能是用DSDI所指單元的內(nèi)容減去100再減去CF內(nèi)容,結(jié)果送到DSDI指向的字節(jié)單元中。 說明:ADC/SBB指令主要用于多字節(jié)運(yùn)算中。在80x86中可以進(jìn)行8位運(yùn)算、16位運(yùn)算,也可以進(jìn)行32位運(yùn)算,但是32位二進(jìn)制數(shù)的表達(dá)范圍仍然是很有限的。為了擴(kuò)大數(shù)的范圍,仍然需要多字節(jié)運(yùn)算。,例3-42 在8086中可以進(jìn)行8位運(yùn)算和16位運(yùn)算,若要進(jìn)行32位的運(yùn)算,直接使用加減法指令就不行了?,F(xiàn)有兩個(gè)四字節(jié)的數(shù)相加,加法要分兩次進(jìn)行,先進(jìn)行低兩字節(jié)相加,然后再做高兩字節(jié)相加。在高兩字節(jié)相加時(shí)要把低兩字節(jié)相加以后的進(jìn)位考慮進(jìn)去,就要用到帶進(jìn)位的加法指令A(yù)DC。 設(shè)這兩個(gè)四字節(jié)的數(shù)已分別放在自FIRST和SECOND開始的存儲(chǔ)區(qū)中,每個(gè)數(shù)占四個(gè)存儲(chǔ)單元,存放時(shí)低字節(jié)存放在低地址處,實(shí)現(xiàn)這兩個(gè)四字節(jié)的數(shù)相加的程序段描述如下:,MOV AX,0 MOV BX,OFFSET FIRST ADD AX,BX MOV DX,OFFSET SECOND ADD AX,DX MOV THIRD,AX MOV AX,BX+2 ADC AX,DX+2 MOV THIRD+2,AX,例3-43 在80486中,若要完成64位加、減法運(yùn)算,可用下述程序段: ADD EAX,ECX ;EBXEAX(EBXEAX)+(EDXECX) ADC EBX,EDX SUB EAX,ECX ;EBXEAX(EBXEAX)-(EDXECX) SBB EBX,EDX 由此可看出,在80486中,64位加、減法運(yùn)算的實(shí)現(xiàn),通常要綜合使用ADD/SUB和ADC/SBB指令。, ADC和SBB指令對(duì)標(biāo)志位的影響如下:,3加1/減1指令I(lǐng)NC/DEC 格式: INC OPRD DEC OPRD 功能:完成對(duì)指定的操作數(shù)OPRD加/減1,然后返回此操作數(shù): INC是將OPRD的內(nèi)容加1,并將結(jié)果送回到OPRD中,即OPRDOPRD +1; DEC是將OPRD的內(nèi)容減1,并將結(jié)果送回到OPRD中,即OPRDOPRD -1。,說明: 這是單操作數(shù)的指令,常用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)等。 例3-44 在例3-25中,實(shí)現(xiàn)100個(gè)數(shù)據(jù)的傳送時(shí),使用了指令:INC SI和INC DI,其功能是每傳送完一個(gè)字節(jié)的數(shù)據(jù)后,源、目的地址均要增1,而DEC CX是每傳送完一個(gè)字節(jié)的數(shù)據(jù)后,計(jì)數(shù)器的值減1。, INC指令和DEC指令對(duì)標(biāo)志位的影響如下:,由此可看出,INC/DEC指令影響標(biāo)志位AF、SF、ZF、PF、OF,但不影響CF。所以用INC/DEC進(jìn)行循環(huán)計(jì)數(shù)時(shí),試圖以判斷CF1來結(jié)束循環(huán)是不行的,而且還會(huì)導(dǎo)致程序運(yùn)行進(jìn)入死循環(huán)。這點(diǎn)要特別注意。, INC/DEC指令的操作數(shù)可以是通用寄存器,也可以是存儲(chǔ)單元。,4互換相加指令XADD 格式: XADD OPRD1,OPRD2 功能:將OPRD1(8位、16位或32位寄存器或存儲(chǔ)單元)與OPRD2(8位、16位或32位寄存器)的值相加,結(jié)果存于OPRD1中,同時(shí)將相加前OPRD1的內(nèi)容送到OPRD2中。 說明: XADD實(shí)現(xiàn)的交換是在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲(chǔ)器之間進(jìn)行,但段寄存器不能作為一個(gè)操作數(shù)。,例3-45 XADD AL,CL XADD AX,DI XADD BX,SI XADD EAX,ECX XADD NUMBLE,EBX, XADD是80486新增的指令,它對(duì)標(biāo)志位的影響與ADD/SUB指令的相同,即影響的標(biāo)志位有:CF、AF、SF、ZF、PF、OF。 該指令可帶LOCK前綴,前綴的概念將在5.5節(jié)中介紹。 例3-46 設(shè)(CL)=13H,(AH) = 34H,執(zhí)行指令 XADD CL,AH 的結(jié)果是:(CL)= 13H+34H = 47H,(AH)= 13H。,5求補(bǔ)指令NEG 格式: NEG OPRD 功能:對(duì)OPRD取補(bǔ),即相當(dāng)于執(zhí)行“OPRD0OPRD”操作。 說明: NEG指令實(shí)質(zhì)上執(zhí)行的是減法操作。它改變的是操作數(shù)的符號(hào),即將正數(shù)變成負(fù)數(shù)或?qū)⒇?fù)數(shù)變成正數(shù),但絕對(duì)值不變。,例3-47 若(AH)13H,執(zhí)行NEG AH指令后,(AH)=0EDH;若(BX)03H,執(zhí)行NEG BX指令后,(BX)=0FFFFDH。 OPRD可以是字節(jié)或字操作數(shù)。 NEG指令對(duì)標(biāo)志位的影響與SUB指令相同,即影響的標(biāo)志位有:CF、AF、SF、ZF、PF、OF。,6比較指令CMP 格式:CMP OPRD1,OPRD2 功能:用OPRD1的內(nèi)容減去OPRD2的內(nèi)容,結(jié)果反映在標(biāo)志位上但相減結(jié)果并不送到OPRD1。 說明: 累加器與立即數(shù)、任一通用寄存器或

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論