微機(jī)原理與接口技術(shù) 南京信息工程大學(xué)第3章-80X86微處理器指令系統(tǒng)_第1頁(yè)
微機(jī)原理與接口技術(shù) 南京信息工程大學(xué)第3章-80X86微處理器指令系統(tǒng)_第2頁(yè)
微機(jī)原理與接口技術(shù) 南京信息工程大學(xué)第3章-80X86微處理器指令系統(tǒng)_第3頁(yè)
微機(jī)原理與接口技術(shù) 南京信息工程大學(xué)第3章-80X86微處理器指令系統(tǒng)_第4頁(yè)
微機(jī)原理與接口技術(shù) 南京信息工程大學(xué)第3章-80X86微處理器指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩107頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章80X86微處理器指令系統(tǒng)1NUIST主要內(nèi)容尋址方式8086/8088指令系統(tǒng)32位處理器指令系統(tǒng)2隱含于機(jī)器指令內(nèi)3.1尋址方式處理的數(shù)據(jù)在什么地方?要處理的數(shù)據(jù)有多長(zhǎng)?操作碼操作數(shù)……操作數(shù)指令的一般格式:33.1尋址方式操作碼指計(jì)算機(jī)所要執(zhí)行的操作,是一種助記符。操作數(shù)在指令執(zhí)行操作的過(guò)程中所需要的數(shù)據(jù)。該字段可以是操作數(shù)本身,也可以是操作數(shù)地址或是地址的一部分,還可以是指向操作數(shù)地址的指針或其它有關(guān)操作數(shù)的信息。

如何尋找操作數(shù)就是尋址方式4立即尋址匯編指令機(jī)器碼用C語(yǔ)言描述MOVAX,10HB81000H(AX)=16MOVAL,28HB028H(AL)=40操作數(shù)直接放在指令中,緊跟在操作碼后,與操作碼一起放在代碼段5立即尋址B8H10H00HB0H28H操作碼操作數(shù)操作碼操作數(shù)MOV AX,0010HAHAL10H00HMOV AL,28HAL28H代碼段6立即尋址立即數(shù)只能作源操作數(shù),不能作目標(biāo)操作數(shù)。立即數(shù)應(yīng)與目標(biāo)操作數(shù)的長(zhǎng)度一致立即數(shù)默認(rèn)采用十進(jìn)制,采用十六進(jìn)制數(shù)以“H”為后綴,2進(jìn)制數(shù)以“B”為后綴。以16進(jìn)制形式出現(xiàn)的立即數(shù),若以字母開(kāi)頭,需以數(shù)字0為前綴。立即數(shù)只能是整數(shù),不能是小數(shù)或其他類(lèi)型的數(shù)據(jù)。注意7寄存器尋址匯編指令機(jī)器碼用C語(yǔ)言描述指令執(zhí)行前數(shù)據(jù)的位置

MOVAX,BXB9D8H(AX)=(BX)CPU內(nèi)寄存器BXMOVAL,BL88DBH(AL)=(BL)CPU內(nèi)寄存器BL操作數(shù)包含在CPU的內(nèi)部寄存器中,如寄存器AX、BX、CX、DX等。寄存器可以是8位或者16位。8寄存器尋址B9HD8H操作碼MOV AX,BXAXBX1234H1234H代碼段9寄存器尋址源操作數(shù)的長(zhǎng)度必須與目的操作數(shù)一致。16位操作數(shù):AX,BX,CX,DX,DI,SI,SP和BP等8位操作數(shù):AH,AL,BH,BL,CH,CL,DH和DL兩個(gè)操作數(shù)不能同時(shí)為段寄存器目標(biāo)操作數(shù)不能為CS注意10直接尋址匯編指令機(jī)器碼指令執(zhí)行前數(shù)據(jù)的位置

MOVAX,[2]A10200H內(nèi)存的DS:2~3單元MOVAL,[2]A00200H內(nèi)存的DS:2單元MOVBX,ES:[2]8B1E0200H

內(nèi)存的ES:2~3單元操作數(shù)在內(nèi)存中,指令中以具體數(shù)值的形式給出操作數(shù)所在單元的有效地址EA。邏輯地址為段地址(SA):偏移地址(EA)。11直接尋址A0H02H00H1234操作碼代碼段567810000H20000H20001H20002H20003H地址低位地址高位數(shù)據(jù)段20DS00MOV AL,[0002H]20000H+0002H20002H偏移量左移4位AL56H12直接尋址A1H02H00H1234操作碼代碼段567810000H20000H20001H20002H20003H地址低位地址高位數(shù)據(jù)段20DS00MOV AX,[0002H]20000H+0002H20002H偏移量左移4位AL56HAH78H13寄存器間接尋址操作數(shù)在內(nèi)存中,操作數(shù)地址的16位EA包含在以下寄存器SI、DI、BP、BX中。為了區(qū)別于寄存器尋址方式,指令中指定的寄存器名要用“[]”括起來(lái)。分成兩種情況:以SI、DI、BX間接尋址,則通常操作數(shù)在現(xiàn)行數(shù)據(jù)段區(qū)域中,此時(shí)(DS)×16+[REG]

