




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章8086的尋址方式和指令系統3.18086的尋址方式3.2指令的機器碼表示方法3.38086指令系統1匯編語言指令的特點語法結構符合人類語言的共同特點——動作+對象指令操作碼→動作:做什么指令操作數→對象:針對什么做動作例: MOVAX,BX機器指令:指令的二進制代碼形式。如:89D8匯編指令:助記符形式的指令。如:MOVAX,BX2匯編語言指令操作碼:由CPU設計人員定義。每一種操作唯一對應一個操作碼。操作數:可由編程人員采用不同方式給出。尋址方式:尋找操作數(操作數地址)的方式;指令格式:指令中對操作碼、操作數的編碼方式。3操作數1.8086指令中操作數的個數可以有以下幾種情況無操作數指令,例:等待指令WAIT單操作數指令,例:加1指令INCAL雙操作數指令,例:減法指令
SUBAL,BL源操作數:后者(BL)目的操作數:前者(AL)42、操作數存放地點,可以有以下幾種:立即數:操作數直接包含在指令中。 例:MOVAL,50H
寄存器操作數:操作數存放在寄存器中。例:INCAL
I/O操作數:操作數來自I/O端口。例:INAL,28H操作數內存操作數:操作數存放在內存單元中。 例:MOVAL,[2000H]
53.18086的尋址方式6實質都是間接尋址78086的非存儲器尋址方式1、立即數尋址方式源操作數以8位或16位常數的形式直接出現在指令中。一般用于賦值。
例:MOVAL,5FH2、寄存器(直接)尋址方式
8位或16位寄存器的值就是操作數本身。與其它尋址方式相比,該方式執行速度最快。
例:MOVSI,DX通用寄存器、段寄存器均可83、固定尋址(隱含尋址)
操作數并不直接出現在指令中,而是由操作碼隱含地指定為某一固定內容。例:PUSHDS
;目操作數隱含為棧頂字單元
POPBX
;源操作數隱含為棧頂字單元
LAHF
;源操作數隱含為標志寄存器低字節,;目操作數隱含為寄存器AH4、I/O端口尋址僅用于輸入/輸出指令IN、OUT。98086的存儲器尋址方式二、存儲器尋址方式1、直接尋址方式操作數存放在存儲器單元中,由指令直接給出該單元的有效地址EA(即16位段內偏移量)。操作數的物理地址PA=16*DS+EA
例:MOVAX,[0016H]尋址過程示意段超越前綴
MOVAX,ES:[0500H]符號地址
MOVAX,AREA1102、寄存器間接尋址方式操作數存放在存儲器單元中,指令給出的16位寄存器值就是該單元的EA。
PA=16*DS+BX
或=16*DS+SI
或=16*DS+DI
或=16*SS+BP例:MOV[BX],CL尋址過程示意必須是BX、BP、SI、DI段超越前綴:MOVBX,DS:[BP]MOVAX,ES:[SI]113、寄存器相對尋址操作數的有效地址是一個基址或變址寄存器的內容與指令中指定的8位或16位位移量之和。例:MOVDL,[BP+2]尋址過程示意其它等效寫法
MOVDL,[BP]2MOVDL,2[BP]124、基址變址尋址方式操作數的有效地址是一個基址寄存器(BX或BP)和一個變址寄存器(SI或DI)的內容之和。
PA=16*DS+BX+
或
PA=16*SS+BP+
例:MOV[BX][SI],AX尋址過程示意其它等效寫法:
MOV[BX+SI],AXSIDI135、相對基址變址尋址方式操作數的有效地址是一個基址寄存器和一個變址寄存器的內容,再加上指令中指定的8位或16位位移量之和。
PA=16*DS+BX++位移量或
PA=16*SS+BP++位移量例:MOVAX,4[BX][DI
尋址過程示意其它等效寫法:
MOVAX,4[BX+DI]MOVAX,[BX+DI+4]SIDI14段寄存器使用規則直接尋址使用BX、SI、DI的間接尋址使用BP的間接尋址堆棧操作源串指針目標串指針指令指針默認段寄存器DSDSSSSSDSESCS可加的段超越前綴ES:SS:CS:ES:SS:CS:DS:ES:CS:—ES:SS:CS:——固定搭配的寄存器SPDIIP153.28086的指令格式與編碼指令的書寫格式
操作碼[[操作數1],[操作數2]]說明:操作碼:必備;操作數:可以是1個、2個或沒有,可以是8位或16位指令的編碼格式采用變長編碼格式,屬于CISC。低端
高端指令前綴操作碼字段尋址方式字段操作數字段1字節1字節1字節1~4字節便于書寫可讀性強163.38086指令系統3.3.1數據傳送指令3.3.2算術運算指令3.3.3邏輯運算及移位指令3.3.4串操作指令3.3.5控制轉移指令3.3.6處理器控制指令3.3.7指令的執行時間和軟件延時173.3.1數據傳送指令通用數據傳送指令MOV堆棧操作指令PUSH、POP數據交換指令XCHG查表指令XLAT輸入輸出指令IN、OUT地址傳送指令LEA、LDS、LES標志傳送指令LAHF、SAHF、PUSHF、POPF小結18通用數據傳送指令MOV功能:將源操作數內容復制到目的操作數中格式:MOVdst,src;(dst)←(src)Dst:R、M、SR;Src:R、M、SR、Im不影響標志位19MOV指令有以下5種傳送路徑:①立即數→通用寄存器或存儲單元MOVAX,0220HMOVWORDPTR[DI],1000H②通用寄存器←→通用寄存器MOVAL,BL;BL中的8位數據送到AL中③通用寄存器←→段寄存器MOVDS,AX;AX中的16位數據送到DSMOVBX,ES;ES中的16位數據送到AX20④通用寄存器←→存儲單元MOV4[DI],AL;((DI)+4)←ALMOVAX,[SI];AX←((SI))⑤段寄存器←→存儲單元MOV[BX+SI],CS;CS的內容送到[BX+SI]和[BX+SI]+1的兩單元MOVDS,[3000H];3000H和3001H兩單元的內容送到DS其它操作:傳遞偏移地址
MOVDX,OFFSETARRAY;將ARRAY的偏移地址送至DX,offset是屬性操作符21特別注意MOV指令不能直達的路徑:立即數×→段寄存器存儲單元×→存儲單元段寄存器×→段寄存器CS段寄存器不可作為目的操作數22對MOV指令的使用,應注意以下幾點:
MOV指令是雙操作數指令,源和目的操作數的類型必須一致,或同為字節,或同為字。下面的指令是錯誤的:
MOVAX,BLMOVAL,1234H
不允許用立即數作目的操作數。不能用CS和IP作目的操作數,也就是說,CS
和IP兩寄存器的內容不得隨意改變,一般只能在轉移指令時改變。23堆棧的概念
堆棧——以“先進后出”原則組織起來的連續的存儲空間。
堆棧操作以字為單位。固定以SS:SP為指針指示棧頂,出、入堆棧的操作均針對棧頂單元進行。80X86的堆棧生長方向為“由高向低增長”。入棧,指針減出棧,指針加24堆棧操作入棧:先修改棧頂指針(SP減2);然后將入棧數據存入,低字節存入SP指向的單元,高字節存入SP+1指向的單元。出棧:先將出棧數據彈出,SP指向的單元存入目標位置低字節,SP+1指向的單元存入目標位置高字節;然后修改棧頂指針(SP加2)。25堆棧操作指令1、入棧指令PUSH可使用的操作數類型:PUSHCX ;通用寄存器PUSHDS ;段寄存器PUSH[0040H];存儲器
目操作數隱含為棧頂單元指令執行時先SP減2入棧過程示意2、出棧指令POP可使用的操作數類型:POPSI ;通用寄存器POPES ;段寄存器POP[BX] ;存儲器源操作數隱含為棧頂單元指令執行后SP加2出棧過程示意不能用CS!不影響標志位26數據交換指令XCHG功能:將源、目操作數的內容互相交換,指令執行后源、目操作數同時被改變指令形式:XCHGop1,op2;(op1)(op2)op1:R,M;op2:R,M不影響標志位交換指令對操作數有如下要求:兩個操作數字長必須相同,可以是字節交換,也可以是字交換。27源操作數和目的操作數均可以是寄存器或存儲器,但不能同時為存儲器。
段寄存器不能作為操作數。如:
XCHGCL,DH ;通用寄存器通用寄存器
XCHGAX,[BP];通用寄存器存儲器寄存器存儲器【例】
設(DS)=2000H,(SI)=0100H,
(DX)=1145H,(20300H)=22H,(20301H)=3CH則執行指令“XCHG[SI+200H],DL”后,DL的內容發生了什么樣的變化?
28查表指令XLAT指令功能:將AL中的值(碼)轉換為內存表格中的某一值后,再送回AL中。指令形式:XLAT[數據表首地址標號]應用舉例TABDB0,1,4,9,16,25,36,49,64,81 ;數據段中以TAB為首地址定義的字節表,數目≤255……MOVBX,OFFSETTABMOVAL,4XLATTAB指令執行后,AL=16。實現什么功能?29已知十進制數0~9的七段LED顯示碼對照表如表所示。試用XLAT指令求數字6的七段顯示碼。十進制數的七段顯示碼
十進制數字七段顯示碼十進制數字七段顯示碼0123440H79H24H30H19H5678912H02H78H00H18H30TABLEDB40H,79H,24H,30H,19HDB12H,02H,78H,00H,18H┆┆MOVAL,6;數字6的位移量送ALMOVBX,OFFSETTABLE;表格首址送BXXLATTABLE
31輸入/輸出指令
輸入指令IN、輸出指令OUT:專用于訪問I/O
空間。80X86采用獨立的I/O編址方式,即采用不同的指令分別訪問I/O空間與內存空間。
I/O空間的尋址范圍:最大為216=64K字節端口地址大于FFH(255)時,必須固定使用
DX進行“間接”的訪問。
累加器AX或AL是數據輸入/輸出的唯一通路
不影響標志位。32輸入指令IN格式:
INAL,8位I/O地址 ;長格式,字節輸入
INAX,8位I/O地址 ;長格式,字輸入
INAL,DX ;短格式,字節輸入
INAX,DX ;短格式,字輸入尋址方式:I/O尋址功能:字節輸入:將I/O地址所指的端口上的8位數據復制到AL中。字輸入:將指令指定的I/O端口上的8位數據復制到AL中;下一個端口地址上的8位數據復制到AH中。33【例】
INAL,0F1HINAX,80HMOVDX,310HINAL,DX34輸出指令OUT格式:
OUT8位I/O地址,AL ;長格式,字節輸出
OUT8位I/O地址,AX ;長格式,字輸出
OUTDX,AL ;短格式,字節輸出
OUTDX,AX ;短格式,字輸出尋址方式:I/O尋址功能:字節輸出:將AL的值復制到I/O地址所指的端口上。字輸出:將AL的值復制到指令所指定的I/O端口上,AH的值復制到下一址的端口上。35【例】
OUT85H,ALMOVDX,0FF4HOUTDX,ALMOVDX,30HOUTDX,AX36地址傳送指令有效地址傳送指令LEA:
LEA16位通用寄存器,存儲器源操作數的有效地址EA(不是內容!!)→目標寄存器例:假設SI=1000H,DS=5000H,(51000H)=1234HLEABX,[SI]→執行后:BX=等價于MOVBX,OFFSET[SI]MOVBX,[SI]→執行后:BX=
?1234H1000H?37全地址指針傳送指令LDS:從源操作數制定的內存單元中取出4字節內容作為全地址指針,低16位至目標寄存器作為偏移量,高16位送至段基址DS。LDS16位通用寄存器,存儲器LDSSI,[450H]→執行后:SI=F346HDS=0A90HMemory0AH……46HF3H90H12450H12451H12452H12453H例:設DS=1200H(12450H)=F346H(12452H)=0A90H38全地址指針傳送指令LES:從源操作數制定的內存單元中取出4字節內容作為全地址指針,低16位至目標寄存器作為偏移量,高16位送至段基址ES。
LES16位通用寄存器,存儲器39標志傳送指令標志裝入指令LAHF(Flags)L→AH標志存儲指令SAHFAH→(Flags)L標志入棧指令PUSHF
將標志寄存器壓入堆棧。標志出棧指令POPF
將棧頂字單元的內容彈到標志寄存器中。全部隱含源、目操作數唯一可改變TF的指令!d15d11d10d9d8d7d6d4d2d0OFDFIFTFSFZFAFPFCF40數據傳送指令小結源、目操作數長度必須一致。源、目操作數不能同時是存儲器操作數。源、目操作數不能同時是段寄存器。立即數和代碼段寄存器CS不能作目操作數。當目操作數是段寄存器時,源操作數不能是立即數。可以使用段寄存器的指令:MOV、PUSH、POP。除SAHF、POPF指令外,其它數傳指令的執行不影響標志位。對所有指令都適用!413.3.2算術運算指令加法指令ADD、ADC、INC、AAA、DAA減法指令SUB、SBB、DEC、AAS、DAS、
CMP、NEG乘法指令MUL、IMUL、AAM除法指令DIV、IDIV、AAD、CBW、CWD小結42加法指令1、加指令ADD形式:ADDdst,src
;dst←src+dstdst:R,M;
src:R,M,Im執行后影響所有狀態標志SF、ZF、AF、PF、CF、OF2、帶進位的加指令ADC形式:ADCdst,src;dst←src+dst+CF其余與ADD指令相同最常用的加法用于高字(字節)相加43【例】對兩個8位16進制數5EH和3CH求和,并分析加法運算指令執行后對標志位的影響。
用AL和BL存放兩個加數:
MOVAL,5EHMOVBL,3CHADDAL,BL44【例】求兩個4字節無符號數0107A379H+10067E4FH的和。
MOVDX,0107HMOVAX,0A379HMOVBX,1006HMOVCX,7E4FHADDAX,CXADCDX,BX453、自加1指令INC指令形式:INCop;op←op+1Op:R,M;執行之后影響標志位SF、ZF、AF、PF、OF
,但不影響CF
【例】INCBLINCCXINCBYTE
PTR[BX]INCWORDPTR[BX]
常用于修改地址指針46加法的十進制調整指令1、非壓縮BCD碼調整指令AAA(無操作數)何時使用?對什么進行調整?如何調整?影響標志位CF、AF兩個非壓縮BCD碼或ASCII碼表示的十進制數相加時自動調整AL中的和,非壓縮BCD碼的結果存在AL中。若AL低4位大于9或有進位,AH+1→AH47如何調整?若AL低4位>9或半進位標志AF=1,則:①AL←AL+6②用與操作將AL高4位清0③AF置1,CF置1,AH←AH+1否則,僅將AL寄存器的高4位清0。【例】若AL=(9)BCD,BL=(5)BCD,求兩數之和。設AH=0
ADDAL,BLAAA4800001001┅9+00000101┅5
00001110┅低4位>9+00000110┅加6調整
00010100┅^00001111┅清高4位00000100┅AL=4CF=1,AF=1,AH=1ADDAL,BL;AAA;結果為AX=0104H,表示非壓縮十進制數1449加法的十進制調整指令2、壓縮BCD碼調整指令DAA(無操作數)何時使用?對什么進行調整?影響SF、ZF、AF、CF、PF兩個壓縮BCD碼相加時自動調整AL中的和,結果在AL中產生一個壓縮BCD碼的和。若有進位,則CF=150加法的十進制調整指令如何調整?若AL低4位>9或半進位標志AF=1,則:
AL←AL+6,對低半字節進行調整若此時AL中高半字節結果>9或CF=1,則:
AL←AL+60H,對高半字節進行調整,并使
CF置1,否則CF置0。【例】若AL=(88)BCD,BL=(49)BCD,求兩數之和。
ADDAL,BLDAA51
10001000
┅88+01001001┅49
11010001┅
AF=1+00000110┅
加6調整
11010111┅
調整后高半字節>
9^01100000┅加60H調整
00110111┅結果為AL=(37)BCD,
CF=1ADDAL,BL;DAA;52減法運算指令1、減法指令SUB形式:SUBdst,src;dst←dst-srcdst:R,M;
src:R,M,Im執行之后影響所有狀態標志SF、ZF、AF、PF、CF、OF最常用的減法53減法運算指令2、帶借位的減指令SBB形式:SBB
dst,src;dst←dst-src-CFdst:R,M;
src:R,M,Im其余與SUB指令相同!3、自減1指令DEC形式:DECop;op←op-1op:R,M;執行之后影響標志位SF、ZF、AF、PF、OF
,但不影響CF
用于高字(字節)相減常用于修改地址指針54取相反數指令NEG形式:NEG操作數功能:0-操作數內容→操作數影響所有狀態標志SF、ZF、AF、PF、CF、OF允許的操作數類型:通用寄存器、存儲器實質上,NEG指令執行結果即取原數的相反數。55比較指令CMP使用方法與SUB、SBB相同。功能:目操作數-源操作數,同時影響狀態標志SF、ZF、AF、PF、CF、OF
。CMP通常用于比較兩個數的大小,而又不破壞原操作數的場合。其后一般緊跟著條件轉移指令以實現不同情況下的分支處理。例:
CMPAL,BL;AL-BL,保持寄存器的值不變
JNZEQUAL;若ZF=0(不等),轉EQUAL處
……;
ZF=1(相等)情況下的處理不改變操作數本身的值!56減法的十進制調整指令1、非壓縮BCD碼調整指令AAS(無操作數)
兩個非壓縮BCD碼相減,結果在AL中,用AAS指令進行調整,在AL中得到非壓縮BCD碼結果。若有借位,AH自動減1。影響CF、AF。如何調整?若AL低4位>9或半進位標志AF=1,則:①AL←AL-6,AF置1②用與操作將AL高4位清0③AH←AH-1,CF置1否則,不需要調整。57減法的十進制調整指令2、壓縮BCD碼調整指令DAS(無操作數)兩個壓縮BCD碼相減,結果在AL中,用DAS指令進行調整,在AL中得到壓縮BCD碼結果。影響SF、ZF、AF、CF、PF
。如何調整?若AL低4位>9或半進位標志AF=1,則:
AL←AL-6,AF置1。若此時AL中高半字節結果>9或CF=1,則:
AL←AL-60H,CF置1,58乘法運算指令
無符號數乘法指令:MUL
通用寄存器或存儲器帶符號數乘法指令:IMUL
通用寄存器或存儲器非壓縮BCD碼乘法調整:AAM
字節相乘:字相乘:
影響標志CF、OF:相乘后若高位(AH或DX)≠0,則將CF、OF置1,否則清0。表明高位內容有效與否。59乘法運算指令如:MULDL;無符號數乘
IMULCX;有符號數乘
MULBYTEPTR[SI]IMULWORDPTR[BX]【例】設AL=55H,BL=14H,計算積。
MULBL
結果AX=06A4H,CF=1,OF=1
【例】設AL=-28,BL=59,計算積。
IMULBL
結果AX=F98CH=-1652,CF=1,OF=1
60除法運算指令無符號數除法指令:DIV
通用寄存器或存儲器帶符號數除法指令:IDIV
通用寄存器或存儲器
BCD碼轉換成二進制數指令:AAD字節除法:AX值÷操作數內容(8位)→
字除法:DX:AX值÷操作數內容(16位)→IDIV之后,余數與被除數同號除數太小致使商超過規定的長度時,自動轉入中斷處理。不影響任何標志商→AL余數→AH商→AX余數→DX61符號擴展指令主要用在IDIV指令之前。將被除數的符號位擴展至高位寄存器中,使長度擴展一倍。AL擴展為AX——CBWAX擴展為DX:AX——CWD不影響任何標志位62【例】編程求-38/3的商和余數。
MOVAL,11011010B;被除數-38=-26HMOVCH,00000011B;除數3CBW;將AL符號擴展到AH;AX=1111111111011010BIDIVCH;AX/CH;AL=11110100B=-12(商);AH=11111110=-2(余數)
63算術運算指令小結加、減法的運算結果與兩個操作數的長度相等,進、借位反映在標志位上。乘、除法運算僅由指令指定一個操作數,另一個操作數固定為累加器。除了除法和符號擴展指令外,其它算術運算指令均影響狀態標志,不同指令對標志位的影響也各不相同。允許使用BCD碼進行算術運算。為了得到正確的BCD碼運算結果,應使用相應的十進制調整指令。所有的十進制調整均對累加器進行。加、減、乘法的調整在運算之后進行,只有除法必須先調整,后運算。643.3.3邏輯運算及移位指令邏輯運算指令NOT
、AND、TEST、OR、XOR算術移位指令SAL、SAR邏輯移位指令SHL、SHR不帶進位的循環移位指令ROL、ROR帶進位的循環移位指令RCL、RCR小結65邏輯非指令NOT格式:
NOT通用寄存器或存儲器功能:將操作數內容按位取反,結果送回原處。不影響任何標志舉例:NOTAXNOTBL NOTBYTEPTR[BX]
66邏輯運算指令邏輯與指令
AND目操作數,源操作數目操作數的內容∧源操作數的內容→目操作數邏輯或指令:OR目操作數,源操作數目操作數的內容∨源操作數的內容→目操作數邏輯異或指令:XOR目操作數,源操作數目操作數的內容⊕源操作數的內容→目操作數允許的操作數類型組合:Dst:R、M;Src:R、M、Im將CF、OF標志清0;影響SF、ZF、PF標志。測試指令TEST:與AND指令的區別僅在于TEST不改變目操作數。其后常緊跟條件轉移指令以實現判斷分支。67邏輯運算指令的應用1、AND指令通常用于將操作數的某些位清0。如:ANDAL,0FCH;AL的低2位清0,其余保持不變2、TEST指令常用于“取出”操作數的某一位來進行判斷。如:TESTAL,20H;取AL的D5位
JZBCLR;ZF=1(該位為0)就到BCLR處3、OR指令通常用于將操作數的某些位置1。如:ORAL,80H;AL的D7位置1,其余位保持不變4、XOR指令通常用于將操作數的某些位取反。如:XORAL,0FH;AL的低4位取反,高4位保持不變68移位指令算術左移指令SAL算術右移指令SAR邏輯左移指令SHL邏輯右移指令SHR注:SAL,SHL效果相同CF0MSBLSBCF0MSBLSBCFMSBLSBCFMSBLSB069格式:
SAL/SAR/SHL/SHR操作數,1 ;移1位
SAL/SAR/SHL/SHR操作數,CL ;移位(CL)次
移位之后改變操作數內容,但CL的值不變允許的操作數類型:通用寄存器、存儲器對標志位的影響:移出位→CF;僅當移1位時,影響OF,表明最高位的值有否改編;按照移位后的結果置/復位SF、ZF、PF。應用舉例:用移位指令實現乘除法算術運算。70用移位指令實現乘、除法
SALAX,1 ;實現AX×2 MOVBX,AX SALAX,1 ;實現AX×4 ADDAX,BX ;實現AX×6
MOVBL,AL MOVCL,3 SHRAL,CL ;實現AL÷8 SUBBL,AL ;實現AL×7/871循環移位指令不帶進位的循環左移指令ROL不帶進位的循環右移指令ROR帶進位的循環左移指令RCL帶進位的循環右移指令RCRCFMSBLSBCFMSBLSBCFMSBLSBCFMSBLSB72格式:
ROL/ROR/RCL/RCR操作數,1 ;移1位
ROL/ROR/RCL/RCR操作數,CL ;移位(CL)次
移位之后改變操作數內容,但CL的值不變。允許的操作數類型:通用寄存器、存儲器
如:ROLBX,CLRORWORDPTR[SI],1對標志位的影響:移出位→CF;僅當移1位時影響OF。移出的位不會丟失73邏輯運算及移位指令小結AND、TEST、OR、XOR指令對標志位的影響:固定使CF=OF=0;根據運算結果改變SF、ZF、PF。NOT指令形式上只有一個操作數;不影響任何標志位。SAL、SAR、SHL、SHR指令的使用方法相同,對標志位的影響也相同:移出位給CF;根據結果改變SF、ZF、PF;當移位次數為1時,影響OF。ROL、ROR、RCL、RCR的使用方法相同,對標志位的影響相同:移出位給CF;當移位次數為1時,影響OF。使用SHR或SAR每移1位,可視為分別將無符號數和帶符號數除以2;使用SHL/SAL每移1位,可視為將數值乘以2。743.3.4串操作指令串傳送指令MOVS、MOVSB、MOVSW串比較指令CMPS、CMPSB、CPMSW串檢索指令SCAS、SCASB、SCASW串裝入指令LODS、LODSB、LODSW串存儲指令STOS、STOSB、STOSW串操作指令重復前綴REP、REPZ/REPE、REPNZ/REPNE小結75串操作的基本概念什么是串?
地址連續的字節或字存儲單元,通常用于存放同一類數據。數據源:源串;數據結果:目的串。串操作指令對串元素實現傳送、比較、檢索、裝入、存儲等操作,并自動修改地址指針。串操作重復前綴加在串操作指令之前,根據不同條件判斷是否重復執行串操作。可以實現對整個串的同一種操作。76串操作指令的特點DS:SI——默認的源串指針,可段超越;
ES:DI——固定的目標串指針,不允許段超越。自動修改串指針:方向標志DF決定指針的修改方向——DF=0,指針加;DF=1,指針減。串元素的類型決定修改量—字節串,指針加/減1;字串,指針加/減2。加有重復前綴時,固定使用CX計錄并修改重復次數,再根據CX值及標志位ZF判斷是否重復進行串操作。前綴本身不影響任何標志位。77串傳送指令格式:
MOVS目標串首址標號,源串首址標號
MOVSBMOVSW功能:將源串中DS:SI所指的串元素復制到目標串中ES:DI所指的單元處;然后自動修改SI、DI。MOVSB、MOVSW分別是字節串和字串的傳送指令,隱含了操作數。78重復前綴REP格式:
REP串操作指令功能:
串操作指令執行之后,先修改CX(CX-1→CX),再判斷串是否處理完(CX是否為0):不是0,繼續執行該串操作指令;否則順序執行下一條指令。應用舉例79串傳送舉例程序實現‘H’‘E’‘L’‘L’‘O’‘!’源串目標串SRC_MESSNEW_LOC80串傳送指令及重復前綴應用例DATASEGMENTSRC_MESSDB‘HELLO!’DATAENDSEXTRASEGMENTNEW_LOCDB6DUP(?)EXTRAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:EXTRASTART:MOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AXLEASI,SRC_MESSLEADI,NEW_LOCMOVCX,6CLD
REPMOVSBCODEENDSENDSTART 81串比較指令格式:
CMPS目標串首址標號,源串首址標號
CMPSBCMPSW功能:用源串中DS:SI所指的串元素值減去目標串中ES:DI所指的串元素值,結果反映在標志位上;自動修改SI、DI。CMPSB、CMPSW分別是字節串和字串的比較指令,隱含了操作數。82重復前綴REPZ/REPE格式:
REPZ/REPE串操作指令功能:
串操作指令執行之后修改CX(CX-1→CX),判斷是否滿足串未完(CX≠0)、且結果相等(ZF=1):滿足則繼續執行該串操作指令;否則順序執行下一條指令。應用舉例83串比較指令及重復前綴舉例比較兩個字符串是否相等:
MOVCX,20 ;源串、目標串的字符個數
LEASI,STR1;STR1:源串的首址標號
LEADI,STR2 ;STR2:目標串的首址標號
CLD ;DF=0,串指針自動增量
REPECMPSB;比較對應元素是否相同。是:繼續比,否:執行下條指令
JNZDIFF ;因對應元素不同而退出比較SAME:…… ;因串結束(CX=0)而退出比較84串檢索指令格式:
SCAS目標串首址標號
SCASBSCASW功能:用AL(字節串)或AX(字串)的值減去目標串中ES:DI所指的串元素值,結果反映在標志位上;然后自動修改DI。SCASB、SCASW分別是字節串和字串的檢索指令,隱含了操作數。實際上是源串固定為累加器的串比較指令85重復前綴REPNZ/REPNE格式:
REPNZ/REPNE串操作指令功能:串操作指令執行之后修改CX(CX-1→CX),判斷是否滿足串未完(CX≠0)、且結果不等(ZF=0):滿足則繼續執行該串操作指令;否則順序執行下一條指令。應用舉例86串檢索指令及重復前綴舉例在一個字符串中檢索有無關鍵字符“$”:
MOVCX,30 ;目標串的字符個數
LEADI,STR2 ;STR2:目標串的首址標號
MOVAL,‘$’ ;關鍵字符在AL中
CLD ;DF=0,串指針自動增量
REPNESCASB;比較AL與串元素,不同:繼續比,相同:執行下條指令
JZ FND ;找到關鍵字符NOFD:…… ;因串檢索結束而退出,未找到87串裝入指令格式:
LODS源串首址標號
LODSBLODSW功能:將源串中DS:SI所指的串元素復制到AL(字節串)或AX(字串)中;然后自動修改SI。LODSB、LODSW分別是字節串和字串的裝入指令,隱含了操作數。一般不使用重復前綴實際上是目標串固定為累加器的串傳送指令88串存儲指令格式:
STOS目標串首址標號
STOSBSTOSW功能:將AL(字節串)或AX(字串)的值復制到目標串中ES:DI所指的單元處;然后自動修改DI。STOSB、STOSW分別是字節串和字串的存儲指令,隱含了操作數。應用舉例實際上是源串固定為累加器的串傳送指令89串裝入/串存儲指令舉例
將大寫字母組成的源串元素全部轉換成小寫字母,并存入目標串中:
MOVCX,5 ;串元素的個數
LEASI,STR1 ;SI指向源串(數據段中)
LEADI,STR2 ;DI指向目標串(附加段中)
CLD ;DF=0,串指針自動增量AGN: LODSB ;源串元素裝入累加器
ADD AL,20H ;大寫字母→小寫字母
STOSB ;存入目標串中
LOOPAGN ;循環控制
……903.3.5控制轉移指令無條件轉移指令JMP過程調用及返回指令CALL、RET條件轉移指令:JC/JB/JNAE、JNC/JNB/JAE、JS、JNS、JZ/JE、 JNZ/JNE、JO、JNO、JP/JPE、JNP/JPO、JA/JNBE、JAE/JNB、JB/JNAE、JBE/JNA、JG/JNLE、JGE/JNL、JL/JNGE、JLE/JNG循環控制指令
LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE、JCXZ中斷及中斷返回指令INT、INTO、IRET小結控制程序流向:改變正常執行順序,轉向新目標91控制轉移指令概述所有控制轉移指令都只有一個操作數,通過該操作數給出目標地址——新的IP(或CS:IP)值。該類指令對IP(或CS:IP)進行強制性修改,并執行其他相關操作。不影響任何標志位的值。跳變或轉移的目標地址距離當前的正常指針的地址偏移量稱為“相對偏移量”:相對偏移量=目標地址-當前正常順序的IP值相對偏移量是一個符號數,正值表示向后跳轉,負值表示向前跳轉。92控制轉移指令可實現三種范圍的跳轉:近轉移(near):段內轉移,相對偏移量為1個字,取值范圍-32768~+32767;短轉移(short):段內轉移,相對偏移量為1字節,取值范圍-128~+127;遠轉移(far):段間轉移,目標地址與正常順序的IP值不在同一個代碼段內。近轉移、短轉移采用特殊的“相對尋址方式”來獲得轉移的目標地址。93相對尋址方式
僅用于進行段內直接轉移的控制轉移指令。指令操作數是8位或16位帶符號相對偏移量,代表目標地址與當前正常順序的地址之差:
目標地址=當前正常順序的IP值+相對偏移量編程時一般使用目標地址的標號作為操作數,不需要計算相對偏移量。
例:JNZDIFFRT941無條件轉移指令JMP格式:JMP操作數(目標地址)操作數(目標地址)的給出方式段內直接給出:例如
JMP標號
段內間接給出:例如JMPAX/JMPWORDPTR5[BX]
段間直接給出:例如JMPFARPTR標號
段間間接給出:例如JMPDWORDPTR[DI+1200H]功能:按照不同的操作數給出方式,找出目標地址,用它代替原指令指針。可實現全部存儲空間內的轉移。——相對尋址95示例設CS=2400H,IP=0100H,DS=2000H,BX=100H,標號JNEAR的地址是2400:0450H,標號JFAR的地址是3200:11A0H,
那么有:JMPJNEAR;JMPBXJMPWORDPTR5[BX]JMPFARJFARJMPDWORDPTR[BX]程序分別轉向何處運行?962過程調用及返回
過程(Procedure)常稱子程序,是指能夠完成某種獨立功能的程序模塊。主程序的調用實質上是一種強制改變正常指令指針順序的過程,調用之前的正常IP值稱為“斷點”。CALLRET97過程調用指令CALL格式:CALL操作數(即目標地址)操作數(目標地址)的給出方式段內直接給出,如:CALLNEARPTRSUBP段內間接給出,如:CALLAXCALLWORDPTR[BX+SI]段間直接給出,如:CALLFARPTRSUBP段間間接給出,如:CALLDWORDPTR[DI]98CALL指令執行的操作可實現的轉移執行過程段內直接/間接給出近轉移——目標地址與控制轉移指令位于同一代碼段內
SP減2,斷點(原IP值)入棧用目標地址(16位操作數的值)代替原IP值段間直接/間接給出遠轉移——目標地址與控制轉移指令位于不同代碼段中
SP減2,原CS值入棧
SP再減2,原IP值入棧用目標地址(32位操作數的值)代替原CS:IP值與JMP的不同之處:有對應的返回指令;必須保存斷點,執行過程與堆棧有關。99過程返回指令RET格式:
RETRET16位立即數位于被調過程的末尾;必須與CALL指令成對使用!根據對應的CALL指令轉移類型,自動確定段內/段間返回。功能:從棧頂彈出1個字(段內返回)或2個字(段間返回),作為返回地址(即斷點)給IP或CS:IP;SP相應加2或加4。指令后跟16位立即數,用以在恢復斷點后,在現行SP值上再加此數,以釋放相應數目的堆棧空間。必須是偶數,為什么?100示例設CS=2400H,IP=1010H,DS=2000H,BX=100H,SS=3000H,SP=0100H,標號SUBN的地址是1200H,標號SUBF的地址是3200:11A0H,
那么有:CALLSUBN;CALLBXCALLWORDPTR5[BX]CALLFARSUBFCALLDWORDPTR[BX]程序分別轉向何處運行?堆棧如何變化?1013條件轉移指令格式:指令助記符目標地址(短標號)功能:根據當前各標志位狀態進行判斷,如果滿足指令所指定的條件,則轉移至目標地址處;否則順序執行。尋址方式:相對尋址轉移范圍:短轉移,即相對位移量是一個8位的帶符號數(-128~+127)。本身并不影響任何標志位102根據單個標志進行判斷轉移的指令JS JZ/JEJP/JPEJCJOJNSJNZ/JNEJNP/JPOJNCJNO標志位=1則轉移:標志位=0則轉移:103判斷無符號數大小的指令JA/JNBE;目操作數>源操作數則轉移JAE/JNB;目操作數≥源操作數則轉移JB/JNAE;目操作數<源操作數則轉移JBE/JNA;目操作數≤源操作數則轉移
通常用在CMP指令之后;由指令自動選擇不同標志位,進行不同條件的判斷。104判斷帶符號數大小的指令JG/JNLE;目操作數>源操作數則轉移JGE/JNL;目操作數≥源操作數則轉移JL/JNGE;目操作數<源操作數則轉移JLE/JNG;目操作數≤源操作數則轉移通常用在CMP指令之后;由指令自動選擇不同的標志位和判斷條件。與無符號數不同!1054.循環控制指令格式:
LOOP短標號
LOOPZ/LOOPE短標號
LOOPNZ/LOOPNE短標號
JCXZ短標號尋址方式:相對尋址,只能實現短轉移。功能:根據CX的值和ZF標志判斷是否轉移。指令本身不影響ZF106LOOP指令:CX-1→CXCX≠0?是:轉移否:順序執行LOOPZ指令:CX-1→CXCX≠0且ZF=1?是:轉移否:順序執行LOOPNZ指令:CX-1→CXCX≠0且ZF=0?是:轉移否:順序執行JCXZ指令:CX=0?是:轉移否:順序執行107循環控制轉移指令的使用
MOVCX,10
(其它初始條件)NXT:(循環執行的指令)
LOOPNXT
(退出循環后的處理)
MOVCX,10
(其它初始條件)NXT:DECCX
JCXZ
LAST
(循環執行的指令)
JMPNXTLAST:(退出
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2216-2025電磁流量計在線校準規范
- 頂管施工合同(知識研究版本)
- 湖南省益陽市名校2025年初三考試生物試題分類匯編含解析
- 河北省石家莊市藁城區實驗學校2025年三年級數學第二學期期末學業質量監測試題含解析
- 洛陽科技職業學院《智慧供應鏈管理實訓》2023-2024學年第二學期期末試卷
- 山東交通職業學院《生物化學雙語》2023-2024學年第二學期期末試卷
- 江海職業技術學院《文學概論2》2023-2024學年第一學期期末試卷
- 民辦合肥經濟技術職業學院《工程項目認知實踐》2023-2024學年第一學期期末試卷
- 南京財經大學紅山學院《幾何學基礎》2023-2024學年第一學期期末試卷
- 蘭州現代職業學院《施工技術與組織設計》2023-2024學年第二學期期末試卷
- 青島商場分級管理制度
- 廣東省歷年中考作文題(2000-2023)
- 書法藝術療愈在書法教育中的實踐與應用研究
- 射頻電路封裝設計與工藝實現方法研究
- 線路工初級測試題含答案
- 體檢中心質量控制指南
- 2025年廣東中考試題數學及答案
- 四川2024年12月四川省內江市事業單位公開選調2名工作人員筆試歷年典型考題(歷年真題考點)解題思路附帶答案詳解
- 《預防未成年人犯罪》課件(圖文)
- 煤礦崗位標準化作業流程
- 全國網信系統網絡安全協調指揮技術系統建設指南
評論
0/150
提交評論