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