為操作數(shù)的地址,REG表示寄存器可以是SI、DI、BX。以寄存器BP間接尋址,操作數(shù)在堆棧段中。即(SS)×16+(BP)作為操作數(shù)的地址。14寄存器間接尋址B8H04H1234操作碼代碼段567810000H21000H21001H21002H21003H數(shù)據(jù)段20DS00MOV AX,[SI]20000H+1000H21000H左移4位MOV SI,1000H10SI00AL12HAH34H15寄存器相對(duì)尋址操作數(shù)在存儲(chǔ)器中,由指定的寄存器內(nèi)容,加上指令中給出的8位或16位偏移量作為操作數(shù)的偏移地址。寄存器為四個(gè)寄存器SI、DI、BX、BP之一

尋址方式含義[BX+idata]/idata[BX]EA=(BX)+idata,SA=(DS)[SI+idata]/idata[SI]EA=(SI)+idata,SA=(DS)[DI+idata]/idata[DI]EA=(DI)+idata,SA=(DS)[BP+idata]/idata[BP]EA=(BP)+idata,SA=(SS)16寄存器相對(duì)尋址B8H47H011234操作碼代碼段567810000H21000H21001H21002H21003H數(shù)據(jù)段20DS00MOV AX,[BX+1]20000H1000H21001H左移4位MOV BX,1000H10BX00AL34HAH56H+0001H17基址加變址尋址操作數(shù)在存儲(chǔ)器中其偏移地址由(基址寄存器)+(變址寄存器)形成基址寄存器——BX(數(shù)據(jù)段),BP(堆棧段)

變址寄存器——SI、DI

尋址方式含義[BX+SI]/[BX][SI]EA=(BX)+(SI),SA=(DS)[BX+DI]/[BX][DI]EA=(BX)+(DI),SA=(DS)[BP+SI]/[BP][SI]EA=(BP)+(SI),SA=(SS)[BP+DI]/[BX][DI]EA=(BP)+(DI),SA=(SS)18基址加變址尋址8BH00H1234操作碼代碼段567810000H21000H21001H21002H21003H數(shù)據(jù)段20DS00MOV AX,[BX+SI]20000H1000H21001H左移4位MOV BX,1000H10BX00AL34HAH56H+0001HMOV SI,0001H00SI0119相對(duì)基址變址尋址操作數(shù)在存儲(chǔ)器中偏移地址:(基址寄存器)+(變址寄存器)+相對(duì)偏移量尋址方式含義[BX+SI+idata]/idata[BX][SI]EA=(BX)+(SI)+idata,SA=(DS)[BX+DI+idata]/idata[BX][DI]EA=(BX)+(DI)+idata,SA=(DS)[BP+SI+idata]/idata[BP][SI]EA=(BP)+(SI)+idata,SA=(SS)[BP+DI+idata]/idata[BX][DI]EA=(BP)+(DI)+idata,SA=(SS)20相對(duì)基址變址尋址8BH40H011234操作碼代碼段567810000H21000H21001H21002H21003H數(shù)據(jù)段20DS00MOV AX,[BX+SI+1]20000H1000H21002H左移4位MOV BX,1000H10BX00AL56HAH78H0001HMOV SI,0001H00SI01+0001H21尋址方式小結(jié)從直接尋址方式開(kāi)始的尋址方式中,操作數(shù)都存放在除代碼段以外的內(nèi)存區(qū)域中,通過(guò)求得操作數(shù)所在的有效地址,取得操作數(shù)。比較這幾種尋址方式:

[idata]用一個(gè)常量來(lái)表示地址,可以用于直接定位一個(gè)內(nèi)存單元;[BX]用一個(gè)變量來(lái)表示內(nèi)存地址,可以用于間接定位一個(gè)內(nèi)存單元;[BX+idata]用一個(gè)變量和常量來(lái)表示地址,可以在一個(gè)起始地址的基礎(chǔ)上用變量間接定位一個(gè)內(nèi)存單元;[BX+SI]用兩個(gè)變量表示地址;[BX+SI+idata]用兩個(gè)變量和一個(gè)常量表示地址。22尋址方式小結(jié)

有關(guān)帶[]地址表達(dá)式必須遵守下列規(guī)則:立即數(shù)可以出現(xiàn)在[]內(nèi),表示直接地址,如[1000H]只有BX、BP、SI和DI四個(gè)寄存器可以出現(xiàn)在[]內(nèi),它們可以單獨(dú)出現(xiàn),也可以組合起來(lái)(只能相加),或以常數(shù)與寄存器相加的形式出現(xiàn),但BX和BP寄存器不允許出現(xiàn)在同一個(gè)[]內(nèi),SI和DI也不能同時(shí)出現(xiàn)。23尋址方式小結(jié)

有關(guān)帶[]地址表達(dá)式必須遵守下列規(guī)則:由于方括號(hào)有相加的含義,下面幾種方法是等價(jià)的6[BX][SI] [BX+6][SI] [BX+SI+6]6[BX+SI]若[]內(nèi)包含BP,則隱含使用SS來(lái)提供基地址,物理地址=16SS+EA其余情況隱含使用DS提供基地址段超越前綴的使用24課堂練習(xí)指出下列指令中源操作數(shù)和目的操作數(shù)的尋址方式MOVBX,20HMOVDX,[SI]MOV[BP][SI],AXMOV[1800H],AL指令源操作數(shù)目的操作數(shù)立即尋址寄存器尋址寄存器間接尋址寄存器尋址寄存器尋址基址加變址尋址寄存器尋址直接尋址25課堂練習(xí)判斷下列操作數(shù)尋址方式的正確性操作數(shù)判斷錯(cuò)誤原因AX不能用于寄存器間接尋址[AX]BPDS[BX+BP+32][CX+90]BX+90H

