自己整理的指令
收藏
1 通用數(shù)據(jù)傳送指令
MOV(move)
傳送//不影響標(biāo)志位
MOV mem/reg1, mem/reg2(兩
個(gè)操作數(shù)必有一個(gè)是寄存器,且這種方式不允許指定段寄存器)
reg, data(data為
立即數(shù)) ac, mem(ac為
累加器)mem, ac segreg, mem/reg(不允許用CS寄
存器)
mem/reg, segreg mem/reg,
data(這
種方式目的操作數(shù)只用存儲(chǔ)器尋址方式而不用寄存器方式)
MOVSX (move with sign-extended) 帶符號(hào)擴(kuò)展傳送//不影響標(biāo)志位
MOVSX reg1,
reg2 reg, mem (原
操作數(shù)是帶符號(hào)數(shù),所以做符號(hào)擴(kuò)展)
MOVZX(move with
zero-extended) 帶零擴(kuò)展傳送//不影響標(biāo)志位
MOVSX reg1,
reg2 reg, mem (原
操作數(shù)是無符號(hào)整數(shù)所以做零擴(kuò)展,不管原操作熟符號(hào)位是否為1)
PUSH (push
onto the stack)
進(jìn)棧//不
影響標(biāo)志位
push reg mem data segreg
POP (pop from the stack) 出棧//不影響標(biāo)志位
pop reg mem
segreg
其中段地址存放于SS寄存器中。 SP(16位)或ESP(32位)的內(nèi)容在任何時(shí)候都指向當(dāng)前棧頂。
堆棧的存取在16位指令中必須以字為單位(不允許字節(jié)堆棧),在32位指令中必須以雙字為單位。
8086不允許PUSH指令使用立即數(shù)尋址方式,286及后繼機(jī)型允許立即數(shù)進(jìn)棧。
PUSHA/PUSHAD(push all registers) 所有寄存器進(jìn)棧//不影響標(biāo)志位
PUSHA:進(jìn)
棧次序:AX,CX,DX,BX,指令執(zhí)行前的SP,BP,SI,DI.指
令執(zhí)行后(sp)←(SP)-16仍指向棧頂
PUSHAD:32位,
進(jìn)棧次序同PUSHA
POPA/POPAD(pop all registers) 所有寄存器出棧//不影響標(biāo)志位
POPA(16位)出
棧次序:DI,SI,BP,SP,BX,DX,CX,AX. 指
令執(zhí)行后(sp)←(SP)+16仍指向棧頂
POPAD:32位,
進(jìn)棧次序同POPA.
XCHG(exchange)
交換//不影響標(biāo)志
執(zhí)
行操作 (OPR1)←→(OPR2)這
兩個(gè)操作數(shù)必有一個(gè)在寄存器中,不允許使用段寄存器。該指令可用于除立即數(shù)外的任何尋址方式。
2 累加器專用傳送指令
IN(input) 輸入//不影響標(biāo)志位
OUT(output) 輸出//不影響標(biāo)志位
這
兩個(gè)指令只限于累加器EAX,AX,AL。IN指
令完成從I/O到CPU的
信息傳送,而OUT指
令完成從CPU到I/O信
息傳送。CPU只
能用累加器接受或發(fā)送信息。
XLAT(translate)
換碼//不影響標(biāo)志位
在
使用這條指令前應(yīng)先建立一個(gè)字節(jié)表格,其首地址提前存入BX/EBX,需要轉(zhuǎn)換代碼應(yīng)該是相對(duì)于表格首地址的位移量也提前存放在AL中,
表格內(nèi)容則是所要換取的代碼,指令執(zhí)行完后就可在AL中得到轉(zhuǎn)換后的代碼。32位:(
3 地址傳送指令
LEA(load effective
addresss) 有效地址送寄存器//不影響標(biāo)志位
目
的操作數(shù):可用于16位或32位寄存器,但不能使用段寄存器。源操作數(shù):除立即數(shù)和寄存器外的任一種存儲(chǔ)器尋址方式。
注意1:LEA
BX,[BX+SI+0F62H]這里BX寄
存器得到的是有效地址而不是該存儲(chǔ)單元內(nèi)容。如果是MOV BX,[BX+SI+0F62H],則BX中得到是偏移地址為ⅹⅹⅹ那個(gè)單元內(nèi)容而不是其偏移地址。
注意2 : 比較 LEA
BX, LIST 和MOV
BX, OFFSET LIST。
這兩條指令功能上相同,且MOV指令速度快,但OFFSET只能與簡(jiǎn)單的符號(hào)地址相連,而
不能和諸如LIST[SI]或[SI]等復(fù)雜操作數(shù)相連。
LDS(load DS with pointer) 指針?biāo)图拇嫫骱虳S//不影響標(biāo)志位
LES(load ES with pointer) 指針?biāo)图拇嫫骱虴S//不影響標(biāo)志位
LFS(load FS with pointer) 指針?biāo)图拇嫫骱虵S//不影響標(biāo)志位
LGS(load GS with pointer) 指針?biāo)图拇嫫骱虶S//不影響標(biāo)志位
LSS(load SS with pointer) 指針?biāo)图拇嫫骱蚐S//不影響標(biāo)志位
該
組指令的源操作只能用存儲(chǔ)器尋址方式。目的寄存器不允許使用段寄存器。
4 標(biāo)志寄存器傳送指令
LAHF(load AH with flags) 標(biāo)志送AH//不影響標(biāo)志位
執(zhí)
行操作:(AH)←(FLAGS低
字節(jié))
SAHF(store AH into flags) AH送標(biāo)志寄存器//由裝入值來確定標(biāo)志位值
執(zhí)
行操作:(FLAGS低
字節(jié))←(AH)
PUSHF/PUSHFD
標(biāo)志進(jìn)棧//由裝入值來確定標(biāo)志位值
執(zhí)
行操作:
PUSHF (SP)←(SP)-2
( (SP)+1), (SP) )←(FLAGS)
PUSHFD
(ESP)←(ESP)-4
(
(ESP+3), (ESP+2), (ESP+1), (ESP) ) ←(EFLAGS AND
OFCFFFFH)(清VM和RF 位)
POPF/POPFD(pop the
flags or eflags) 標(biāo)志出棧//由裝入值來確定標(biāo)志位值
執(zhí)
行操作:POPF (FLAGS)←( (SP)+1), (SP) ) (SP)←(SP)+2
POPFD (EFLAGS)←((ESP)+3,(ESP+2),(ESP+1),(ESP)) (ESP)←(ESP)+4
POPFD指
令不影響VM,RF,IOPL,VIF和VIP的
值。
5 類型轉(zhuǎn)換指令
CBW(convert byte to word) 字節(jié)轉(zhuǎn)換為字//不影響標(biāo)志位
執(zhí)
行操作:AL的內(nèi)容擴(kuò)展到AH,形
成AX中的字。即如果(AL)的
最高有效位為0,則(AH)=0;如
果為1(AH)=OFFH
CWD/CWDE(convert word to double word) 字轉(zhuǎn)換為雙字//不影響標(biāo)志位
執(zhí)
行操作:AX的內(nèi)容擴(kuò)展到DX,形
成DX:AX的雙字。即若(AX)的
最高有效位為0,(DX)=0;若為1,(DX)=0FFFFH
CDQ(convert double to quad) 雙字轉(zhuǎn)換為4字//不影響標(biāo)志位
執(zhí)
行操作:EAX的
內(nèi)容擴(kuò)展到EDX,形
成EDX:EAX中
的4字。
BSWAP(byte swap) 字節(jié)交換//不影響標(biāo)志位
BSWAP EAX。
字節(jié)次序變反,具體為1,4字
節(jié)互換,2,3字
節(jié)互換。該指令只能用于486及其后繼機(jī)型。
算術(shù)指令
1
加法指令
ADD(add) 加法//影響條件標(biāo)志位
ADC(add with carry) 帶進(jìn)位加法//影響條件標(biāo)志位
注:ADC這
條指令里,其中CF為進(jìn)位位的值。
INC(increment) 加1//影響條件標(biāo)志位(除了CF標(biāo)志)
(上
3條)可
做字或字節(jié)運(yùn)算。OF位
可以用來表示帶符號(hào)數(shù)溢出,CF位則可以用來表示無符號(hào)數(shù)的溢出。
XADD(exchange and add) 交換并相加//影響條件標(biāo)志位
該
指令源操作數(shù)只能用寄存器尋址方式,目的操作數(shù)可用寄存器或任一種存儲(chǔ)器尋址方式。
執(zhí)
行操作:TEMP←(SRC)+(DST) (SRC)←(DST)
(DST)←TEMP
2
減法指令
SUB(subtract) 減法//影響條件標(biāo)志位
SBB(subtract with borrow) 帶借位減法//影響條件標(biāo)志位
執(zhí)
行操作:(DST)←(DST)-(SRC)-CF
DEC(decrement) 減1//影響條件標(biāo)志位(除了CF標(biāo)志)
NEG(negate) 求補(bǔ)
//影響條件標(biāo)志位
執(zhí)
行操作:(OPR)←-(OPR)亦
即把操作數(shù)按位求反后末位加1,因而執(zhí)行可表示為(OPR)←0FFFFH-(OPR)+1
只
有當(dāng)操作數(shù)為0時(shí),求補(bǔ)運(yùn)算結(jié)果使CF=0,其他情況均為1。
CMP(compare) 比較//影響條件標(biāo)志位
(OPR1)-(OPR2),不
保存結(jié)果,只是根據(jù)結(jié)果設(shè)置條件標(biāo)志位。其后往往跟著條件轉(zhuǎn)移指令。
CMPXCHG(compare and exchange) 比較并交換 //影響條件標(biāo)志位
該
指令只能用于486及
其后繼機(jī)型。SRC只
能用8,16,或32位寄存器。DST則可用寄存器或任何一種存儲(chǔ)器尋址方式。執(zhí)行操作:累加器和DST比
較 。
CMPXCHG8B(compare and exchange 8 byte) 比較并交換8字節(jié) //影響ZF標(biāo)志位
該
指令只能用于Pentium及
其后繼機(jī)型。源操作數(shù)存放于EDX,EAX中64位字,目的操作數(shù)可用存儲(chǔ)器尋址方式確定一個(gè)64位
字。執(zhí)行操作EDX,EAX和DST相
比較。
注:條件碼。OF標(biāo)志位同加法指令,這里若兩個(gè)數(shù)符號(hào)相反而結(jié)果的符號(hào)與減數(shù)相同,則OF=1;除上述情況外OF=0。OF=1說明帶符號(hào)
數(shù)的減法溢出,結(jié)果錯(cuò)誤。
減
法的CF值反映無符號(hào)運(yùn)算中的借位情況,因此當(dāng)作無符號(hào)數(shù)運(yùn)算時(shí),若減數(shù)>被減數(shù),此時(shí)有借位,則CF=1;否則
CF=0。即有進(jìn)位時(shí)CF=0,無進(jìn)位時(shí)CF=1。
另
外注意8086中處理雙字的方法(也適用于386及其后繼機(jī)型中對(duì)4字的處理)。
3
乘法指令
MUL(unsigned multiple) 無符號(hào)數(shù)乘法//對(duì)除CF和OF以外的條件碼位無定義
IMUL(signed multiple) 帶符號(hào)數(shù)乘法//對(duì)除CF和OF以外的條件碼位無定義
執(zhí)行操作: 字節(jié)操作數(shù):
(AX)←(AL)*(SRC),字操作數(shù)和雙字操作數(shù)操作同字節(jié)操作數(shù)。
目的操作數(shù)必須是累加器(累加器為隱含),字運(yùn)算為AX,字節(jié)運(yùn)算為AL。兩個(gè)8位數(shù)相乘得到16位數(shù)存放在AX中,兩個(gè)16
位數(shù)相乘得到32位數(shù)存放在DX,AX中,其中DX存放高位字,AX存放低位字。386以后可做雙字運(yùn)算。
對(duì)于80286及其后繼機(jī)型,IMUL除上述單操作數(shù)指令(累加器為隱
含),還有雙操作數(shù)和三操作數(shù)。如:
IMUL
REG,SRC IMUL REG,SRC,IMM
IMUL REG,SRC
執(zhí)行操作:
字操作數(shù):(REG16)←(REG16)*(SRC) 雙字操作數(shù):(REG32)←(REG32)*(SRC)
其中目的操作數(shù)必須是16位或32位寄存器;源操作數(shù)可用任一種尋址方式取得和目的操作數(shù)長(zhǎng)度相同
的數(shù);但如源操作數(shù)為立即數(shù)時(shí),除相應(yīng)地用16位或32位立即數(shù)外,指令中也可指定8位立即數(shù),在運(yùn)算時(shí)機(jī)器會(huì)自動(dòng)把該數(shù)符號(hào)
擴(kuò)展成與目的操作數(shù)長(zhǎng)度相同的數(shù)。
IMUL
REG,SRC,IMM 執(zhí)行操作:
字
操作數(shù):(REG16)←(SRC)*IMM
雙字操作數(shù):(REG32)← (SRC)*IMM
目
的和源操作數(shù)同上,IMM表示立即數(shù),可以為8,16,32,運(yùn)算時(shí)必須和目的操作數(shù)長(zhǎng)度一致。
注:條件碼。對(duì)
于MUL指令,如果乘積的高一半為0,即字節(jié)操作的(AH)或字操作的(DX)或雙字操作的(EDX)為0,則CF和OF均為0;否則CF和OF均為1。
對(duì)
于IMUL指令,如果乘積的高一半是低一半的符號(hào)擴(kuò)展,則CF和OF均為0,否則就為1。
機(jī)
器規(guī)定:16位
操作數(shù)相乘得到的乘積在16位之內(nèi)或32位操作數(shù)相乘得到的乘積在32位
之內(nèi)時(shí),OF和CF位
置0,
否則置1,
這時(shí)的OF位
為1是
說明溢出的。其它標(biāo)志位無定義。
4 除法指令
DIV(unsigned divide) 無符號(hào)數(shù)除法//對(duì)所有條件碼均無定義
執(zhí)
行操作:(商和余數(shù)均為無符號(hào)數(shù))
字節(jié)操作:16位
被除數(shù)在AX中,8位
除數(shù)為源操作數(shù),結(jié)果的8位商在AL中,8位
余數(shù)在AH中。表示為:(AL)←(AX)/(SRC)的
商 (AH)←(AX)/(SRC)的
余數(shù)
字操作:32位
被除數(shù)在DX,AX中。
其中DX為高位字;16位
除數(shù)為源操作數(shù),結(jié)果的16位商在AX中,16位
余數(shù)在DX中。表示為: (AX)←(DX,AX)/(SRC)的
商 (DX)←(DX,AX)/(SRC)的
余數(shù)
雙字操作:64位
被除數(shù)在EDX,EAX中。
其中EDX為高位雙字;32位
除數(shù)為源操作數(shù),結(jié)果的32位商在AX中,32位
余數(shù)在EDX中。表示為:(EAX)←(EDX,EAX)/(SRC)的
商 (EDX)←(EDX,EAX)/(SRC)的
余數(shù)
IDIV(signed divide) 帶符號(hào)數(shù)除法//對(duì)所有條件碼均無定義
執(zhí)
行操作:同DIV,但操作數(shù)必須是帶符號(hào)數(shù),商和余數(shù)也都是帶符號(hào)數(shù),且余數(shù)的符號(hào)和
被除數(shù)的符號(hào)相同。
除
法指令尋址方式同乘法指令。由于除法指令的字節(jié)操作要求被除數(shù)為16位,
字操作要求被除數(shù)為32位,雙字操作要求被除數(shù)為64位,
因此往往需要用符號(hào)擴(kuò)展方法取得除法指令所需的被除數(shù)格式。
另
外需注意一個(gè)問題,除法指令要求字節(jié)操作時(shí)商為8位,字操作時(shí)商為16位,
雙字操作時(shí)商為32位。如果字節(jié)操作時(shí),被除數(shù)的高8位
絕對(duì)值≥除數(shù)絕對(duì)值;或者字操作時(shí),被除數(shù)的高16位絕對(duì)值≥除數(shù)絕對(duì)值;或者雙字操作時(shí),被除數(shù)高32位
絕對(duì)值≥除數(shù)絕對(duì)值,則商就會(huì)產(chǎn)生溢出。
5 十進(jìn)制調(diào)整指令
1 .壓縮的BCD碼調(diào)整指令
DAA(decimal adjust for addition) 加法的十進(jìn)制調(diào)整指令//對(duì)OF標(biāo)志位無定義,影響其它位
執(zhí)
行操作:(AL)←把AL中
的和調(diào)整到壓縮的BCD格式,這條指令之前必須執(zhí)行ADD或ADC指
令,加法指令必須把兩個(gè)壓縮的BCD碼相加,并把結(jié)果存放在AL寄
存器中。
本指令調(diào)整方法:如果AF標(biāo)
志(輔助進(jìn)位位)為1,
或者ALa存器的低4位
是16進(jìn)制的A~F,
則使AL寄存器的內(nèi)容加06H,
且將AF位置1;
如果CF標(biāo)志為1,
或者AL寄存器的高4位
是16進(jìn)制的A~F,
則AL寄存器內(nèi)容加60H,
并將CF位置1。
DAS(decimaladjust
for subtraction)減法十進(jìn)制調(diào)整指令//對(duì)OF標(biāo)志位無定義,影響其它位
執(zhí)
行操作:(AL)←把AL中
的差調(diào)整到壓縮的BCD格式。執(zhí)行這條指令前必須先執(zhí)行SUB或SBB指
令,
減法指令必須把兩個(gè)BCD碼
相減,并把結(jié)果存放在AL寄存器中。本指令調(diào)整方法同DAA指
令。
2 .非壓縮的BCD碼調(diào)整指令
AAA(ASCII
adjust for addition) 加法的ASCII調(diào)整指令//除影響AF和CF標(biāo)
志
外,其余標(biāo)志位無定義
執(zhí)行操作:(AL)←把AL中的和調(diào)整到非壓縮的BCD格
式 (AH)←(AH)+ADC生
的進(jìn)位值
執(zhí)行這條指令前必須先執(zhí)行ADD或ADC指
令,加法指令必須把兩個(gè)非壓縮的BCD碼相加,并把結(jié)果存
放在AL寄存器。
本指令的調(diào)整步驟:①如AL寄存器的底4位
在0~9之
間,且AF位
為0,
則跳過第②步,執(zhí)行第③步;
②如AL寄
存器的低4位在十六進(jìn)制數(shù)A~F之
間或AF為1,
則AL寄存器的內(nèi)容加6,AH寄
存器的內(nèi)容加1,
并將AF位置1;
③清除AL的
高4位
④AF的值送CF位
AAS(ASCII
adjust for subtraction) 減法的ASCII調(diào)
整指令//除影響AF和CF標(biāo)志外,其余標(biāo)志位無定義
執(zhí)行操作:(AL)←把AL中的差調(diào)整到非壓縮的BCD格
式 (AH)←(AH)-
調(diào)整產(chǎn)生的借位值
執(zhí)行這條指令前必須先執(zhí)行SUB或SBB指
令,減法指令必須把兩個(gè)非壓縮的BCD碼相減,并把結(jié)果存放
在AL寄存器。
本指令的調(diào)整步驟:①如AL寄存器的底4位
在0~9之
間,且AF位
為0,
則跳過第②步,執(zhí)行第③步;
②如AL寄
存器的低4位在十六進(jìn)制數(shù)A~F之
間或AF為1,
則AL寄存器的內(nèi)容減6,AH寄
存器的內(nèi)容減1,
并將AF位置1;
③清除AL的
高4位
④AF的值送CF位
AAM(ASCII
adjust for multiplication) 乘法的ASCII調(diào)整指令//根據(jù)AL寄存器的內(nèi)容設(shè)置條件
碼SF、ZF和PF,但OF,CF和AF位無定義
執(zhí)行操作:(AX)←
把AL中的積調(diào)整到非壓縮的BCD碼。
在執(zhí)行這條指令之前,必須先執(zhí)行MUL指
令,把兩個(gè)非壓縮的BCD碼相乘(此時(shí)要求其高4位
為0),結(jié)果
放在AL寄存器中。
本指令調(diào)整方法:把AL寄
存器的內(nèi)容除以0AH,商放在AH寄
存器中。
AAD(ASCII
adjust for division) 除法的ASCII調(diào)
整指令//根據(jù)AL寄
存器的內(nèi)容設(shè)置條件 碼SF、ZF和PF,但OF,CF和AF位無定義
執(zhí)
行操作:(AH)←10*(AH)+(AL) (AH)←0
如
果被除數(shù)是存放在AX寄存器中的二位非壓縮BCD數(shù),AH中
存放十位數(shù),AL中存放個(gè)位數(shù),而且要求AH和AL中
的高4位均為0。
除數(shù)是一位非壓縮的BCD數(shù),同樣要求高4位
為0。在把這兩個(gè)數(shù)用DIV指
令相除以前,必須先用AAD指令把AX中
的被除數(shù)調(diào)整成二進(jìn)制數(shù),并存放在AL寄存器里。因此,AAD指
令執(zhí)行如上。
邏輯指令
1 邏輯運(yùn)算指令
AND(and) 邏輯與//使CF和OF為0,AF位無定義
執(zhí)
行操作:(DST)←(DST)∧(SRC)
用AND指
令可以使操作數(shù)的某些位被屏蔽。只需要把AND指令的源操作數(shù)設(shè)置成一個(gè)立即數(shù),并
把需要屏蔽的位設(shè)為0,這
樣指令執(zhí)行的結(jié)果就可以把操作數(shù)的相應(yīng)位置0,其他各位保持不變.
OR (or) 邏輯或//使CF和OF為0,AF位無定義
執(zhí)
行操作:(DST)←(DST)∨(SRC)
用OR指
令可以使操作數(shù)的某些位置1,其他位保持不變.只需把OR指
令的源操作數(shù)設(shè)置為一個(gè)立即數(shù),并把需要置1的位設(shè)為1,就
可達(dá)到目的.
NOT (not) 邏輯非//不影響標(biāo)志位
執(zhí)
行操作:(OPR)←(OPR)
XOR (exclusive or ) 異或//使CF和OF為0,AF位無定義
(DST)←(DST)⊕(SRC)
要
使操作數(shù)的某些位變反,可
以用XOR指
令,只
要把源操作數(shù)的立即數(shù)字段的相應(yīng)位置成1就可以達(dá)到目的.
XOR指
令還可以測(cè)試某一操作數(shù)是否與另一確定的操作數(shù)相等.這種操作在檢查地址是否匹配時(shí)常用.
TEST( test) 測(cè)試//使CF和OF為0,AF位無定義
執(zhí)
行操作:(OPR1)∧(OPR2)
用
途:要測(cè)試操作數(shù)的某些位是否為0,可
用TEST指令,同
樣把TEST指令的源操作數(shù)設(shè)置成一個(gè)立即數(shù),其
中需要測(cè)試的位應(yīng)設(shè)為1.要測(cè)試操作數(shù)的某位是否為1,可
先把該操作數(shù)求反,然后用TEST指
令測(cè)試.這里常用于條件轉(zhuǎn)移.
2 位
測(cè)試并修改指令
BT(bit test) 位測(cè)試//影響CF值,對(duì)其它位無定義
執(zhí)
行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF。
BTS(bit test and set) 位測(cè)試并置1//影響CF值,對(duì)其它位無定義
執(zhí)
行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF,
并將目的操作數(shù)中的該位置1。
BTR (bit test and reset) 位測(cè)試并置0//影響CF值,對(duì)其它位無定義
執(zhí)
行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF,
并將目的操作數(shù)中的該位置0。
BTC (bit test and complement) 位測(cè)試并變反//影響CF值,對(duì)其它位無定義
執(zhí)
行操作:把目的操作數(shù)中由源操作數(shù)所指定位的值送往標(biāo)志位CF,
并將目的操作數(shù)中的該位變反。
本組指令中
的SRC可以使用寄存器方式或立即數(shù)方式,即可以在指令中用8位
立即數(shù)直接指出目的操作數(shù)所要測(cè)試位的位位置。也可以用任一字寄存器或雙字寄存器的內(nèi)容給出同一個(gè)值。目的操作數(shù)則可用除立即數(shù)外的任一種尋址方式指定一
個(gè)字或雙字。由于目的操作數(shù)的字節(jié)最大為32位,所以位位置的范圍應(yīng)是0~31。
3 位掃描指令
BSF (bit
scan forward) 正向位掃描//影響ZF位,其他標(biāo)志位無影響
執(zhí)
行操作:指令從位0開始自右向左掃描源操作數(shù),目的是檢索第一個(gè)為1的
位。如遇到第一個(gè)為1的位則將ZF位
置0,并把該位的位位置裝入目的寄存器中;如源操作數(shù)為0,
則將ZF位置1,
目的寄存器無定義。
BSR (bit
scan reverse) 反向位掃描//影響ZF位,其他標(biāo)志位無影響
與BSF指
令唯一區(qū)別是BSR指令檢索從高位向低位,而BSF檢
索從低位開始第一個(gè)出現(xiàn)的1。
4 移位指令
1.移位指令
SHL (shift logical left) 邏輯左移//根據(jù)移位后的結(jié)果設(shè)置SF、ZF和PF的值
格
式:SHL OPR,CNT
其
中OPR用除立即數(shù)外的任何尋址方式。移位次數(shù)由CNT決
定。在8086中可以是1或CL。
若移位次數(shù)大于1,可在該移位指令前把移位次數(shù)置于CL寄
存器,而移位指令中的CNT寫為CL。
當(dāng)然其它機(jī)型可以直接把CNT寫成用8位
立即數(shù)指定范圍從1到31的
移位次數(shù)。
邏
輯移位指令適用于無符號(hào)數(shù)運(yùn)算。其中SHL用來乘以2。
SAL (shift arithmetic left) 算術(shù)左移//根據(jù)移位后的結(jié)果設(shè)置SF、ZF和PF的值
格
式同上。算術(shù)指令適用于帶符號(hào)數(shù)運(yùn)算。SAL用來乘以2。
SHR (shift logical right) 邏輯右移//根據(jù)移位后的結(jié)果設(shè)置SF、ZF和PF的值
格
式同上。邏輯移位指令適用于無符號(hào)數(shù)運(yùn)算。其中SHR用
來除以2。
SAR (shift arithmetic right) 算術(shù)左移//根據(jù)移位后的結(jié)果設(shè)置SF、ZF和PF的值
格
式同上。算術(shù)指令適用于帶符號(hào)數(shù)運(yùn)算。SAR用來除以2。
這
里最高有效位右移,同時(shí)再用它自身值填入。
移位指令常用來乘以2或除以2的操作。
CF OPR OPR CF OPR CF
(1)邏輯及算術(shù)左移 (2)邏輯右移
(3)算術(shù)右移
2.循環(huán)移位指令
ROL (rotate left) 循環(huán)左移//CF根
據(jù)各條指令規(guī)定設(shè)置,OF當(dāng)CNT=1時(shí)有效,否則無定義
ROR (rotate right) 循環(huán)右移//同上
RCL ( rotate left through
carry) 帶進(jìn)位循環(huán)左移//同上
RCR (rotate right through
carry ) 帶進(jìn)位循環(huán)右移//同上
以
上2組
指令都可以作字或字節(jié)操作,386及后繼機(jī)型還可以做雙字操作。
CF OPR
OPR CF
循環(huán)左移 循環(huán)右移
CF OPR
OPR CF
帶進(jìn)位循環(huán)左移 帶進(jìn)位循環(huán)右移
3.雙精度移位指令
SHLD (shift left double ) 雙精度左移//當(dāng)移位次數(shù)為0時(shí),
不影響標(biāo)志位;否則
根據(jù)移位后的結(jié)果設(shè)置SF、ZF、PF、CF值
SHRD (shift right double )
雙
精度右移//同上
格式: SHLD(SHRD) DST,REG,CNT
DST可
以用除立即數(shù)以外任一種尋址方式指定字或雙字操作數(shù)。源操作數(shù)只能使用寄存器方式指定與目的操作數(shù)相同長(zhǎng)度的字或雙字。CNT為
移位次數(shù),可以是一個(gè)8位
立即數(shù),也可是CL,
其內(nèi)容存放移位計(jì)數(shù)值,范圍從1到31,大于31則
自動(dòng)取模32的
值來取代。
這組指令在邊界不對(duì)準(zhǔn)的位串傳送中很有用。如所要傳送的位串的第一個(gè)位的位位置
不在字節(jié)地址的邊界上時(shí),就可以用這組指令來處理。
0
0
CF CF
0 0 0
雙精度左移 雙精度右移
串處理指令
特性:
數(shù)據(jù)類型
|
字節(jié)
|
字
|
雙字
|
方向(DF)
|
向前(DF=0)
|
向后(DF=1)
|
串長(zhǎng)度
|
1
|
重復(fù)REP(Count Reg)次
|
源串((source-index))
目的串((destination-index))
|
在數(shù)據(jù)段中(可用段跨越前綴
修改)
在附加段中
|
|
|
|
|
|
REP重
復(fù)串操作直到計(jì)數(shù)器寄存器count reg的內(nèi)容為0為止。格式:REP string primitive
其
中string primitive可為MOVS,STOS,LODS,INS和OUTS指
令。執(zhí)行操作:(1)如(count reg)=0,則
退出ERP,
否則往下執(zhí)行 (2)(count reg)←(count reg-1) (3)執(zhí)
行其后的串指令 (4)重復(fù)(1)~(3)
CLD(clear direction flag)該指令使DF=0,
在執(zhí)行串處理指令時(shí)可使地址自動(dòng)增量
STD (set
direction flag)該指令使DF=0,在執(zhí)行串處理指令時(shí)可使地址自動(dòng)減量
1 MOVS 串傳送指令//
不影響標(biāo)志位
MOVS DST,SRC MOVSB(字節(jié)) MOVSW(字) MOVSD(386及后繼機(jī)型可用)
MOVS尋址方式是隱含的。所以這種格式中的DST和SRC只
提供給匯編程序做類型檢查用,并且不允許用其他尋址方式來確定操作數(shù)。
在執(zhí)行操作前有如下準(zhǔn)備工作:
①把存放在數(shù)據(jù)段中的源串首地址(如反向傳送則是末地址)放入源變址寄存器
②把將要存放數(shù)據(jù)串的附加段中的目的串首地址(或反向傳送時(shí)的末地址)放入目的變
址寄存器中;
③把數(shù)據(jù)串長(zhǎng)度放入計(jì)數(shù)寄存器中
④建立方向標(biāo)志
功
能:把由源變址寄存器指向的數(shù)據(jù)段中的一個(gè)字(或雙字,或字節(jié))傳送到由目的變址寄存器指向的附加段中的一個(gè)字(或雙字,或字節(jié))中去。同時(shí)根據(jù)方向標(biāo)志
及數(shù)據(jù)格式(或雙字,或字節(jié))對(duì)源變址寄存器和目的變址寄存器進(jìn)行修改。
2
STOS 存入串指令//不影響標(biāo)志位
STOS DST STOSB(字節(jié)) STOSW(字) STOSD(雙字)386及
后繼機(jī)型可用
該
指令把AL,AX或EAX的
內(nèi)容存入由目的變址寄存器指向的附加段的某單元中,并根據(jù)DF的值及數(shù)據(jù)類型修改目的變址寄存器的內(nèi)容。當(dāng)它與REP聯(lián)
用時(shí),可把AL、AX或EAX的
內(nèi)容存入一個(gè)長(zhǎng)度為(count
reg)的緩沖區(qū)中。
STOS在
初始化某一緩沖區(qū)時(shí)很有用。
3 LODS
從串取指令//不影響標(biāo)志位
LODS SRC LODSB(字節(jié)) LODSW(字) LODSD(雙字)
該
指令把由源變址寄存器指向的數(shù)據(jù)段中某單元的內(nèi)容送到AL、AX、EAX中,并根據(jù)方向標(biāo)志和數(shù)據(jù)類型修改源變址寄存器的內(nèi)
容。指令允許使用段跨越前綴來指定非數(shù)據(jù)段的存儲(chǔ)區(qū)。
4 INS
串輸入指令//不影響標(biāo)志位
INS DST,DX INSB(字節(jié)) INSW(字) INSD(雙字)
把
段口號(hào)在DX寄
存器中的I/O空
間的字、字節(jié)、雙字傳送到附加段中的由目的變址寄存器所指向的存儲(chǔ)單元中,并根據(jù)DF的值和數(shù)據(jù)類型修改目的變址寄存器的內(nèi)容。
5 OUT
串輸出指令//不影響標(biāo)志位
OUTS DX,SRC OUTSB(字節(jié)) OUTSW(字) OUTSD(雙字)
該
指令把由源變址寄存器所指向的存儲(chǔ)器中的字節(jié)、字或雙字傳送到端口號(hào)在DX寄存器中的I/O端
口中去,并根據(jù)DF的
值和數(shù)據(jù)類型修改目的變址寄存器的內(nèi)容。
6
與REPE/REPZ和REPNE/REPNZ聯(lián)合工作的CMPS和SCAS指令
1.REPE/REPZ 當(dāng)相等/為0時(shí)重復(fù)操作
格
式:REPE(或REPZ)
string primitive(可
為CMPS或SCAS)
執(zhí)
行操作:①如(count reg)=0或ZF=0(即
某次比較的結(jié)果兩個(gè)操作數(shù)不等)時(shí)退出,否則往下執(zhí)行。
②(count
reg)←(count reg)-1 ③執(zhí)行其后的串指令 ④重復(fù)①~③
2. REPNE/REPNZ 當(dāng)不相等//不為0時(shí)重
復(fù)串操作
格式:REPNE(或REPNZ) string primitive(可
為CMPS或SCAS)
執(zhí)行操作:只要兩數(shù)比較的結(jié)果不相等,就可繼續(xù)執(zhí)行串處理指令,如某次兩數(shù)比較相等或(count reg)= 0 時(shí),就可結(jié)束操作。退出條件為(count reg)=0或ZF=1外,其它與REPE完全相同。
3. CMPS 串比較指令//根據(jù)結(jié)果設(shè)置條件碼
CMPS SRC,DST CMPSB CMPSW CMPSD
執(zhí)行操作:指令把由源變址寄存器指向的數(shù)據(jù)段中的一個(gè)字節(jié)、字或雙字與由目的變址寄存器所指向的附加段中的一個(gè)字節(jié)、字或雙字
相減,但不保存結(jié)果,只根據(jù)結(jié)果設(shè)置條件碼。指令的其它特性和MOVS指令的規(guī)定相同。
4.SCAS
串掃描指令//根據(jù)結(jié)果設(shè)置條件碼
SCAS DST SCASB SCASW SCASD
執(zhí)行操作:指令把AL、AX或EAX的內(nèi)容與由目的變址寄存器指向的在附加段中的一個(gè)字節(jié)、字或雙字進(jìn)行比較,并不保存結(jié)果,只根據(jù)結(jié)果設(shè)置條
件碼。指令的其他特性和MOVS的規(guī)定相同。
控制轉(zhuǎn)移指令
1段內(nèi)轉(zhuǎn)移:指同一段的范圍內(nèi)進(jìn)行轉(zhuǎn)移,此
時(shí)只需修改IP或EIP,用新轉(zhuǎn)移目標(biāo)地址去替轉(zhuǎn)移分為:
2段間轉(zhuǎn)移:要轉(zhuǎn)到另一個(gè)段去執(zhí)行程序,
要修改IP(EIP)和CS寄存器內(nèi)容。段地址+偏移地址
1 無條件轉(zhuǎn)移指令
JMP(jump) 無條件轉(zhuǎn)移指令//不影響條件碼
(1)段內(nèi)直接短轉(zhuǎn)移 JMP SHORT OPR
執(zhí)行操作:(IP)←(IP)+8位
位移 如果操作數(shù)16位,則還需(EIP)←(EIP) AND 0000FFFFH
8位
位移量是由目標(biāo)地址
OPR確
定。轉(zhuǎn)移的目標(biāo)地址在匯編格式中可直接使用符號(hào)地址,而在機(jī)器執(zhí)行時(shí)則是當(dāng)前的IP或EIP的
值(即JMP指
令的下一條指令的地址)與
指令中指定的8位
位移量之和。位移量既可表示向前又可表示向后移,是一個(gè)帶符號(hào)數(shù)。(所以這種格式只允許在-128到+127字節(jié)范圍內(nèi)轉(zhuǎn)移)
(2)段內(nèi)直接近轉(zhuǎn)移 JMP NEAR PTR OPR
執(zhí)行操作:(IP)←(IP)+16位
位移 80386及后繼機(jī)型為:(EIP)←(EIP)+32位位移量
如果操作數(shù)16位,則還需(EIP)←(EIP) AND 0000FFFFH
同樣采用相對(duì)尋址。在8086及其它機(jī)型的實(shí)模式下段長(zhǎng)為64K,所以16位
位移量可以轉(zhuǎn)移到段內(nèi)的任一個(gè)位置。在386及后繼機(jī)型的保護(hù)模式下,段的大小可達(dá)4G,32位
位移量可以轉(zhuǎn)到段內(nèi)任何位置。
(3)段內(nèi)間接近轉(zhuǎn)移 JMP WORD PTR OPR
執(zhí)行操作:(IP)←(EA),386及
后繼機(jī)型則為:(EIP)←(EA)。如果操作數(shù)16位,則還需(EIP)←(EIP) AND 0000FFFFH
其
中有效地址EA值
由OP R尋
址方式確定。它可以使用除立即數(shù)方式以外的任一種尋址方式。如果指定是寄存器,則把寄存器的內(nèi)容送到IP或EIP寄
存器中;如果指定是存儲(chǔ)器中的一個(gè)字或雙字,則把該存儲(chǔ)單元的內(nèi)容送到IP或EIP寄存器中去。
(4)段間直接遠(yuǎn)轉(zhuǎn)移 JMP FAR PTR OPR
直接 執(zhí)行操作:(IP)← OPR的
段內(nèi)偏移地址 (CS)← OPR所
在段的段地址
尋址 386及
后繼機(jī)型為:(EIP)← OPR的段內(nèi)偏移地址 (CS)← OPR所在段的段地址
(5)段間間接遠(yuǎn)轉(zhuǎn)移 JMP DWORD PTR OPR
執(zhí)行操作: (IP)←(EA) (CS)←(EA+2)
操作數(shù)16位,則還需
386及
后繼機(jī)型 (EIP)←(EA) (CS)←(EA+4)
( EIP)←(EIP) AND 0000FFFFH
其
中有效地址EA值
由OP R尋
址方式確定。它可以使用除立即數(shù)方式以外的任一種尋址方式。根據(jù)尋址方式求出EA后,
把指定存儲(chǔ)單元的字內(nèi)容送到IP或EIP寄存器,并把下一個(gè)字內(nèi)容送到CS寄
存器。
2 條件轉(zhuǎn)移指令
//所有條件轉(zhuǎn)移指令都不影響條件碼
條件轉(zhuǎn)移指令使用了相對(duì)尋址方式,它只可用JMP中
的短轉(zhuǎn)移和近轉(zhuǎn)移兩種格式。(在8086和80286中
只提供短轉(zhuǎn)移格式,目標(biāo)地址應(yīng)在本條轉(zhuǎn)移指令下一條指令地址的
-128~+127個(gè)字節(jié)范圍之內(nèi)。80386以
后除短轉(zhuǎn)移外還提供近轉(zhuǎn)移,這樣就可到達(dá)段內(nèi)任何位置。)但條件轉(zhuǎn)移不提供段間遠(yuǎn)轉(zhuǎn)移格式。滿足測(cè)試條件
時(shí),IP或EIP與8位、16位或32位位移量相加得到轉(zhuǎn)向地址;如不滿足測(cè)試條件,則IP或EIP不變。
1 根據(jù)單個(gè)條
件標(biāo)志的設(shè)置情況轉(zhuǎn)移。
適用于
測(cè)試某一次運(yùn)算的結(jié)果并根據(jù)其不同特征產(chǎn)生分支作不同處理。
(1)JZ(或JE)(jump if zero,or equal) 結(jié)果為零(或相等)則轉(zhuǎn)移
格式:JZ(或JE) OPR 測(cè)試條件:ZF=1
(2)JNZ(或JNE)(jump if not zero,or
not equal) 結(jié)果不為零(或不相等)則轉(zhuǎn)移
格式:JNZ(或JNE) OPR 測(cè)試條件:ZF=0
(3)JS(jump if sign)
結(jié)果為負(fù)則跳轉(zhuǎn)
格式:JS OPR
測(cè)試條件:SF=1
(4)JNS(jump if not sign)
結(jié)果為正則跳轉(zhuǎn)
格式:JNS OPR
測(cè)試條件:SF=0
(5)JO(jump if overflow)
溢出則轉(zhuǎn)移
格式:JO OPR
測(cè)試條件:OF=1
(6)JNO(jump if not overflow)
不溢出則轉(zhuǎn)移
格式:JNO OPR
測(cè)試條件:OF=0
(7)JP(或JPE)
(jump if parity,or parity even) 奇偶位為1則跳轉(zhuǎn)
格式:JP(或JPE) OPR 測(cè)試條件:PF=1
(8)JNP(或JPO)
(jump if not parity,or parity odd) 奇偶位為0則跳轉(zhuǎn)
格式:JNP(或JPO) OPR 測(cè)試條件:PF=0
(9)JB(或JNAE,
或JC)(jump if
below,or not above or equal,or carry)
低于,或者不高于或者等于,或進(jìn)位為1則轉(zhuǎn)移
格式:JB(或JNAE,或JC) OPR 測(cè)試條件:CF=1
(10)JNB(或JAE,
或JNC)(jump if not
below,or above or equal,or not carry)
不低于,或者高于或等于,或進(jìn)位為零則轉(zhuǎn)移
格式:JNB(或JAE,
或JNC) OPR 測(cè)試條件:CF=0
2 比較兩個(gè)無
符號(hào)數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移。
(1) JB(或JNAE,
或JC)(jump if
below,or not above or equal,or carry)
(2) JNB(或JAE,
或JNC)(jump if not
below,or above or equal,or not carry)
以上兩個(gè)
指令同上面第一組(9)(10)完全相
同
(3) JBE(或JNA)
(jump if below or equal,or not above)
低于或等于,或不高于則轉(zhuǎn)移
格式:JBE(或JNA) OPR 測(cè)試條件:CF∨ZF=1
(4)JNBE(或JA)(jump if not below or equal,or above)
不低于或等于,或高于則轉(zhuǎn)移
格式:JNBE(或JA) OPR
測(cè)試條件:CF∧ZF=1
3 比較兩個(gè)帶符號(hào)數(shù),并根據(jù)比較結(jié)果轉(zhuǎn)移
(1) JL(或JNGE)(jump if less,or not greater or
equal)小于,或者不大于或等于則跳轉(zhuǎn)
格式:JL(或JNGE) OPR 測(cè)試條件:SF⊕OF=1
(2)JNL(或JGE)(jump if not less,or greater or
equal)不小于,或者大于或等于則轉(zhuǎn)移
格:JNL(或JGE) OPR 測(cè)試條件:SF⊕OF=0
(3)JLE(或JNG)(jump if less or equal,or not
greater)小于或等于,或者不大于則轉(zhuǎn)移
格式:JLE(或JNG) OPR 測(cè)試條件:(SF⊕OF)∨ZF = 1
(4)JNLE(或JG)(jump if not less or equal,or
greater)不小于或等于,或大于則轉(zhuǎn)移
格式:JNLE(或JG) OPR 測(cè)試條件:(SF⊕OF)∨ZF =0
4 測(cè)試CX或ECX的值為0則轉(zhuǎn)移指
令
(1)JCXZ(jump if CX register is zero) CX寄存器的內(nèi)容為零則轉(zhuǎn)移
格式:JCXZ OPR 測(cè)試條件:(CX)= 0
(2)JECXZ(jump if ECX register is zero) ECX寄存器的寄存器內(nèi)容為零則轉(zhuǎn)移
格式:JECXZ OPR(386J及后繼機(jī)型可用) 測(cè)試條件:(E X)= 0
3 條件設(shè)置指令(本組指令只在386及后繼機(jī)型才提供)
格式:SETcc DST
執(zhí)行操作:DST可使用寄存器或任一種存儲(chǔ)器尋址方式,但只能指定一個(gè)字節(jié)單元。指令根據(jù)所指定的條件碼情況,如滿足條件則把目的字節(jié)置為1;如不滿足條件則把目的字節(jié)置為0。條件設(shè)置可分為3組:
1.根據(jù)單個(gè)
條件標(biāo)志的值把目的字節(jié)置1。
(1)SETZ(或SETE)(set byte if zero,or equal) 結(jié)果為零(或相等)則目的字節(jié)置1
測(cè)試條件: ZF = 1
(2)SETNZ(或SETNE)(set byte if not zero,or not equal)結(jié)果不為零或不相等則目的字節(jié)置1
測(cè)試條件:ZF = 0
(3)SETS(set byte if sign)
結(jié)果為負(fù)則目的字節(jié)置為1
測(cè)試條件:SF = 1
(4)SETNS(Set byte if not sign)
結(jié)果為正則目的字節(jié)置為1
測(cè)試條件:SF = 0
(5)SETO(set byte if overflow)
溢出則目的字節(jié)置1
測(cè)試條件:OF = 1
(6)SETNO(set byte if not overflow)
不溢出則目的字節(jié)置1
測(cè)試條件:OF = 0
(7)SETP(或SETPE)(set byte if parity,or parity even)奇偶位為1則目的字節(jié)置1
測(cè)試條件:PF = 1
(8)SETNP(或SETB,或SETNAE) (set byte if parity,or parity odd) 奇偶位為0則目的字節(jié)置1
測(cè)試條件:PF = 0
(9)SETC(或SETB,或SETNAE) (set byte if carry,or
below,or not above or equal)
進(jìn)位位為1,或低于,或不高于或等于則目的字節(jié)置1
測(cè)試條件:CF = 1
(10)SETNC(或SETNB,或SETAE) (set byte if carry,or
below,or not above or equal)
進(jìn)位位為1,或不低于,或高于或等于則目
的字節(jié)置1
測(cè)試條件:CF = 0
2.比較兩個(gè)
無符號(hào)數(shù),并根據(jù)比較結(jié)果把目的字節(jié)置1。
(1)SETC(或SETB,或SETNAE) (set byte if carry,or
below,or not above or equal)
(2)SETNC(或SETNB,或SETAE) (set byte if carry,or
below,or not above or equal)
以上兩個(gè)
指令同上面第一組(9)(10)完全相
同
(3)SETBE(或SETNA)(set byte if below or equal,or not above)
低于或等于,或不高于則目的字節(jié)置1
測(cè)試條件:CF∨ZF=1
(4)SETNBE(或SETA) (set byte if not below or equal,or above)
不低于或等于,或高于則目的字節(jié)置1
測(cè)試條件:CF∨ZF=0
3.比較兩個(gè)
帶符號(hào)數(shù),并根據(jù)比較結(jié)果把目的字節(jié)置1。
(1)SETL(SETNGE)(set byte if less,or
not greater or equal)
小于,或不大于或等于則目的字節(jié)置1
測(cè)試條件: SF⊕OF = 1
(2)SETNL (SETGE)(set byte if not less,or greater or equal)
不小于,或大于或等于則目的字節(jié)置1
測(cè)試條件: SF⊕OF = 0
(3)SETLE(SETNG)
(set byte if less or equal,or not
greater)
小于或等于,或不大于則目的字節(jié)置1
測(cè)試條件:(SF⊕OF)∨ZF=1
(4)SETNLE(SETG)(set byte if not less or equal,or greater)
不小于或等于,或大于則目的字節(jié)置1
測(cè)試條件:(SF⊕OF)∨ZF=0
5 循環(huán)指令
//循環(huán)指令不影響條件碼
使用相對(duì)尋址方式
(1)LOOP 循環(huán)
格式:LOOP OPR
測(cè)試條件:(count Reg)≠0
(2)LOOPZ/LOOPE
當(dāng)為零或相等時(shí)循環(huán)指令
格式:LOOPZ(或LOOPE) OPR 測(cè)試條件:ZF=1且(count Reg)≠0
(3)LOOPNZ/LOOPNE 當(dāng)不為零或不相等時(shí)循環(huán)指令
格式:LOOPNZ(或LOOPNE) OPR 測(cè)試條件:ZF=0且(count Reg)≠0
其中第二和第三條指令提供了提前結(jié)
束循環(huán)的可能性。
這
三條指令執(zhí)行步驟:①(count Reg)←(count Reg)-1
②
檢查是否滿足測(cè)試條件,如滿足且操作數(shù)長(zhǎng)度為16位,則(IP)←(IP)+D8的符號(hào)擴(kuò)展;如滿足且操作數(shù)長(zhǎng)度為32位,則(EIP)←(EIP)+D8的符號(hào)擴(kuò)展;
上
面OPR必須指定一個(gè)表示轉(zhuǎn)向地址的標(biāo)號(hào)(符
號(hào)地址),而在機(jī)器指令里則用8位位移量D8來表示轉(zhuǎn)向地址與當(dāng)前IP(或EIP)值的差。由于位移量只有8位,所以轉(zhuǎn)向地址必須在該循環(huán)指令的下一條指令地址的-128~+127字節(jié)范圍內(nèi)。
6 子程序
子程序相當(dāng)于高
級(jí)語言中的“過程”,(procedure)。程序中可以由調(diào)用程序(或稱主程序)調(diào)用這些子程序,而
在子程序執(zhí)行完后又返回調(diào)用程序繼續(xù)執(zhí)行。
1.
CALL 調(diào)用指令
//不影響標(biāo)志位
⑴段內(nèi)直接近調(diào)用
執(zhí)行操作:當(dāng)
操作長(zhǎng)度為16位時(shí),Push(IP)
(IP)←(IP)+D16
或(EIP)←( (EIP)+D16 )AND0000FFFFH
操作數(shù)長(zhǎng)度
為32位時(shí),Push(EIP)
(EIP)←(EIP)+D32
指
令中DST給
出轉(zhuǎn)向地址(即子程序的入口地址,亦即子程序的第一條指令的地址),D16即為機(jī)器指令
中
的位移量,它是轉(zhuǎn)向地址和返回地址之間的差值。
⑵段內(nèi)間接近調(diào)用
執(zhí)行操作:當(dāng)
操作長(zhǎng)度為16位時(shí),Push(IP)
(IP)←(EA)
或(EIP)←(EA)AND0000FFFFH
操作數(shù)長(zhǎng)度
為32位時(shí),Push(EIP)
(EIP)←(EA)
指
令中的DST可
使用寄存器尋址方式或任一種存儲(chǔ)器尋址方式,由指定的寄存器或存儲(chǔ)單元的內(nèi)容給出轉(zhuǎn)向地址。當(dāng)操作長(zhǎng)度為16位
時(shí),則有效地址EA應(yīng)
為16位;
操作數(shù)長(zhǎng)度為32位
時(shí),EA應(yīng)
為32位。
以上兩種
方式均為近調(diào)用,轉(zhuǎn)向地址中只包含其偏移地址部分,段地址是保持不變的。
⑶段間直接遠(yuǎn)調(diào)用
執(zhí)行操作:當(dāng)
操作長(zhǎng)度為16位時(shí), Push(CS) Push(IP)
(IP)←DST指定的偏移地
址 (CS)←DST指定的段地址
當(dāng)操作長(zhǎng)度為32位時(shí), Push(CS)
Push(EIP)
(EIP)←DST指定的偏移地
址 (CS)←DST指定的段地址
由
于調(diào)用程序和子程序不在同一段內(nèi),因此返回的地址的保存以及轉(zhuǎn)向地址的設(shè)置都必須把段地址考慮在內(nèi)。
⑷段間間接遠(yuǎn)調(diào)用
執(zhí)行操作:當(dāng)
操作長(zhǎng)度為16位時(shí), Push(CS) Push(IP)
(IP)←(EA) (CS)←(EA+2)
當(dāng)操作長(zhǎng)度為32位時(shí), Push(CS)
Push(EIP)
(EIP)←(EA)
(CS)←(EA+4)
其
中EA是
由DST的
尋址方式確定的有效地址,這里可用任一種存儲(chǔ)器尋址方式來取得EA值。
2.RET 返回指令 //不影
響標(biāo)志位
RET指
令放在子程序的末尾,它使子程序在功能完成后返回調(diào)用程序繼續(xù)執(zhí)行,而返回地址是調(diào)用程序調(diào)用子程序(或稱轉(zhuǎn)子)時(shí)存放在堆棧中的,因此RET指令的操作是返回地址出棧送IP或EIP寄存器(段內(nèi)或段間)和CS寄存器(段間)。
(1)段內(nèi)近返回
格式:RET
執(zhí)行操作:當(dāng)
操作數(shù)長(zhǎng)度為16時(shí),(IP)←POP()
386及后繼機(jī)型:(EIP)←(EIP)AND0000FFFFH
當(dāng)操作數(shù)長(zhǎng)
度為32位時(shí),(EIP)←POP()
(2)段內(nèi)帶立即數(shù)近返回
格式:RET EXP
執(zhí)行操作:在
執(zhí)行完與(1)的RET完全相同的操
作后,還需要修改堆棧指針:
(SP或ESP)←(SP或ESP)+D16
其中EXP是一個(gè)表達(dá)式,根據(jù)它的值計(jì)算出來的常數(shù)成為機(jī)器指令中的位移量D16。這種指令允許返回地址出棧后修改堆棧的指針,這就便于調(diào)用程序在用CALL指令調(diào)用子程序以前把子程序所需要的參數(shù)入棧,以便子程序運(yùn)行時(shí)使用這些參數(shù)。
當(dāng)子程序返回后,這些參數(shù)已不在有用,就可以修改指針使其指向參數(shù)入棧以前的值。
(3)段間遠(yuǎn)返回
格式:RET
執(zhí)行操作:當(dāng)
操作數(shù)長(zhǎng)度為16時(shí),(IP)←POP()
386及后繼機(jī)型:(EIP)←(EIP)AND0000FFFFH
(CS)←POP()
當(dāng)操作數(shù)長(zhǎng)
度為32位時(shí),(EIP)←POP()
(CS)←POP()(32位數(shù)出棧、高16位廢除)
(4)段間
帶立即數(shù)遠(yuǎn)返回 格式:RET EXP
執(zhí)行操作:在
執(zhí)行完與(3)的RET完全相同的操
作后,還需要修改堆棧指針:
(SP或ESP)←(SP或ESP)+D16
這里EXP的含義及使用情況與帶立即數(shù)返回指令相同。
7 中斷
中斷分為內(nèi)部中斷和外部中斷兩類。內(nèi)部中斷包括像除法運(yùn)算中所遇到需要除以0時(shí)
產(chǎn)生的中斷,或者程序中為了做某些
處理而設(shè)置的中斷指令等。外部中斷則主要用來處理I/O設(shè)備與CPU之間的通信。
當(dāng)CPU響應(yīng)一次中斷時(shí),也要和調(diào)用子程序時(shí)類似地把(IP)或(EIP)和(CS)保存入棧。除此之外,為了能全面地保存現(xiàn)場(chǎng)信息,以便在中斷處理結(jié)束時(shí)返回
現(xiàn)場(chǎng),還需要把反映現(xiàn)場(chǎng)狀態(tài)的(FLAGS)或(EFLAGS)保存入棧,然后才能轉(zhuǎn)到中斷例行程序去執(zhí)行。返回同理要恢復(fù)(FLAGS)或(EFLAGS)。
中
斷例行程序入口地址稱為中斷向量。在80X86中,在實(shí)模式下工作時(shí),存儲(chǔ)器的最低地址區(qū)的1024個(gè)字節(jié)(地址從00000H到003FFH)為中斷向量區(qū),其中存放著256種類型中斷例行程序的入口地址
(中斷向量)。由于每個(gè)中斷向量占有4個(gè)字節(jié)單元,所以中斷指令中指定的類型號(hào)N需要乘以4才能取得所指定類型的中斷向量。在保護(hù)模式下,中斷例行程序的入口通過中斷描
述符表找到找到中斷描述符來取得的。由于每個(gè)描述符為8字節(jié)長(zhǎng),所以類型號(hào)應(yīng)乘以8才能取得所指定類型的中斷描述符。
(1)INT (interrupt) 中斷//不影響除IF、TF和AC以外的標(biāo)志位
格式:INT TYPE 或 INT
執(zhí)行操作:PUSH(FLAGS)
IF←0
TF←0
AC←0
PUSH(CS)
PUSH(IP)
(IP)←(TYPE * 4)
(CS)←(TYPE * 4+2)
其中TYPE為類型號(hào),它可以是常數(shù)或表達(dá)式,其
值必須在0~255范圍內(nèi),格式中的INT是一個(gè)字節(jié)的中斷指令,它隱含的類型
號(hào)為3。
(2)INTO(interrupt if overflow) 如溢出則中斷//同上
格式:INTO
執(zhí)行操作:若OF = 1,則:PUSH(FLAGS)
IF←0
TF←0
AC←0
PUSH(CS)
PUSH(IP)
(IP)←(10H)
(CS)←(12H)
(3)IRET(return from interrupt) 從中斷返回//標(biāo)志位由堆棧中取出來的值設(shè)
置
格式:IRET 適用于操作數(shù)長(zhǎng)度為16位的情況
執(zhí)行操作:(IP)←POP() (CS)←POP() (FLAGS)←POP()
(4)IRETD(return from interrupt) 從
中斷返回 //標(biāo)志位由堆棧中取出來的值設(shè)置
格式:IRETD 適用于操作數(shù)長(zhǎng)度為32位的情況
執(zhí)行操作:(IP)←POP() (CS)←POP() (EFLAGS)←POP()
處理機(jī)控制和雜項(xiàng)操作指令
1. 標(biāo)志處
理指令 //只影響本指令指定的標(biāo)志,而不影
響其他標(biāo)志位
·CLC(clear carry)
進(jìn)位位置置零指令 CF←0
·CMC (complement carry) 進(jìn)位位求反指令 CF←CF
·STC (set carry)
進(jìn)位位置1指令 CF←1
·CLD (clear direction) 方向標(biāo)志位置0指令 DF←0
·STD (set direction)
方向標(biāo)志位置1指令 DF←1
·CLI (clear interrupt) 中斷標(biāo)志置0指令 IF←0
·STI (set interrupt)
中斷標(biāo)志置1指令 IF←1
2. 其它處
理機(jī)控制與雜項(xiàng)操作指令 //以下指令不影響條件碼
(1)NOP(no operation) 無操作指令
該
指令不執(zhí)行任何操作,其機(jī)器碼占有一個(gè)字節(jié)單元,在調(diào)試程序時(shí)往往用這條指令占有一定的存儲(chǔ)單元,以便在正式運(yùn)行時(shí)用其他指令取代。
(2)HLT (halt)
停機(jī)
該
指令可使機(jī)器暫停工作,使處理機(jī)處于停機(jī)狀態(tài)以等待一次外部中斷的到來,中斷結(jié)束后繼續(xù)執(zhí)行下面.
(3)WAIT (wait) 等待
該
指令使處理機(jī)處于空轉(zhuǎn)狀態(tài),它也可以用來等待外部中斷發(fā)生,但中斷結(jié)束后仍返回WAIT指
令繼續(xù)等待。
它
也可以與ESC指令配合等待協(xié)處理機(jī)的執(zhí)行結(jié)果。
(4)ESC (escape) 換碼
格式: ESC op,reg/mem
這
條指令在使用協(xié)處理機(jī)時(shí),可以指定由協(xié)處理器執(zhí)行的指令。指令的第一個(gè)操作數(shù)即指定其操作碼,第二個(gè)操作數(shù)即指定其操作數(shù)。自486起,
浮點(diǎn)協(xié)處理器已裝入CPU芯片,系統(tǒng)可以直接支持協(xié)處理器指令,因此ESC指
令已成為未定義指令,如遇到程序中的ESC指令將引起一次異常處理。
(5)LOCK (lock) 封鎖
該
指令是一種前綴,它可以與其它指令聯(lián)合,用來維持總線的鎖存信號(hào)直到與其聯(lián)合的指令執(zhí)行完為止。當(dāng)CPU與
其它協(xié)處理機(jī)協(xié)同工作時(shí),該指令可避免破壞有用信息。
LOCK前
綴可與下列指令聯(lián)用:
BTS,BTR,BTC mem,reg/imm
XCHG reg,mem
XCHG mem,reg
ADD,OR,ADC,SBB,AND,SUB,XOR mem,reg/imm
NOT,NEG,INC,DEC mem
CMPXCHG,XADD
(6)BOUND(bound)
界限
格式:BOUND reg,mem
執(zhí)行操作:BOUND指令檢查給出的數(shù)組下標(biāo)是否在規(guī)定
的上下界之內(nèi)。如在上下界之內(nèi),則執(zhí)行下一條指令;如超出了上下界范圍,則產(chǎn)生中斷5。如發(fā)生中斷,則中斷返回時(shí)返回地址仍指向BOUND指令,而不是其下一條指令。
指令中第一個(gè)操作數(shù)必須用寄存器,用來存放當(dāng)前數(shù)組下標(biāo)。當(dāng)操作數(shù)長(zhǎng)度為16位時(shí),使用16位寄存器;而當(dāng)操作數(shù)長(zhǎng)度為32位時(shí),則使用32位寄存器。第二個(gè)操作數(shù)必須使用存儲(chǔ)
器方式,該操作數(shù)用來存放數(shù)組的上下界。當(dāng)操作數(shù)長(zhǎng)度為16位時(shí),使用相繼的兩個(gè)16位字存放下界和上界,下界存放在低地址所指定的字單元中,上界存放在高地址所指
定的字單元中。當(dāng)操作數(shù)為32位時(shí),使用相繼的兩個(gè)雙字來存放下界和上界。
(7)ENTER 建立堆棧幀指令
ENTER指令用于過程調(diào)用時(shí)為便于過程間傳
遞參數(shù)而建立堆棧幀所用。
格式:ENTER imm16,imm8
執(zhí)行操作:指令中給出地兩個(gè)操作數(shù)均
為立即數(shù)。第一個(gè)操作數(shù)為16位立即數(shù),由其指定堆棧幀的大小,即其所占據(jù)的字節(jié)數(shù)。第二個(gè)操作數(shù)為8位立即數(shù),它給出過程的嵌套層數(shù),此數(shù)范圍應(yīng)為0~31。
該指令完成
以下操作:
①PUSH(BP)或PUSH(EBP),以保存該寄存器的原始內(nèi)容。
②(BP)←(SP)或(EBP)←(ESP),使BP或EBP寄存器保存當(dāng)前堆棧指針SP或ESP的內(nèi)容,以便在過程運(yùn)行期間,以BP(或EBP)為基準(zhǔn)訪問堆棧幀中存放的變量。
③(BP)←(SP)-imm16 或 (EBP)←(ESP)-imm16,這樣就建立了堆棧幀所占有的存儲(chǔ)空
間。
(8)LEAVE 釋放堆棧幀指令
LEAVE指令在程序中位于退出過程的RET指令之前,用來釋放由ENTER指令建立的堆棧幀存儲(chǔ)區(qū)。
格式:LEAVE
執(zhí)行操作:
①(SP)←(BP)或(ESP)←(ESP)
②(BP)←POP()或(EBP)←POP()
from:
http://blog.csdn.net/boyplayee/archive/2008/11/10/3266066.aspx
posted on 2010-04-05 17:26
chatler 閱讀(1731)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Assembly