MOV 指令為雙操作數指令,兩個操作數中必須有一個是寄存器.
MOV DST , SRC // Byte / Word
執行操作: dst = src
1.目的數可以是通用寄存器, 存儲單元和段寄存器(但不允許用CS段寄存器).
2.立即數不能直接送段寄存器
3.不允許在兩個存儲單元直接傳送數據
4.不允許在兩個段寄存器間直接傳送信息
PUSH 入棧指令及POP出棧指令: 堆棧操作是以“後進先出”的方式進行數據操作.
PUSH SRC //Word
入棧的操作數除不允許用立即數外,可以為通用寄存器,段寄存器(全部)和存儲器.
入棧時高位字節先入棧,低位字節後入棧.
POP DST //Word
出棧操作數除不允許用立即數和CS段寄存器外, 可以為通用寄存器,段寄存器和存儲器.
執行POP SS指令後,堆棧區在存儲區的位置要改變.
執行POP SP 指令後,棧頂的位置要改變.
XCHG(eXCHanG)交換指令: 将兩操作數值交換.
XCHG OPR1, OPR2 //Byte/Word
執行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp
1.必須有一個操作數是在寄存器中
2.不能與段寄存器交換數據
3.存儲器與存儲器之間不能交換數據.
XLAT(TRANSLATE)換碼指令: 把一種代碼轉換為另一種代碼.
XLAT (OPR 可選) //Byte
執行操作: AL=(BX AL)
指令執行時隻使用預先已存入BX中的表格首地址,執行後,AL中内容則是所要轉換的代碼.
LEA(Load Effective Address) 有效地址傳送寄存器指令
LEA REG , SRC //指令把源操作數SRC的有效地址送到指定的寄存器中.
執行操作: REG = EAsrc
注: SRC隻能是各種尋址方式的存儲器操作數,REG隻能是16位寄存器
MOV BX , OFFSET OPER_ONE 等價于 LEA BX , OPER_ONE
MOV SP , [BX] //将BX間接尋址的相繼的二個存儲單元的内容送入SP中
LEA SP , [BX] //将BX的内容作為存儲器有效地址送入SP中
LDS(Load DS with pointer)指針送寄存器和DS指令
LDS REG , SRC //常指定SI寄存器。
執行操作: REG=(SRC), DS=(SRC 2) //将SRC指出的前二個存儲單元的内容送入指令中指定的寄存器中,後二個存儲單元送入DS段寄存器中。
LES (Load ES with pointer) 指針送寄存器和ES指令
LES REG , SRC //常指定DI寄存器
執行操作: REG=(SRC) , ES=(SRC 2) //與LDS大緻相同,不同之處是将ES代替DS而已.
LAHF ( Load AH with Flags ) 标志位送AH指令
LAHF //将PSW寄存器中的低8位的狀态标志(條件碼)送入AH的相應位, SF送D7位, ZF送D6位......
執行操作: AH=PSW的低位字節。
SAHF ( Store AH into Flags ) AH送标志寄存器指令
SAHF //将AH寄存器的相應位送到PSW寄存器的低8位的相應位, AH的D7位送SF, D6位送ZF......
執行操作: PSW的低位字節=AH。
PUSHF ( PUSH the Flags) 标志進棧指令
PUSHF //将标志寄存器的值壓入堆棧頂部, 同時棧指針SP值減2
執行操作: SP=SP-1,(SP)=PSW的高8位, SP=SP-1, (SP)=PSW的低8位
POPF ( POP the Flags ) 标志出棧指令
POPF //與PUSHF相反, 從堆棧的頂部彈出兩個字節送到PSW寄存器中, 同時堆棧指針值加2
執行操作: PSW低8位=(SP), SP=SP 1, PSW高8位=(SP) , SP=SP 1
輸入輸出指令(IN,OUT):隻限于使用累加器AX或AL與外部設備的端口傳送信息.
IN (INput)輸入指令:信息從I/O通過累加器傳送到CPU
IN AL , PORT //直接的字節輸入,PORT是外設端口編号(即端口地址),隻能取 00H ~ 0FFH共256個端口地址.
IN AX , PORT //直接的字輸入,AX存儲連續兩個端口地址PORT 1,PORT
IN AL , DX //間接的字節輸入,端口地址範圍可通過DX設置為0000H ~ 0FFFFH共65536個端口地址
IN AX , DX //間接的字輸入
OUT( OUTput)輸出指令 :信息從CPU通過累加器傳送到I/O
OUT PORT , AL //直接的字節輸出,PORT規定與IN指令相同.
OUT PORT , AX
OUT DX , AL //間接的字節輸出
OUT DX , AX
MOV AL,05H OUT 27H, AL //将字節05H傳送到地址27H的端口
ADD(ADD)加法指令
ADD DST , SRC //Byte/Word
執行操作: dst=dst src
1.兩個存儲器操作數不能通過ADD指令直接相加, 即DST 和SRC必須有一個是通用寄存器操作數.
2.段寄存器不能作為SRC 和DST.
3.影響标志位Auxiliary Crray Flag ,Carry Flag, Overflow Flag, Parity Flag, Sign Flag 和Zero Flag ,如下所示:
CF 根據最高有效位是否有進(借)位設置的:有進(借)位時CF=1, 無進(借)位時CF=0.
OF 根據操作數的符号及其變化來設置的:若兩個操作數的符号相同,而結果的符号與之相反時OF=1, 否則為0.
ZF 根據結果來設置:不等于0時ZF=0, 等于0時ZF=1
SF 根據結果的最高位來設置:最高位為0, 則SF=0.
AF 根據相加時D3是否向D4進(借)位來設置:有進(借)位時AF=1, 無進(借)位時AF=0
PF 根據結果的1的個數時否為奇數來設置:1的個數為奇數時PF=0, 為偶數時PF=1
ADC( ADd with Carry)帶進位加法指令
ADC DST , SRC //Byte/Word
執行操作: dst=dst src CF //與ADD不同之處是還要加上進位标志位的值.
INC ( INCrement) 加1指令
INC OPR //Byte/Word
執行操作: OPR=OPR 1
1.OPR可以是寄存器和存儲器操作數, 但不能是立即數和段寄存器
2.影響标志位OF,SF,ZF,PF 和AF,不影響CF.
SUB ( SUBtract ) 不帶借位的減法指令
SUB DST , SRC //Byte/Word
執行操作:dst=dst - src
1.DST和SRC尋址方式及規定與ADD相同.
2.影響全部标志位.(判斷标志位參見ADD)
SBB ( SuBtract with Borrow) 帶借位減法指令
SBB DST , SRC //Byte/Word
執行操作:dst= dst - src - CF
DEC ( DECrement ) 減1指令
DEC OPR //Byte/Word
執行操作:OPR = OPR - 1 //除CF标志位, 其餘标志位都受影響.
NEG ( NEGate ) 求補指令
NEG OPR
執行操作:opr = 0- opr //将操作數按位求反後末位加1.
CMP ( CoMPare ) 比較指令
CMP OPR1 , OPR2
執行操作:OPR1 - OPR2 //與SUB指令一樣執行運算, 但不保存結果.
比較情況 無符号數 有符号數
A=B ZF=1 ZF=1
A>B CF=0 && ZF=0 SF^OF=0 && ZF=0
A<B CF=1 && ZF=0 SF^OF=1 && ZF=0
A>=B CF=0 || ZF=1 SF^OF=0 || ZF=1
A<=B CF=1 || ZF=1 SF^OF=1 || ZF=1
MUL ( unsigned MULtiple ) 無符号數乘法指令
MUL SRC //Byte/Word .
執行操作:Byte => AX= AL *src //字節運算時目的操作數用AL, 乘積放在AX中
Word => DX=AX *src //字運算時目的操作數用AX, DX存放乘積的高位字, AX放乘積的低位字
1.目的數必須是累加器 AX 或AL,指令中不需寫出
2. 源操作數SRC可以是通用寄存器和各種尋址方式的存儲器操作數, 而絕對不允許是立即數或段寄存器.
IMUL (sIgned MULtiple) 有符号數乘法指令
IMUL SRC //與MUL指令相同,但必須是帶符号數
DIV ( unsigned DIVide) 無符号數除法指令
DIV SRC //Byte/Word 其中: SRC的規定同乘法指令MUL
執行操作:Byte => AX / src //字節運算時目的操作數在AX中,結果的商在AL中 ,餘數在AH中
Word=> DX,AX /src //字運算時目的操作數在DX高位字和AX低位字中,結果的商在AX中 ,餘數在DX中
存儲器操作數必須指明數據類型:BYTE PTR src 或 WORD PTR src
IDIV (sIgned DIVied) 有符号數除法指令
IDIV SRC //Byte/Word 與DIV指令相同,但必須是帶符号數
CBW (Convert Byte to Word) 字節轉換為字指令
CBW
執行操作: AL中的符号位(D7)擴展到8位AH中,若AL中的D7=0,則AH=00H,若AL中的D7=1,則AH=FFH.
CWD (Convert Word to Double word) 字轉換為雙字指令
CWD
執行操作: AX中的符号位(D15)擴展到16位DX中,若AX中的D15=0,則DX=0000H,若AX中的D15=1,則DX=FFFFH
十進制調整指令
當計算機進行計算時,必須先把十進制數轉換為二進制數,再進行二進制數運算,最後将結果又轉換為十進制數輸出.
在計算機中,可用4位二進制數表示一位十進制數,這種代碼稱為BCD ( Binary Coded Decimal ).
BCD碼又稱8421碼,在PC機中,BCD碼可用壓縮的BCD碼和非壓縮的BCD碼兩種格式表示.
壓縮的BCD碼用4位二進制數表示一個十制數,整個十進數形式為一個順序的以4位為一組的數串.
非壓縮的BCD碼以8位為一組表示一個十進制數,8位中的低4位表示8421的BCD碼,而高4位則沒有意義.
壓縮的BCD碼調整指令
DAA (Decimal Adjust for Addition) 加法的十進制調整指令
DAA
執行操作:執行之前必須先執行ADD或ADC指令,加法指令必須把兩個壓縮的BCD碼相加,并把結果存話在AL寄存器中.
DAS (Decimal Adjust for Subtraction) 減法的十進制調整指令
DAS
執行操作:執行之前必須先執行SUB或SBB指令,減法指令必須把兩個壓縮的BCD碼相減,并氫結果存放在AL寄存器中.
非壓縮的BCD碼調整指令
AAA (ASCII Adjust for Addition) 加法的ASCII調整指令
AAA
執行操作:執行之前必須先執行ADD或ADC指令,加法指令必須把兩個非壓縮的BCD碼相加,并把結果存話在AL寄存器中.
AAS (ASCII Adjust for Subtraction) 減法的ASCII調整指令
AAS
執行操作:執行之前必須先執行SUB或SBB指令,減法指令必須把兩個非壓縮的BCD碼相減,并氫結果存放在AL寄存器中.
MOVS ( MOVe String) 串傳送指令
MOVB //字節串傳送 DF=0, SI = SI 1 , DI = DI 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1
MOVW //字串傳送 DF=0, SI = SI 2 , DI = DI 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2
執行操作:[DI] = [SI] ,将位于DS段的由SI所指出的存儲單元的字節或字傳送到位于ES段的由DI 所指出的存儲單元,再修改SI和DI, 從而指向下一個元素.
在執行該指令之前,必須預置SI和DI的初值,用STD或CLD設置DF值.
MOVS DST , SRC //同上,不常用,DST和SRC隻是用來用類型檢查,并不允許使用其它尋址方式來确定操作數.
1.目的串必須在附加段中,即必須是ES:[DI]
2.源串允許使用段跨越前綴來修飾,但偏移地址必須是[SI].
STOS (STOre into String) 存入串指令
STOS DST
STOSB //存放字節串 ( DI ) = AL
STOSW //存放字串 ( DI ) = AX
執行品作:把AL或AX中的内容存放由DI指定的附加段的字節或字單元中,并根據DF值修改及數據類型修改DI的内容.
1.在執行該指令之前,必須把要存入的數據預先存入AX或AL中,必須預置DI的初值.
2.DI所指向的存儲單元隻能在附加段中,即必須是ES:[DI]
LODS ( LOaD from String ) 從串取指令
LODS SRC
LODSB //從字節串取 AL=(SI)
LODSW //從字串取 AX= (SI±1) (SI)
執行操作:把由SI指定的數據段中字節或字單元的内容送入AL或AX中,并根據DF值及數據類型修改SI的内容.
1.在執行該指令之前,要取的數據必須在存儲器中預先定義(用DB或DW),必須預置SI的初值.
2.源串允許使用段超越前綴來改變數據存儲的段區.
REP (REPeat)重複操作前綴
REP String Primitive //其中:String Primitive可為MOVS,STOS或LODS指令
執行操作:使REP前綴後的串指令重複執行,每執行一次CX=CX-1,直至CX=0時退出REP.
方向标志設置
CLD (CLear Direction flag) 清除方向标志指令
CLD
執行操作:令DF=0, 其後[SI],[DI]執行增量操作
STD (SeT Direction flag) 設置方向标志指令
STD
執行操作:令DF=1, 其後[SI],[DI]執行減量操作
CMPS (CoMPare String) 串比較指令
CMPS SRC , DST
CMPSB //字節串比較 (SI)-(DI)
CMPSW //字串比較 (SI 1)(SI) - (DI 1)(DI)
執行操作:把由SI指向的數據段中的一個字節或字與由DI指向的附加段中的一個字節或字相減,不保留結果,隻根據結果置标志位.
SCAS (SCAn String ) 串掃描指令
SCAS DST
SCASB
SCASW
執行操作:把AX或AL的内容與由DI指向的在附加段中的一個字節或字相減,不保留結果,根據結果置标志位.
AND, OR , XOR 和 TEST都是雙字節操作指令,操作數的尋址方式的規定與算術運算指令相同.
NOT是單字節操作指令,不允許使用立即數.
邏輯運算均是按位進行操作,真值表如下:
AND (位與&) OR ( 位或| ) XOR ( 位異或^ )
1 & 1 = 1 1 | 1 = 1 1 ^ 1 = 0
1 & 0 = 0 1 | 0 = 1 1 ^ 0 = 1
0 & 1 = 0 0 | 1 = 1 0 ^ 1 = 1
0 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0
A:邏輯運算指令
AND (and) 邏輯與指令
AND DST , SRC //Byte/Word
執行操作:dst = dst & src
1.AND指令執行後,将使CF=0,OF=0,AF位無定義,指令執行結果影響SF,ZF和PF标志位.
2.AND指令典型用法A:用于屏蔽某些位,即使某些位為0.
屏蔽AL的高4位:即将高4位和0000B相與,低4位和1111B相與
MOV AL , 39H //AL= 0011 1001B[39H]
ADD AL , 0FH // AL= 0000 1001B[09H] 即0011 1001B[39H] & 0000 1111B[0FH] = 0000 1001B[09H]
3.AND指令典型用法B:取出某一位的值(見TEST)
OR (or) 邏輯或指令
OR DST , SRC //Byte/Word
執行操作:dst = dst | src
1.OR指令執行後,将使CF=0, OF=0, AF位無定義,指令執行結果影響SF, ZF和PF标志位.
2.常用于将某些位置1.
将AL的第5位置1:
MOV AL , 4AH // AL=0100 1010B[4AH]
OR AL , 10H // AL=0101 1010B[5AH] 即0100 1010B[4AH] | 0001 0000B[10H] =0101 1010B [5AH]
XOR (eXclusive OR) 邏輯異或指令
XOR DST , SRC //Byte/Word
執行操作:dst = dst ^ src
1.XOR指令常用于使某個操作數清零,同時使CF=0,清除進位标志.
2.XOR指令使某些位維持不變則與 '0' 相異或,若要使某些位取反則與 '1'相異或.
将AL的高4位維持不變,低4位取反:
MOV AL, B8H //AL=1011 1000B[B8H]
XOR AL, 0FH //AL=1011 0111B[B7H] 即1011 1000B[B8H] ^ 0000 1111[0FH]=1011 0111B[B7H]
測試某一個操作數是否與另一确定操作數相等:
XOR AX , 042EH
JZ .... //如果AX==042EH, 則ZF=TRUE(1), 執行JZ...
NOT (not) 邏輯非指令
NOT OPR //Byte/Word
執行操作:opr = ~opr // ~ 01100101 [65H] =10011010 [9AH]
1.操作數不能使用立即數或段寄存器操作數,可使用通用寄存器和各種方式尋址的存儲器操作數.
2.NOT指令不影響任何标志位。
将AL各位取反:
MOV AL,65H //AL=0110 0101B[65H]
NOT AL //AL=1001 1010B[9AH] 即 ~ 0110 0101B[65H]=1001 1010B[9AH]
TEST (test) 指令
TEST OPR1 , OPR2 //Byte/Word
執行操作:opr1 & opr2
1.兩個操作數相與的結果不保存,結果影響标志位PF,SF和ZF,使CF=0, OF=0,而AF位無定義.
2.TEST指令常用于在不改變原有的操作數的情況下,檢測某一位或某幾位的條件是否滿足.隻要令用來測試的操作數對應檢測位為1,其餘位為0,相與後判斷零标志ZF值的真假.
檢測某位是否為1:
令用來測試的操作數對應檢測位為1,其餘位為0,TEST指令後,若該位為1則 JNZ...
TEST AL , 0000 00001B //測試AL最低位是否為1:: 令用來測試的操作數對應檢測位為1,其餘位為0,執行TEST指令
JNZ THER //最低位若為1, 則ZF=FALSE(0), 執行JNZ THER, 否則執行下一條指令.
或者:先對操作數求反,令用來測試的操作數對應檢測位為1,其餘位為0,TEST指令後,若該位為1則JZ...
MOV DL , AL //将AL 傳送到DL,主要是不要影響AL的值. 以下測試AL的b2位是否為1
NOT DL //先對操作數求反
TEST 0000 0100B //令用來測試的操作數對應檢測位為1,其餘位為0,執行TEST指令
JZ THER //若AL的b2位為1,則ZF=TRUE(1), 執行JZ THER
B:移位指令[所有的移位指令都影響标志位CF、OF、PF、SF和ZF、AF無定義.]
非循環邏輯移位:把操作數看成無符數來進行移位.
SHL ( SHift logical Left )邏輯左移指令
SHL OPR , CNT //Byte/Word
執行操作:使OPR左移CNT位,并使最低CNT位為全0.
1.OPR操作數不能使用立即數或段寄存器操作數,可使用通用寄存器和各種方式尋址的存儲器操作數.
2.移位次數由CNT決定.每次将OPR的最高位移出并移到CF,最低位補0.
MOV CL , 7 //若移位多次, 先預置移位次數CL
SHL DX , CL //CNT可取1或CL寄存器操作數
SHR (SHift logical Right) 邏輯右移指令
SHR OPR , CNT //Byte/Word
同SHL,每次将OPR的最低位D0移出并移到CF.最高位補0.
非循環算術移位:将操作數看成有符号數來進行移位.
SAL (Shift Arithmetic Left) 算術左移指令
SAL OPR , CNT //Byte/Word
SAL指令與SHL指令完全相同
SAR(Shift Arithmetic Right) 算術右移指令
SAR OPR , CNT //Byte/Word
SAR指令每次移位時,将最高位移入次高位的同時最高位值不變,最低位D0移出并移到CF.
循環移位指令
ROL ( ROtate Left) 循環左移指令
ROL OPR , CNT //Byte/Word
每次移位時,最高位移出并同時移到CF和最低位D0.
ROR (ROtate Right)循環右移指令
ROR OPR,CNT //Byte/Word
每次移位時,最低位D0移出并同時移到CF和最高位.
帶進位循環移位指令
RCL (Rotate Left through Carry)帶進位循環左移指令
RCL OPR,CNT //Byte/Word
RCR (Rotate Right through Carry)帶進位循環右移指令
RCR OPR ,CNT //Byte/Word
處理器控制指令
CLC (CLear Carry) 進位位置0指令
CLC //執行操作後,CF=0
CMC (CoMplement Carry) 進位位求反指令
CMC //執行操作後,CF=!CF
STC (SeT Carry) 進位位置1指令
STC //執行操作後,CF=1
NOP (No Operetion) 無操作指令
NOP //此指令不執行任何操作,其機器碼占一個字節單元
HLT (HaLT) 停機指令
HLT
執行操作後,使機器暫停工作,使處理器CPU處于停機狀态,以等待一次外部中斷到來,中斷結束後,程序繼續執行,CPU繼續工作.
JMP ( JuMP ) 無條件轉移指令
名稱 格式 執行操作
段内直接短跳轉 JMP SHORT OPR IP=IP 8 位偏移量
段内直接近轉移 JMP NEAR PTR OPR IP=IP 16位偏移量
段内間接轉移 JMP WORD PTR OPR IP=(EA)
段間直接轉移 JMP FAR PTR OPR IP=OPR 偏移地址, CS=OPR 段地址
段間間接轉移 JMP DWORD PTR OPR IP=(EA),CS=(EA 2)
1.無條件轉移到指定的地址去執行從該地址開始的指令.
2.段内轉移是指在同一代碼段的範圍内進行轉移,隻需改變IP寄存器内容.
3.段間轉移則要轉移到另一個代碼段執行程序,此時要改變IP寄存器和CS段寄存器的内容.
條件轉移指令:根據上一條指令所設置的條件碼(标志位)來判斷測試條件.
根據五個标志位:ZF、SF、OF、 PF、 CF的兩種狀态(0 FALSE或1 TRUE)産生10種測試條件.
Name Flag Flag == TRUE [1] Flag ==FALSE [ 0]
Zero Falg ZF JE/JZ OPR //結果為零轉移JNE/JNZ OPR //結果不為零轉移
Sign Falg SF JS OPR //結果為負轉移JNS OPR //結果為正轉移
Overflow Flag OF JO OPR //溢出轉移JNO OPR //不溢出轉移
Parity Flag PF JP/JPE OPR //結果為偶轉移 JNP/JPO OPR //結果為奇轉移
Carry Flag CF JC OPR //有進位轉移 JNC OPR //無進位轉移
兩個數比較:
情況 指令 滿足條件 指令 滿足條件
A < B JC CF==1 JL SF^OF==1 && ZF==0
A ≥ B JNC CF==0 JNL SF^OF==0 || ZF==1
A ≤ B JNA CF==1 || ZF==1 JLG SF^OF==1 || ZF==1
A > B JA CF==0 && ZF==0 JG SF^OF==0 && ZF==0
測試CX轉移指令
JCXZ OPR //CX==0時轉移
LOOP(LOOP)循環指令
LOOP OPR 測試條件:CX ≠ 0 //OPR在程序中實際是個标号
LOOPZ OPR 測試條件:ZF == 1 && CX ≠ 0
LOOPNZ OPR 測試條件:ZF == 0 && CX ≠ 0
執行操作: 先執行CX=CX-1,再檢測上面的測試條件,如滿足則IP=IP 符号擴展的D8,不滿足則退出循環.
過程調用及返回指令
CALL (CALL) 過程調用指令
CALL DST //DST在程序中實際是子程序标号
執行操作:先将過程的返回地址(即CALL的下一條指令的首地址)存入堆棧,然後轉移到過程入口地址執行子程序.
調用方式 格式 斷點保護入棧情況 過程入口地址
段内直接 CALL NEAR PTR PR1 (SP-1)(SP-2)←IP , CS不進棧 CS值保持不變,IP←DST
段内間接 CALL WORD PTR (EA) (SP-1)(SP-2)←IP , CS不進棧 CS值保持不變,IP←(EA)
段間直接 CALL FAR PTR PR1 (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP IP←DST偏移地址,CS←DST段地址
段間間接 CALL DWORD PTR (EA) (SP-1)(SP-2)←CS , (SP-3)(SP-4)←IP IP←(EA),CS←(EA 2)
注:為了表明是段内調用,可使用NEAR PTR屬性操作符作說明.
RET(RETurn)子程序返回指令
RET
RET EXP //帶立即數返回
子程序返回指令RET放在子程序末尾,它使子程序在執行完全部任務後返回主程序繼續執行被打斷後的程序.返回地址在子程序調用時入棧保存的斷點地址-IP或IP和CS.
,