BX和BP都是基址寄存器

CX不能用于寄存器相對(duì)尋址

無(wú)此尋址方式26NUIST主要內(nèi)容尋址方式8086/8088指令系統(tǒng)32位處理器指令系統(tǒng)273.2指令系統(tǒng)數(shù)據(jù)傳送指令1算術(shù)運(yùn)算指令2邏輯運(yùn)算指令3移位指令和循環(huán)移位指令4處理器控制指令5283.2.1數(shù)據(jù)傳送指令MOV指令棧指令交換指令累加器專(zhuān)用傳送指令地址傳送指令標(biāo)志位傳送指令29MOV指令格式:MOVDST,SRC;(DST)←(SRC)說(shuō)明:MOV是操作碼,DST和SRC分別是目的操作數(shù)和源操作數(shù)。執(zhí)行后,目的操作數(shù)改變,源操作數(shù)不變。指令格式舉例MOVREG,idataMOVAX,8MOVREG,REGMOVBX,AXMOVREG,MEMMOVAX,[0000H]MOVMEM,REGMOV[0000H],AX30MOV指令格式:MOVDST,SRC;(DST)←(SRC)說(shuō)明:MOV是操作碼,DST和SRC分別是目的操作數(shù)和源操作數(shù)。執(zhí)行后,目的操作數(shù)改變,源操作數(shù)不變。指令格式舉例MOVSREG,REGMOVDS,AXMOVREG,SREGMOVAX,DSMOVSREG,MEMMOVDS,[0000H]MOVMEM,SREGMOV[0000H],DSMOVMEM,idataMOVBYTEPTR[0000H],01H31MOV指令運(yùn)行傳送數(shù)據(jù)的途徑存儲(chǔ)器MEM立即數(shù)idata段寄存器CS,DS,ES,SS通用寄存器AX,AHBX,ALCX,BHDX,BLSI,CHDI,CLSP,DHBP,DL32MOV指令立即數(shù)和CS只能作為源操作數(shù)IP和FR都不允許作為源操作數(shù)和目的操作數(shù)立即數(shù)不允許直接送至DS,ES,SS或CS源操作數(shù)和目的操作數(shù)不能同時(shí)是內(nèi)存操作數(shù)源操作數(shù)和目的操作數(shù)必須類(lèi)型相同(同為字節(jié)或字類(lèi)型)注意33MOV指令存儲(chǔ)器傳送指令中,不允許對(duì)CS和IP進(jìn)行操作;不允許兩個(gè)存儲(chǔ)器操作數(shù)之間直接進(jìn)行信息傳送兩個(gè)段寄存器之間不能直接傳送信息,也不允許用立即尋址方式為段寄存器賦初值目的操作數(shù),不能用立即尋址方式;操作數(shù)類(lèi)型要匹配,字對(duì)字,字節(jié)對(duì)字節(jié)傳送。MOVIP,0010HMOVCS,AXMOV[1230H],[0010H]MOVAX,[0010H],MOV[1230H],AXMOVDS,SSMOVDS,1000HMOV1234H,AXMOVBX,AL34棧指令棧是一種具有特殊訪問(wèn)方式的存儲(chǔ)空間,它的特殊性就在于,最后進(jìn)入這個(gè)空間的數(shù)據(jù)最先出去(后進(jìn)先出)1234在基于8086CPU編程的時(shí)候,可以通過(guò)指令將一段內(nèi)存當(dāng)作棧來(lái)使用。??臻g的使用是從高地址往低地址方向的。棧底棧頂35棧指令CPU如何知道哪一段內(nèi)存空間作為??臻g使用?CPU如何知道棧頂?shù)奈恢茫?/p>

回憶寄存器SS和SP的作用是什么任意時(shí)刻SS:SP指向棧頂元素。36棧指令PUSH和POP指令指令格式說(shuō)明PUSHREG將一個(gè)寄存器中的數(shù)據(jù)入棧PUSHSREG將一個(gè)段寄存器中的數(shù)據(jù)入棧PUSHMEM將內(nèi)存單元處的字入棧POPREG將棧頂?shù)臄?shù)據(jù)送入一個(gè)寄存器中POPSREG將棧頂?shù)臄?shù)據(jù)送入一個(gè)段寄存器中(不能是CS)POPMEM將棧頂?shù)臄?shù)據(jù)送入內(nèi)存單元兩個(gè)操作都是以字為單位進(jìn)行的37棧指令PUSHAX的執(zhí)行過(guò)程(1)(SP)=(SP)

2,SS:SP指向當(dāng)前棧頂前面的單元,以當(dāng)前棧頂上面的單元為新的棧頂;(2)將AX中的內(nèi)容送入SS:SP指向的內(nèi)存單元處,此時(shí)SS:SP指向新棧頂。1234AX20000H2000AH2000BH2000CH2000DH2000EH2000FH20010HSS:SP123438棧指令POPBX的執(zhí)行過(guò)程(1)將SS:SP指向的內(nèi)存單元處的一個(gè)字?jǐn)?shù)據(jù)送入BX中

;(2)(SP)=(SP)

+2,SS:SP指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂

BX20000H2000AH2000BH2000CH2000DH2000EH2000FH20010HSS:SP123439棧指令棧指令與MOV指令的區(qū)別PUSH和POP指令訪問(wèn)的內(nèi)存單元地址不是在指令中給出的,而是由SS:SP指出的;CPU執(zhí)行MOV指令只需要一步操作;而執(zhí)行PUSH和POP指令則要分兩步,先修改SP,然后向SS:SP傳送,或先取SS:SP處的數(shù)據(jù),后改變SP。40分析兩段指令的執(zhí)行結(jié)果MOVAX,2000HMOVDS,AXMOVAX,1234HMOV[0000H],AXMOV AX,2000HMOV SS,AXMOV SP,2MOV AX,1234HPUSHAX2000HAX2000HDS1234HAXDS:020000H20001H20002H20003H12342000HAX2000HSS0002HSPSS:SP20000H20001H20002H20003H1234HAX123441課堂練習(xí)設(shè)(SS)=1250H,(SP)=0240H,若在堆棧中取出2個(gè)數(shù)據(jù),則棧頂?shù)奈锢淼刂窞?/p>

H,如果又在棧中存入5個(gè)數(shù)據(jù),則棧頂?shù)奈锢淼刂窞?/p>

H。初始時(shí)刻棧頂物理地址=(SS)×16+(SP)=12500H+0240H=12740H取出2個(gè)數(shù)據(jù)后,(SP)=(SP)+4當(dāng)前棧頂物理地址

=12740H+4=12744H再存入5個(gè)數(shù)據(jù)后,(SP)=(SP)-10當(dāng)前棧頂物理地址

=12744H-10=1273AH127441273A42交換指令交換指令XCHG的作用是把一個(gè)字節(jié)或一個(gè)字的源操作數(shù)與目的操作數(shù)相交換

指令格式舉例XCHGREG,REGXCHGCL,BLXCHGREG,MEMXCHGBX,[0]XCHGMEM,REGXCHG[0],BX43交換指令交換能在通用寄存器與累加器之間、通用寄存器之間、通用寄存器與存儲(chǔ)器之間進(jìn)行但段寄存器和立即數(shù)不能作為一個(gè)操作數(shù),不能在累加器之間進(jìn)行。如果需要交換兩個(gè)內(nèi)存操作數(shù),需要使用一個(gè)寄存器作為臨時(shí)存儲(chǔ)容器,并把MOV指令和XCHG指令結(jié)合起來(lái)使用MOVAX,[0100H]XCHGAX,[1000H]MOV[0100H],AX

如何用堆棧實(shí)現(xiàn)同樣的功能?44DS:0100HDS:1000HDS:0101HDS:1001H…34127856交換指令MOV AX,[0100H]XCHGAX,[1000H]MOV[0100H],AX12345678棧底棧頂PUSH[0100H]PUSH[1000H]POP[0100H]POP[1000H]5678123445累加器專(zhuān)用傳送指令

IN指令從I/O端口輸入數(shù)據(jù)至AL或AX指令格式含義INAL,port(AL)←(port)INAX,port(AX)←(port+1)(port)INAL,DX(AL)←((DX))INAX,DX(AX)←((DX+1),(DX))46累加器專(zhuān)用傳送指令OUT指令將AL或AX中的內(nèi)容傳送到一個(gè)輸出端口指令格式含義OUTport,AL(AL)→(port)OUTport,AX(AX)→(port+1)(port)OUTDX,AL(AL)→((DX))OUTDX,AX(AX)→((DX+1),(DX))若端口地址超過(guò)255時(shí),則必須用DX保存端口地址,這樣用DX作端口尋址最多可尋找64K個(gè)端口。47課堂練習(xí)22H226EH20H1020H已知AX=1020H,DX=3080H,端口地址PORT=41H,(40H)=6EH,(41H)=22H,指出下列各條指令執(zhí)行的結(jié)果(1)INAL,PORT;AL=

.(2)INAX,40H;AX=.(3)OUTDX,AL;(DX)=.(4)OUTDX,AX;(DX)=

.48XLAT指令一般格式XLAT;(AL)=((DS)

×16+(BX)

+(AL))要求:①寄存器AL的內(nèi)容作為一個(gè)256字節(jié)的表的下標(biāo);②表的基地址在BX中;③轉(zhuǎn)換后的結(jié)果存放在AL中.49XLAT指令例3-1:已知AL中有一個(gè)0~9范圍內(nèi)的數(shù),試用查表指令寫(xiě)出能查找出該數(shù)平方值的程序分析:為了進(jìn)行查表,必須確定一張0~9的平方值表。若平方值表的起始地址為21000H,則相應(yīng)平方值表如圖:表中AL中之?dāng)?shù)恰好等于該數(shù)平方值對(duì)表起始地址的偏移量設(shè)(DS)=2000H21000H21001H21002H21003H21004H21005H21006H21007H21008H21009H…0149162536496481…50XLAT指令例3-1:已知AL中有一個(gè)0~9范圍內(nèi)的數(shù),試用查表指令寫(xiě)出能查找出該數(shù)平方值的程序21000H21001H21002H21003H21004H21005H21006H21007H21008H21009H…0149162536496481…MOVAX,2000H ;取平方表的段地址MOVDS,AXMOVBX,1000H ;取平方表的偏移地址MOVAL,06H ;AL中為待查找的數(shù)XLATBXBX+ALAL3651地址傳送指令

LEAREG,SRC功能:把源操作數(shù)SRC的地址偏移量傳送至寄存器REG。要求:①源操作數(shù)的尋址方式不能是立即數(shù)和寄存器方式;②目的操作數(shù)必須是一個(gè)16位的通用寄存器,但不能是段寄存器。LEAAX,[SI+20H]MOVAX,[SI+20H]0120HAX01ABAX假設(shè)(SI)=0100H,(DS)=0200H52地址傳送指令LDSREG16,m32功能:將源操作數(shù)m32的有效地址所對(duì)應(yīng)的內(nèi)存單元的32位內(nèi)容分別送入DS和指令所指出的寄存器REG中。REG16←m32低16位,DS←m32高16位要求:源操作數(shù)的尋址方式不能是立即數(shù)和寄存器方式;目的操作數(shù)是不能是段寄存器。LESREG16,m32這條指令除將地址指針的段地址部分送入ES外,與LDS類(lèi)似。53課堂練習(xí)設(shè)DS=1200H,(12450H)=F346H,(12452H)=0A90H,執(zhí)行指令LDSSI,[450H]后SI=

,DS=

.F346H0A90H54課堂練習(xí)試比較下列3組指令的功能(1)(2)(3)LDSSI,[DI]MOVSI,[DI]MOVDS,[DI+2]MOVDS,[DI+2]MOVSI,[DI](1)和(2)的功能相同(3)的第一條指令修改了DS的值,因此執(zhí)行第二條指令后結(jié)果可能與(1)(2)不同。55標(biāo)志位傳送指令LAHF

功能:(AH)←(FLAGS的低字節(jié)),即將標(biāo)志寄存器的低字節(jié)送寄存器AH,即狀態(tài)標(biāo)志位SF、ZF、AF、PF、CF分別送AH的D7、D6、D4、D2、D0位,而AH的D5、D3、D1位任意。56標(biāo)志位傳送指令SAHF

功能:(FLAGS的低字節(jié))←(AH),即將寄存器AH送標(biāo)志寄存器的低字節(jié),即根據(jù)AH的D7、D6、D4、D2、D0位相應(yīng)設(shè)置SF、ZF、AF、PF、CF標(biāo)志。57標(biāo)志位傳送指令PUSHF功能:(SP)←(SP)?2,((SP)+1,(SP))←(FLAGS),即將標(biāo)志寄存器的內(nèi)容壓入堆棧,同時(shí)棧頂指針SP減2。這條指令可用保護(hù)調(diào)用過(guò)程以前的標(biāo)志寄存器的值。58標(biāo)志位傳送指令POPF功能:(FLAGS)←((SP)+1,(SP)),(SP)←(SP)+2,即將棧頂字單元內(nèi)容送標(biāo)志寄存器,同時(shí)棧頂指針SP加2。該指令用于在過(guò)程返回以后恢復(fù)標(biāo)志狀態(tài)。59課堂練習(xí)操作數(shù)判斷錯(cuò)誤原因CS不能做目的操作數(shù)MOVCS,BXPUSHALMOVCH,100HPUSHCS

棧操作指令的操作數(shù)必須是字類(lèi)型源操作數(shù)超出目的操作數(shù)表示范圍判斷下列指令的對(duì)錯(cuò),如果錯(cuò)誤請(qǐng)說(shuō)明原因

60課后作業(yè) 給出MOV指令執(zhí)行后的結(jié)果,設(shè)有關(guān)寄存器及存儲(chǔ)單元內(nèi)容如下:

DS=2000H,ES=2200H,BX=0100H,SI=0004H, (22100H)=12H,(22101H)=34H,(22102H)=56H, (22103H)=78H,(22104H)=9AH,(22105H)=0BCH, (20100H)=1AH,(20101H)=2BH,(20103H)=3CH, (20104H)=4DH,(20105H)=5EH,(20106H)=6FH,61課后作業(yè)

(1)MOVAX,ES:[BX][SI] (2)MOVAX,BX (3)MOVAX,[BX] (4)MOVAX,[BX+SI] (5)MOVAX,[BX+SI+01]623.2指令系統(tǒng)數(shù)據(jù)傳送指令1算術(shù)運(yùn)算指令2邏輯運(yùn)算指令3移位指令和循環(huán)移位指令4處理器控制指令5633.2.2算術(shù)運(yùn)算指令加法指令減法指令乘除法指令符號(hào)擴(kuò)展指令十進(jìn)制調(diào)整指令64加法指令:ADDADD指令A(yù)DDDST,SCR;(DST)←(DST)+(SCR)指令格式舉例ADDREG,idataADDAX,8ADDREG,REGADDAX,BXADDREG,MEMADDAX,[0]ADDMEM,REGADD[0],ALADDMEM,idataADDWORDPTR[0000H],1234H

65例3-2試分析執(zhí)行如下指令后AL和FR各標(biāo)志位的變化狀況。MOV AL, 99HADD AL, 99HMOV AL, 3FHADD AL, 50H加法指令:ADD1001100110011001+010011001OF=Cs

Cp=1

0=1CsCpCF=1,PF=0,AF=1,SF=0,OF=1,ZF=0(AL)=32H0011111101010000+11110001OF=Cs

Cp=0

1=1CsCpCF=0,PF=0,AF=0,SF=1,OF=1,ZF=0(AL)=8FH66加法指令:ADCADCDST,SCR;(DST)←(DST)+(SCR)+(CF)例3-3將存儲(chǔ)在DS:0000H處的4字節(jié)數(shù)12345678H與DS:0010H處的4字節(jié)數(shù)00ABCDEFH相加,結(jié)果放在DS:0020H處67加法指令:ADC78563412EFCDAB000000H0001H0002H0003H0010H0011H0012H0013H0020H0021H0022H0023H+?78563412EFCDAB000000H0001H0002H0003H0010H0011H0012H0013H0020H0021H0022H0023H+5678HCDEFH12467HCF=1672478563412EFCDAB000000H0001H0002H0003H0010H0011H0012H0013H0020H0021H0022H0023H+1234H00ABH12E0H16724CFE01268加法指令:ADCMOV AX,[0000H]ADD AX,[0010H];低2字節(jié)相加MOV [0020H],AX;低2字節(jié)相加結(jié)果送DS:0020H處MOV AX,[0002H];取高2字節(jié)數(shù)據(jù)ADC AX,[0012H];

高2字節(jié)相加MOV [0022H],AX;高2字節(jié)相加結(jié)果送DS:0022H處69加法指令:INCINCDST;(DST)←(DST)+1指令格式舉例INCREG16INCAXINCREG8INCBLINCMEMINCVAR;VAR是變量70減法指令SUB指令SUBDST,SCR;(DST)←(DST)?(SCR)SBB指令SBBDST,SCR;(DST)←(DST)?(SCR)?(CF)

DEC指令DECDST;(DST)←(DST)?171減法指令NEG指令NEGDST;(DST)←0?(DST)CMP指令CMPDST,SCR;(DST)?(SCR)完成兩個(gè)操作數(shù)相減,使結(jié)果反映在標(biāo)志位上,但并不送回結(jié)果(即不帶回送的減法)。比較指令主要用于比較兩個(gè)數(shù)之間的關(guān)系。72課后作業(yè)求雙字DX:AX的負(fù),即0

DX:AX 假設(shè)DX:AX中存放一個(gè)雙字的數(shù)據(jù): NEGDX NEGAX SBBDX,0請(qǐng)問(wèn):上述程序段完成什么功能?設(shè)執(zhí)行前,DX=0001H,AX=FFFFH,上述程序段執(zhí)行后,DX、AX的值是什么?73乘法指令無(wú)符號(hào)乘法指令MUL

MULSRC①若SRC為字節(jié),則默認(rèn)被乘數(shù)在AL中,得到的16位積默認(rèn)在AX中,即:

(AX)←(AL)×(SRC)②若SRC為字,則默認(rèn)被乘數(shù)在AX中,得到的32位積默認(rèn)在DX,AX中,即:

(DX,AX)←(AX)×(SRC)MUL指令影響CF位和OF位,若相乘后的結(jié)果中高16位(16位乘法)或高8位(8位乘法)均為0時(shí),CF和OF均被置為0,否則CF和OF均被置為1。

74乘法指令帶符號(hào)乘法指令I(lǐng)MUL

IMULSRC同MUL一樣可以進(jìn)行字節(jié)與字節(jié)、字和字的乘法運(yùn)算。結(jié)果放在AX或DX,AX中。當(dāng)結(jié)果的高半部分不是結(jié)果的低半部分的符號(hào)擴(kuò)展(見(jiàn)CWB和CWD指令)時(shí),標(biāo)志位CF和OF將置位。75除法指令無(wú)符號(hào)數(shù)除法指令DIVDIVSRC①若SRC為字節(jié),則默認(rèn)被除數(shù)在AX中,得到的8位商在AL中余數(shù)在AH中,即:(AX)÷(SRC)→(AL),(AH)②若SRC為字,則默認(rèn)被除數(shù)在DX,AX中,得到的16位商在AX中余數(shù)在DX中,即:(DX,AX)÷(SRC)→(AX),(DX)如果除數(shù)為零,或商的結(jié)果超出相應(yīng)寄存器的范圍,則在內(nèi)部產(chǎn)生一個(gè)類(lèi)型0的中斷。76除法指令帶符號(hào)數(shù)除法指令I(lǐng)DIVIDIVSRC執(zhí)行過(guò)程同DIV指令,但I(xiàn)DIV指令認(rèn)為操作數(shù)的最高位為符號(hào)位,除法運(yùn)算的結(jié)果商的最高位也為符號(hào)位。77符號(hào)擴(kuò)展指令應(yīng)該將長(zhǎng)度短的數(shù)擴(kuò)展成與長(zhǎng)度長(zhǎng)的數(shù)位數(shù)相同后再計(jì)算。BX=0101H;+257AL=80H;?128字?jǐn)?shù)據(jù)與字節(jié)數(shù)據(jù)之間的運(yùn)算如何進(jìn)行?問(wèn)題的提出BX=0101H;+257AX=FF80H;?128符號(hào)擴(kuò)展78符號(hào)擴(kuò)展指令字節(jié)擴(kuò)展指令CBW該指令執(zhí)行時(shí)將AL的符號(hào)擴(kuò)展到AH,即若D7=0,則AH=0;否則AH=0FFH。字?jǐn)U展指令CWD該指令執(zhí)行時(shí)將AX的符號(hào)擴(kuò)展到DX,即若D15=0,則DX=0;否則DX=0FFFFH。CBWADDAX,BXBX=0101H;+257AL=80H;?12879符號(hào)擴(kuò)展指令擴(kuò)展無(wú)符號(hào)數(shù)是否可以使用如下指令?為什么?(1)CBW指令;(2)CWD指令不可以因?yàn)檫@兩個(gè)指令都是針對(duì)帶符號(hào)數(shù)的CBW把AL的符號(hào)擴(kuò)展到AH,CWD把AX的符號(hào)擴(kuò)展到DX無(wú)符號(hào)數(shù)(AL)=80H,若用CBW擴(kuò)展后,(AX)=FF80H,顯然不對(duì)。80符號(hào)擴(kuò)展指令例3-4編寫(xiě)匯編程序段,計(jì)算(V?(X*Y+Z?100))/X。已知X、Y、Z、V均為16位符號(hào)數(shù),已裝入X、Y、Z、V單元,要求將上式計(jì)算結(jié)果的商存入AX,余數(shù)存入DX。MOV AX,X ;取被乘數(shù)XIMUL Y ;X*Y,結(jié)果在DX,AX中MOV CX,AX ;將乘積保存在BX,CX中MOV BX,DXMOV AX,Z ;取被加數(shù)ZCWD ;將Z符號(hào)擴(kuò)展成32位(DX,AX)ADD CX,AX ;加到BX,CX中的乘積上ADC BX,DX16位符號(hào)數(shù)的乘積是32位的81符號(hào)擴(kuò)展指令例3-4編寫(xiě)匯編程序段,計(jì)算(V?(X*Y+Z?100))/X。已知X、Y、Z、V均為16位符號(hào)數(shù),已裝入X、Y、Z、V單元,要求將上式計(jì)算結(jié)果的商存入AX,余數(shù)存入DX。SUB CX,100 ;從BX、CX中減去100SBB BX,0MOV AX,VCWD ;將V擴(kuò)展為32位SUB AX,CX ;從符號(hào)擴(kuò)展后的V中減去BX,CXSBB DX,BX IDIV X ;除以X,商在AX中,余數(shù)在DX82課后作業(yè)編寫(xiě)計(jì)算4A2?B+10多項(xiàng)式值的程序段;說(shuō)明:多項(xiàng)式值存于AX中,A、B是無(wú)符號(hào)數(shù),設(shè)中間和最后結(jié)果不超過(guò)16位二進(jìn)制數(shù)。數(shù)據(jù)說(shuō)明:ADB0AHBDB10H83十進(jìn)制調(diào)整指令

十進(jìn)制數(shù)25D壓縮BCD數(shù)25H非壓縮BCD數(shù)0205H指令格式指令說(shuō)明DAA壓縮的BCD碼加法調(diào)整DAS壓縮的BCD碼減法調(diào)整AAA非壓縮的BCD碼加法調(diào)整AAS非壓縮的BCD碼減法調(diào)整AAM乘法后的BCD碼調(diào)整AAD除法前的BCD碼調(diào)整84十進(jìn)制調(diào)整指令DAA若AL的低4位>9或AF=1,則進(jìn)行(AL)←(AL)+06H修正,同時(shí)AF置1。若AL的高4位>9或CF=1,則進(jìn)行(AL)←(AL)+60H修正,同時(shí)CF置1。例3-5:編寫(xiě)匯編程序段,用壓縮BCD碼計(jì)算12D+28D。MOV AL,12HADD AL,28H ;AL=3AH,AF=0,CF=0DAA ;AL=40H85十進(jìn)制調(diào)整指令舉例AL=28H,BL=68HADDAL,BLDAA;AL=90H;AL=96HAL=07H,BL=09HAAM;AX=003FH;AX=0603H

MOVAX,0307HAADMOVBL,5DIVBL請(qǐng)分析以下指令的執(zhí)行結(jié)果MULBL863.2指令系統(tǒng)數(shù)據(jù)傳送指令1算術(shù)運(yùn)算指令2邏輯運(yùn)算指令3移位指令和循環(huán)移位指令4處理器控制指令5873.2.3邏輯運(yùn)算指令A(yù)ND指令OR指令XOR指令TEST指令NOT指令88AND指令A(yù)NDDST,SRC;(DST)←(DST)∧(SRC)

對(duì)源操作數(shù)SRC和目的操作數(shù)DST進(jìn)行按位的邏輯“與”運(yùn)算,結(jié)果送回目的DST。源操作數(shù)可以為立即數(shù),通用寄存器和任一尋址方式所指定的內(nèi)存單元;目的操作數(shù)可以為通用寄存器和任意尋址方式所指定的內(nèi)存單元,但不允許是立即數(shù);當(dāng)源操作數(shù)不是立即數(shù)時(shí),兩個(gè)操作數(shù)中必須有一個(gè)是寄存器。MOVAL,01100011BANDAL,00110011B執(zhí)行后(AL)=00100011B89AND指令A(yù)ND指令可以將操作對(duì)象的相應(yīng)位設(shè)為0,其他位不變。將AL的D3位設(shè)為0的指令是:ANDAL,11110111B將AL的D0位設(shè)為0的指令是:

ANDAL,11111110B將AL的低4位清零指令是:

ANDAL,0F0HAND指令提供了一種把小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母的簡(jiǎn)單方法。01100001=61H(’a’)01000001=41H(’A’)只要將任何字符與11011111相與,則D5被清零,其他位不變。90OR

指令ORDST,SRC;(DST)←(DST)∨(SRC)

對(duì)源操作數(shù)SRC和目的操作數(shù)DST進(jìn)行按位的邏輯“或”運(yùn)算,結(jié)果送回目的DST。MOVAL,01100011BORAL,00110011B執(zhí)行后(AL)=01110011

BOR指令可以將操作對(duì)象的相應(yīng)位設(shè)為1,其他位不變。將AL的D3位設(shè)為1的指令是:ORAL,00001000B將AL的D0位設(shè)為1的指令是:

ORAL,00000001B將AL的低4位設(shè)為1的指令是:

ORAL,0FHOR指令可以把0~9之間的整數(shù)轉(zhuǎn)換成對(duì)應(yīng)的ASCII碼數(shù)字字符,方法是把D4和D5置1。91XOR指令XORDST,SRC;(DST)←(DST)

(SRC)

對(duì)源操作數(shù)SRC和目的操作數(shù)DST進(jìn)行按位的邏輯“異或”運(yùn)算,結(jié)果送回目的DST。MOVAL,01100011BXORAL,00110011B執(zhí)行后(AL)=01010000

BXOR指令可以將操作對(duì)象的相應(yīng)位取反,其他位不變。將AL的D3位取反的指令是:XORAL,00001000B將AL的D0位取反的指令是:

XORAL,00000001B將AL的低4位取反的指令是:

XORAL,0FH92TEST指令TESTOPR1,OPR2;(OPR1)∧(OPR2)對(duì)操作數(shù)OPR1和OPR2進(jìn)行按位的邏輯“與”運(yùn)算,結(jié)果只體現(xiàn)在標(biāo)志位上,不改變操作數(shù)的值。TEST與AND的關(guān)系類(lèi)似于CMP與SUB的關(guān)系。利用TEST可以測(cè)試操作對(duì)象的相應(yīng)位是否為0。

測(cè)試AL的D3位是否為0:TESTAL,00001000B一般TEST指令后面會(huì)跟一個(gè)條件轉(zhuǎn)移指令(見(jiàn)4.3.2節(jié))。93NOT指令對(duì)操作數(shù)DST的各位按位取反

MOVAL,01100011BNOTAL執(zhí)行后AL=10011100

BNOTDST;(OPR)←(OPR)94課堂練習(xí)寫(xiě)出一條能完成下述操作的指令(1)將AX的高字節(jié)清零,低字節(jié)不變(2)將BX的低字節(jié)置成全’1’,高字節(jié)不變(3)將CX的高字節(jié)變反,低字節(jié)不變AND AX,00FFHOR BX,00FFHXOR CX,0FF00H95課堂練習(xí)按要求編寫(xiě)下列指令序列(1)把AX中的0~3位置0,7~9位置1,13~15取反(2)檢查CX中的1、3和5位中是否有1位為1;AND AX,0FFF0H ;11111111

11110000BOR AX,0380H ;0000001110000000BXOR AX,0E000H ;1110000000000000BMOV AX,CXAND AX,002AH ;0000000000101010B如果運(yùn)算結(jié)果不為0,表示1、3、5位至少有一位為1

963.2指令系統(tǒng)數(shù)據(jù)傳送指令1算術(shù)運(yùn)算指令2邏輯運(yùn)算指令3移位指令和循環(huán)移位指令4處理器控制指令597移位指令SHL/SALDST,CNTSHRDST,CNTSARDST,CNT目的操作數(shù)DST可以是除立即數(shù)以外的任何尋址方式;CNT用于指定移位的位數(shù),如果是立即數(shù)則只能是1;如果移位次數(shù)大于1,則CNT必須為寄存器CL,CL中的內(nèi)容即移位次數(shù)。DSTCF邏輯/算術(shù)左移0DSTCF邏輯右移0DSTCF算術(shù)右移98移位指令SHL和SAL可以用于乘法左移一位,只要左移以后的數(shù)未超出一個(gè)字節(jié)或一個(gè)字的表達(dá)范圍,則原數(shù)的每一位的權(quán)增加了一倍,相當(dāng)于原數(shù)乘2。

舉例:X

10=X

2+X

8MOVAH,0SALAX,1

;X

2

MOVBX,AX;移至BX中暫存SALAX,1

;X4

SALAX,1

;X8

ADDAX,BX;X10

99移位指令SHL和SAL可以用于乘法左移一位,只要左移以后的數(shù)未超出一個(gè)字節(jié)或一個(gè)字的表達(dá)范圍,則原數(shù)的每一位的權(quán)增加了一倍,相當(dāng)于原數(shù)乘2。

SHR可以用于無(wú)符號(hào)數(shù)的快速除法

SAR可以用于帶符號(hào)數(shù)的快速除法

100移位指令無(wú)符號(hào)數(shù)乘法有符號(hào)數(shù)乘法無(wú)符號(hào)數(shù)除法有符號(hào)數(shù)除法00001000B(8)00010000B(16)11110001B(?15)1110

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論