編譯環境
彙編的調試環境總的來說比較少,也很少有非常好的
編譯器。reallychenchi設計的
輕鬆彙編是一款非常適合初學者的彙編編譯器。輕鬆彙編是一個彙編語言
集成開發環境,主要面向彙編語言初學者,也可以用它進行開發。除了普通的編輯功能以外,它還可以自動整理格式、高亮顯示和編譯、連結、調試
彙編程式,非常方便實用。
輕鬆彙編的最大特點是可以格式整理,就像VC6.0一樣,可以設定斷點調試,省卻了使用者的不少工作。它可以在Win98/2k/XP下運行,是一款很優秀的軟體。
常用命令
數據傳送指令
一 通用數據傳送指令
指令 | 英文全拼 | 翻譯 |
MOV | Move | 傳送 |
PUSH | Push onto the stack | 進棧 |
POP | Pop from the stack | 出棧 |
XCHG | Exchange | 交換 |
MOV指令為雙運算元指令,兩個運算元中不能全為記憶體運算元
格式:MOV DST,SRC
執行操作:dst = src
註:1.目的數可以是通用暫存器,
存儲單元和段暫存器(但不允許用CS段暫存器).
2.立即數不能直接送段暫存器
3.不允許在兩個存儲單元直接傳送數據
4.不允許在兩個段暫存器間直接傳送信息
PUSH入棧指令及POP出棧指令:
格式:PUSH SRC //Word
執行操作:(SP)<-(SP-2)
((SP+1),(SP))<-(SRC)
註:1.入棧的運算元除不允許用立即數外,可以為通用暫存器,段暫存器(全部)和存儲器。
2.入棧時高位位元組先入棧,低位位元組後入棧。
格式:POP DST //Word
執行操作:(DST)<-((SP+1),(SP))
(SP)<-(SP+2)
註:1.出棧運算元除不允許用立即數和CS段暫存器外,可以為通用暫存器,段暫存器和存儲器。
2.執行POP SS指令後,堆疊區在存儲區的位置要改變。
3.執行POP SP 指令後,棧頂的位置要改變。
XCHG(eXCHanG)交換指令:
將兩運算元值交換。
格式:XCHG OPR1,OPR2 //Byte/Word
執行的操作:(OPR1)<-->(OPR2)
註:1.必須有一個運算元是在暫存器中
2.不能與段暫存器交換數據
存儲器與存儲器之間不能交換數據。
二 累加器專用傳送指令
指令 | 英文全拼 | 翻譯 |
IN | Input | 輸入 |
OUT | Output | 輸出 |
XLAT | Translate | 換碼 |
IN輸入指令
長格式為:IN AL,PORT(位元組)
IN AX,PORT(字)
執行的操作:(AL)<-(PORT)(位元組)
(AX)<-(wPORT+1,PORT)(字)
短格式為:IN AL,DX(位元組)
IN AX,DX(字)
OUT輸出指令
長格式為:OUT PORT,AL(位元組)
OUT PORT,AX(字)
執行的操作:(PORT)<-(AL)(位元組)
(PORT+1,PORT)<-(AX)(字)
短格式為:OUT DX,AL(位元組)
OUT DX,AX(字)
執行的操作:(DX)<-(AL)(位元組)
((DX+1),(DX))<-AX(字)
XLAT(TRANSLATE)換碼指令:
把一種代碼轉換為另一種代碼。
格式:XLAT (OPR 可選) //Byte
執行操作:(AL)<-((BX)+(AL))
註:指令執行時只使用預先已存入BX中的表格首地址,執行後,AL中內容則是所要轉換的代碼。
三 有效地址送暫存器指令
指令 | 英文全拼 | 翻譯 |
LEA | Load effective address | 有效地址送暫存器 |
LDS | Load DS with Pointer | 指針送暫存器和DS |
LES | Load ES with Pointer | 指針送暫存器和ES |
LEA(Load Effective Address) :
有效地址傳送暫存器指令
格式:LEA REG,SRC //指令把源運算元SRC的有效地址送到指定的暫存器中。
執行操作:(REG)<-SRC
註:1. SRC只能是各種定址方式的存儲器運算元,REG只能是16位暫存器
2.MOV BX,OFFSET OPER_ONE 等價於LEA BX,OPER_ONE
3.MOV SP,[BX] //將BX間接定址的相繼的二個存儲單元的內容送入SP中
4.LEA SP,[BX] //將BX的內容作為存儲器有效地址送入SP中
LDS(Load DS with pointer):
格式:LDS REG,SRC //常指定SI暫存器。
執行的操作:(REG)<-(SRC)
(DS)<-(SRC+2)
註:把源運算元指定的4個相繼位元組送到由指令指定的暫存器及DS暫存器中。該指令常指定SI暫存器。
LES(Load ES with pointer) 指針送暫存器和ES指令
格式:LES REG,SRC //常指定DI暫存器
執行的操作:(REG)<-(SRC)
(ES)<-(SRC+2) //與LDS大致相同,不同之處是將ES代替DS而已。
註:把源運算元指定的4個相繼位元組送到由指令指定的暫存器及ES暫存器中。該指令常指定DI暫存器。
四 標誌暫存器傳送指令
指令 | 英文全拼 | 翻譯 |
LAHF | Load AH with flags | 標誌送AH |
SAHF | store AH into flags | AH送標誌暫存器 |
PUSHF | push the flags | 標誌進棧 |
POPF | pop the flags | 標誌出棧 |
LAHF( Load AH with Flags )
標誌位送AH指令
格式:LAHF ......
執行操作:(AH)<-(PWS的低位元組)
註:將PSW暫存器中的低8位的狀態標誌(條件碼)送入AH的相應位,SF送D7位,ZF送D6位
SAHF( Store AH into Flags )
AH送標誌暫存器指令
格式:SAHF
執行操作: (PWS的低位元組)<-(AH)
註:將AH暫存器的相應位送到PSW暫存器的低8位的相應位,AH的D7位送SF,D6位送ZF。
PUSHF( PUSH the Flags)
標誌進棧指令
格式:PUSHF
執行操作:(SP)<-(SP-2)
SP=(SP-1),(SP)=PSW的高8位,SP=SP-1,(SP)=PSW的低8位
註:將標誌暫存器的值壓入堆疊頂部,同時棧指針SP值減2
POPF( POP the Flags )
標誌出棧指令
格式:POPF
執行操作:(PWS)<-((SP+1),(SP))
(SP)<-(SP+2)
PSW低8位=(SP),SP=(SP+1),PSW高8位=(SP),SP=(SP+1)
註:與PUSHF相反,從堆疊的頂部彈出兩個位元組送到PSW暫存器中,同時堆疊指針值加2
算術指令
一加法指令
指令 | 英文全拼 | 翻譯 |
ADD | add | 加法 |
ADC | add with carry | 帶進位加法 |
INC | increment | 加1 |
ADD(ADD)加法指令
格式:ADD DST,SRC //Byte/Word
執行操作: (DST)<-(SRC)+(DST)
註: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)<-(SRC)+(DST)+CF
註:與ADD不同之處是還要加上進位標誌位的值。
INC( INCrement) 加1指令
格式:INC OPR //Byte/Word
執行操作: (OPR)<-(OPR+1)
註:1.OPR可以是暫存器和存儲器運算元,但不能是立即數和段暫存器
2.影響標誌位OF,SF,ZF,PF 和AF,不影響CF.
二 減法指令
指令 | 英文全拼 | 翻譯 |
SUB | subtract | 減法 |
SBB | subtract with borrow | 帶借位減法 |
DEC | Decrement | 減1 |
NEG | Negate | 求補 |
CMP | Compare | 比較 |
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)<- -(OPR) //將運算元按位求反後末位加1.
CMP( CoMPare ) 比較指令
格式:CMP OPR1,OPR2
執行操作:(OPR1)-(OPR2) //與SUB指令一樣執行運算,但不保存結果。
註:該指令與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 | 無符號數乘法 |
IMUL | Signed Multiple | 帶符號數乘法 |
MUL( unsigned MULtiple ) 無符號數乘法指令
格式:MUL SRC //Byte/Word .
執行操作:字操作:(AX)<-(AL)*(SRC) //位元組運算時目的運算元用AL,乘積放在AX中
位元組操作: (DX,AX)<-(AX)*(SRC) //字運算時目的運算元用AX,DX存放乘積的高位字,AX放乘積的低位字
註:1.目的數必須是累加器AX 或AL,指令中不需寫出
源運算元SRC可以是通用暫存器和各種定址方式的存儲器運算元,而絕對不允許是立即數或段暫存器。
IMUL(sIgned MULtiple) 有符號數乘法指令
格式:IMUL SRC //與MUL指令相同,但必須是帶符號數
四 除法指令
指令 | 英文全拼 | 翻譯 |
DIV | Unsigned divide | 無符號數除法 |
IDIV | Signed divide | 帶符號數除法 |
CBW | Convert byte to word | 位元組轉換為字 |
CWD | Contert word to double word | 字轉換為雙字 |
DIV( unsigned DIVide) 無符號數除法指令
格式:DIV SRC //Byte/Word 其中:SRC的規定同乘法指令MUL
執行操作:位元組操作:(AL)<-(AX)/(SRC)的商
(AH)<-(AX)/(SRC)的餘數
字操作:(AX)<-(DX,AX)/(SRC)的商
(DX)<-(DX,AX)/(SRC)的餘數
註:存儲器運算元必須指明數據類型:BYTE PTR src 或WORD PTR src
IDIV(sIgned DIVied) 有符號數除法指令
格式:IDIV SRC
執行的操作:與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
注:這兩條指令都不影響條件碼。
邏輯指令
一邏輯運算指令
指令 | 英文全拼 | 翻譯 |
AND | and | 邏輯與 |
OR | or | 邏輯或 |
NOT | not | 邏輯非 |
XOR | exclusive or | 異或 |
TEST | test | 測試 |
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 |
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]
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則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 | 邏輯左移 |
SAL | shift arithmetic left | 算術左移 |
SHR | shift logical right | 邏輯右移 |
SAR | shift arithmetic right | 算術右移 |
ROL | Rotate left | 循環左移 |
ROR | Rotate right | 循環右移 |
RCL | Rotate left through carry | 帶進位循環左移 |
RCR | Rotate right through carry | 帶進位循環右移 |
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
串處理指令
一 與REP相配合工作的MOVS,STOS和LODS指令
指令 | 英文全拼 | 翻譯 |
REP | repeat | 重複操作 |
MOVS | MOVe String | 串傳送指令 |
STOS | STOre into String | 存入串指令 |
LODS | LOaD from String | 從串取指令 |
CLD | Clear direction flag | 使地址自動增量 |
STD | Set direction flag | 使地址自動減量 |
REP(REPeat)重複操作前綴
格式:REP String Primitive
執行的操作:
1)如(CX)=0則退出REP,否則往下執行。
2)(CX)<-(CX)-1
3)執行其中的串操作
4)重複1)~3)
註:其中String Primitive可為MOVS,LODS或STOS指令
.MOVS串傳送指令
格式:MOVS ES:BYTE PTR[DI],DS:[SI]
可有三種
MOVS DST,SRC
MOVSB //位元組串傳送DF=0,SI = SI + 1,DI = DI + 1 ;DF = 1,SI = SI - 1,DI = DI-1
MOVSW //字串傳送DF=0,SI = SI + 2,DI = DI + 2 ;DF = 1,SI = SI - 2,DI = DI - 2
MOVSD //雙字串傳送DF=0,SI = SI + 4,DI = DI + 4 ;DF = 1,SI = SI - 4,DI = DI - 4
MOVSX//符號傳送
MOVZX//零傳送
執行的操作:
1)如(CX)=0則退出REP,否則往下執行。
2)(CX)<-(CX)-1
3)執行其中的串操作
4)重複1)~3)
.MOVS 串傳送指令
注:當方向標誌DF=1時用,其中第二、三種格式明確地註明是傳送位元組或字,第一種格式則應在運算元中表明是字還是位元組操作,例如:
1)(DI)<-(SI)
2)位元組操作: (SI)<-( SI ± 1),(DI)<-( DI ± 1 )//當方向標誌DF=0時用
3)字操作: (SI)<-( SI ± 2 ),(DI)<-( DI ± 2 )當方向標誌DF=0時用//當方向標誌DF=1時用-
該指令不影響條件碼。
STOS(STOre into String) 存入串指令
格式:STOS DST
STOSB //存放位元組串( DI ) = AL
STOSW //存放字串( DI ) = AX
執行操作:把AL或AX中的內容存放由DI指定的附加段的位元組或字單元中,並根據DF值及數據類型修改DI的內容。
位元組操作:(DI)←(AL),(DI)←( DI±1)
字操作:(DI)←(AX),(DI)←( DI ±2)
註:1.在執行該指令之前,必須把要存入的數據預先存入AX或AL中,必須預置DI的初值。
2.DI 所指向的存儲單元只能在附加段中,即必須是ES:[DI]
3.該指令把AL或AX的內容存入由(DI)指定的附加段的某單元中,並根據DF的值及數據類型修改DI的內容,當它與REP聯用時,可把AL或AX的內容存入一個長度為(CX)的
緩衝區中。
LODS( LOaD from String ) 從串取指令
格式:LODS SRC
LODSB //從位元組串取AL=(SI)
LODSW //從字串取AX= (SI±1) (SI)
執行操作:位元組操作:(AL)<-(SI),(SI)<-(SI±1)
字操作:(AX)<-(SI),(SI)<-(SI±2)
把由(SI)指定的數據段中位元組或字單元的內容送入AL或AX中,並根據DF值及數據類型修改SI的內容。
註:1.在執行該指令之前,要取的數據必須在存儲器中預先定義(用DB或DW),必須預置SI的初值。
2.源串允許使用段超越前綴來改變數據存儲的段區。
3.該指令把由(SI)指定的數據段中某單元的內容送到AL或AX中,並根據方向標誌DF及數據類型修改SI的內容。指令允許使用段跨越前綴來指定非數據段的存儲區。該指令也不影響條件碼。
4.一般說來,該指令不和REP聯用。有時緩衝區中的一串字元需要逐次取出來測試時,可使用本指令。
CLD(CLear Direction flag) 清除方向標誌指令
格式:CLD
執行操作:令DF=0,其後[SI],[DI]執行增量操作
該指令使DF=0,在執行串操作指令時可使地址自動增量
STD(SeT Direction flag) 設定方向標誌指令
格式:STD
執行操作:令DF=1,其後[SI],[DI]執行減量操作
該指令使DF=1,在執行串操作指令時可使地址自動減量。
二與REPE/REPZ和REPNZ/REPNE聯合工作的CMPS和SCAS指令
指令 | 英文全拼 | 翻譯 |
REPE/REPZ | Repeat Equal to Zero | 等於零時重複操作 |
REPNE/REPNZ | Repeat Not Equal to Zero | 不等於零時重複操作 |
CMPS | CoMPare String | 串比較指令 |
SCAS | SCAn String | 串掃描指令 |
.REPE/REPZ當相等/為零時重複串操作
格式:REPE(或REPZ) String Primitive
其中String Primitive可為CMPS或SCAS指令。
執行的操作:
1)如(CX)=0或ZF=0(即某次比較的結果兩個運算元不等)時退出,否則往下執行
2)(CX)<-(CX)-1
3)執行其後的串指令
4)重複1)~3)
.REPNE/REPNZ當不相等/不為零時重複串操作
格式:REPNE(或REPNZ) String Primitive
執行的操作:
除退出條件(CX=0)或ZF=1外,其他操作與REPE完全相同。
CMPS(CoMPare String) 串比較指令
格式:CMPS SRC,DST
CMPSB //位元組串比較(SI)-(DI)
CMPSW //字串比較(SI+1)(SI) - (DI+1)(DI)
執行操作:把由(SI)指向的數據段中的一個字(或位元組)與由DI指向的附加段中的一個字(或位元組)相減,不保留結果,只根據結果置標誌位。
1)(SI)-(DI)
2)位元組操作:(SI)<-(SI±1),(DI)<-(DI±1)
字操作:(SI)<-(SI±2),(DI)<-(DI±2)
註:指令把由(SI)指向的數據段中的一個字(或位元組)與由(DI)指向的附加段中的一個字(或位元組)相減,不保存結果,只根據結果設定條件碼,指令的其它特性和MOVS指令的規定相同。
.SCAS(SCAn String ) 串掃描指令
格式:SCAS DST
SCASB
SCASW
執行操作:把AX或AL的內容與由DI指向的在附加段中的一個字(或位元組)相減,不保留結果,根據結果置標誌位。
位元組操作:(AL)-(DI),(DI)<-(DI±1)
字操作:(AX)-(DI),(DI)<-(DI±2)
註:該指令把AL(或AX)的內容與由(DI)指定的在附加段中的一個字(或位元組)進行比較,不保存結果,只根據結果置條件碼。指令的其他特性和MOVS的規定相同。
控制轉移指令
一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)段內直接短轉移
格式:JMP SHORT OPR
執行的操作:(IP)<-(IP)+8位位移量
2)段內直接近轉移
格式:JMP NEAR PTR OPR
執行的操作:(IP)<-(IP)+16位位移量
3)段內間接轉移
格式:JMP WORD PTR OPR
執行的操作:(IP)<-(EA)
4)段間直接(遠)轉移
格式:JMP FAR PTR OPR
執行的操作:(IP)<-OPR的段內偏移地址
(CS)<-OPR所在段的段地址
5)段間間接轉移
格式:JMP DWORD PTR OPR
執行的操作:(IP)<-(EA)
(CS)<-(EA+2)
1.無條件轉移到指定的地址去執行從該地址開始的指令。
2.段內轉移是指在同一代碼段的範圍內進行轉移,只需改變IP暫存器內容。
3.段間轉移則要轉移到另一個代碼段執行程式,此時要改變IP暫存器和CS段暫存器的內容。
二 條件轉移指令:
指令 | 英文全拼 | 翻譯 |
JZ/JE | Jump if zero,or equal | 結果為零(或相等)則轉移 |
JNZ/JNE | Jump if not zero,or not equal | 結果不為零(或不相等)則轉移 |
JS | Jump if sign | 結果為負則轉移 |
JNS | Jump if not sign | 結果為正則轉移 |
JO | Jump if overflow | 溢出則轉移 |
JNO | Jump if not overflow | 不溢出則轉移 |
JP/JPE | Jump if parity,or parity even | 奇偶位為1則轉移 |
JNP/ JPO | Jump if not parity,or parity odd | 奇偶位為0則轉移 |
JB/JNAE/JC | Jump if below,or not above or equal,or carry | 低於,或者不高於或等於,或進位位為1則轉移 |
JNB/JAE/JNC | Jump if not below,or above or equal,or not carry | 不低於,或者高於或者等於,或進位位為0則轉移 |
根據上一條指令所設定的條件碼(標誌位)來判斷測試條件。
JZ(或JE)(Jump if zero,or equal) 結果為零(或相等)則轉移
格式:JE(或JZ) OPR
測試條件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not equal) 結果不為零(或不相等)則轉移
格式:JNZ(或JNE) OPR
測試條件:ZF=0
.JS(Jump if sign) 結果為負則轉移
格式:JS OPR
測試條件:SF=1
.JNS(Jump if not sign) 結果為正則轉移
格式:JNS OPR
測試條件:SF=0
.JO(Jump if overflow) 溢出則轉移
格式:JO OPR
測試條件:OF=1
.JNO(Jump if not overflow) 不溢出則轉移
格式:JNO OPR
測試條件:OF=0
.JP(或JPE)(Jump if parity,or parity even) 奇偶位為1則轉移
格式:JP OPR
測試條件:PF=1
.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位為0則轉移
格式:JNP(或JPO) OPR
測試條件:PF=0
.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低於,或者不高於或等於,或進位位為1則轉移
格式:JB(或JNAE,JC) OPR
測試條件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低於,或者高於或者等於,或進位位為0則轉移
格式:JNB(或JAE,JNC) OPR
測試條件:CF=0
2)比較兩個無符號數,並根據比較的結果轉移
.JB(或JNAE,JC)
格式:同上
.JNB(或JAE,JNC)
格式:同上
.JBE(或JNA)(Jump if below or equal,or not above) 低於或等於,或不高於則轉移
格式:JBE(或JNA) OPR
測試條件:CFVZF=1
.JNBE(或JA)(Jump if not below or equal,or above) 不低於或等於,或者高於則轉移
格式:JNBE(或JA) OPR
測試條件:CFVZF=0
根據五個標誌位:ZF、SF、OF、PF、CF的兩種狀態(0 FALSE或1 TRUE)產生10種測試條件。
名稱 | 簡寫 | Flag == TRUE [1] | Flag ==FALSE [ 0] |
Zero Falg | ZF | JE/JZOPR結果為零轉移 | JNE/JNZOPR結果不為零轉移 |
Sign Falg | SF | JSOPR結果為負轉移 | JNSOPR結果為正轉移 |
Overflow Flag | OF | JOOPR溢出轉移 | JNOOPR不溢出轉移 |
Parity Flag | PF | JP/JPEOPR結果為偶轉移 | JNP/JPOOPR結果為奇轉移 |
Carry Flag | CF | JCOPR有進位轉移 | JNCOPR無進位轉移 |
情況 | 指令 | 滿足條件 | 指令 | 滿足條件 |
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 |
三 比較兩個無符號數,並根據比較的結果轉移
指令 | 英文全拼 | 翻譯 |
JB/JNAE/JC | Jump if less,or not greater or equal | 小於,或者不大於或者等於則轉移 |
JNB/JAE/JNC | Jump if not less,or greater or equal | 不小於,或者大於或者等於則轉移 |
JBE/JNA | Jump if below or equal,or not above | 低於或等於,或不高於則轉移 |
JNBE/JA | Jump if not below or equal,or above | 不低於或等於,或者高於則轉移 |
.JB(或JNAE,JC)
格式:同上
.JNB(或JAE,JNC)
格式:同上
.JBE(或JNA)(Jump if below or equal,or not above) 低於或等於,或不高於則轉移
格式:JBE(或JNA) OPR
測試條件:CFVZF=1
.JNBE(或JA)(Jump if not below or equal,or above) 不低於或等於,或者高於則轉移
格式:JNBE(或JA) OPR
測試條件:CFVZF=0
四 比較兩個帶符號數,並根據比較的結果轉移
指令 | 英文全拼 | 翻譯 |
JL/LNGE | Jump if less,or not greater or equal | 小於,或者不大於或者等於則轉移 |
JNL/JGE | Jump if not less,or greater or equal | 不小於,或者大於或者等於則轉移 |
JLE/JNG | Jump if less or equal,or not greater | 小於或等於,或者不大於則轉移 |
JNLE/JG | Jump if not less or equal,or greater | 不小於或等於,或者大於則轉移 |
.JL(或LNGE)(Jump if less,or not greater or equal) 小於,或者不大於或者等於則轉移
格式:JL(或JNGE) OPR
測試條件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater or equal)不小於,或者大於或者等於則轉移
格式:JNL(或JGE) OPR
測試條件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or not greater) 小於或等於,或者不大於則轉移
格式:JLE(或JNG) OPR
測試條件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or equal,or greater) 不小於或等於,或者大於則轉移
格式:JNLE(或JG) OPR
測試條件:(SFVOF)VZF=0
五 測試CX的值為0則轉移指令
.JCXZ(Jump if CX register is zero) CX暫存器的內容為零則轉移
格式:JCXZ OPR//CX==0時轉移
測試條件:(CX)=0
註:條件轉移全為8位短跳!
六 循環指令
LOOP(LOOP)循環指令
格式:LOOP OPR
測試條件:CX ≠ 0 //OPR在程式中實際是個標號
.LOOPNZ/LOOPNE當不為零或不相等時循環指令
格式:LOOPNZ(或LOOPNE) OPR
測試條件:(CX)<>0且ZF=0
註:這三條指令的步驟是:
1)(CX)<-(CX)-1
2)檢查是否滿足測試條件,如滿足則(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.
中斷指令
.INT指令
格式:INT TYPE
或INT
執行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(TYPE*4)
(CS)<-(TYPE*4+2)
.INTO 若溢出則中斷
執行的操作:若OF=1則:
(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(10H)
(CS)<-(12H)
格式:IRET
執行的操作:(IP)<-((SP)+1,(SP))
(SP)<-(SP)+2
(CS)<-((SP)+1,(SP))
(SP)<-(SP)+2
(PSW)<-((SP)+1,(SP))
(SP)<-(SP)+2
處理機控制指令
一標誌處理指令
指令 | 英文全拼 | 翻譯 | |
CLC | Clear carry | 進位位置0指令 | 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<-0 |
二其他處理機控制指令
指令 | 英文全拼 | 翻譯 |
NOP | No Opreation | 無操作 |
HLT | Halt | 停機 |
WAIT | Wait | 等待 |
ESC | Escape | 換碼 |
LOCK | Lock | 封鎖 |
處理器控制指令
CLC(CLear Carry) 進位位置0指令
格式:CLC //執行操作後,CF=0
CMC(CoMplement Carry) 進位位求反指令
格式:CMC //執行操作後,CF=!CF
STC(SeT Carry) 進位位置1指令
格式:STC //執行操作後,CF=1
HLT(HaLT) 停機指令
格式:HLT
執行操作:使機器暫停工作,使處理器CPU處於停機狀態,以等待一次外部中斷到來,中斷結束後,程式繼續執行,CPU繼續工作。
註:該指令可使機器暫停工作,使處理機處於停機狀態以便等待一次外部中斷到來,中斷結束後可繼續執行下面的程式。
NOP(No Operetion) 無操作指令
格式:NOP //此指令不執行任何操作,其機器碼占一個位元組單元
該指令不執行任何操作,其機器碼占有一個位元組,在調試程式時往往用這條指令占有一定的
存儲單元,以便在正式運行時用其他指令取代。
.WAIT等待指令
該指令使處理機處於空轉狀態,它也可以用來等待外部中斷的發生,但中斷結束後仍返回WAIT指令繼續執行。
.ESC換碼指令
格式ESC mem
其中mem指出一個存儲單元,ESC指令把該存儲單元的內容送到數據匯流排去。當然ESC指令不允許使用立即數和暫存器定址方式。這條指令在使用協處理機(Coprocessor)執行某些操作時,可從存儲器指得指令或運算元。協處理機(如8087)則是為了提高速度而可以選配的硬體。
.LOCK封鎖指令
該指令是一種前綴,它可與其他指令聯合,用來維持匯流排的鎖存信號直到與其聯合的指令執行完為止。當CPU與其他處理機協同工作時,該指令可避免破壞有用信息。
十進制調整指令
當計算機進行計算時,必須先把十進制數轉換為
二進制數,再進行二進制數運算,最後將結果又轉換為十進制數輸出。
在計算機中,可用4位二進制數表示一位十進制數,這種代碼稱為BCD ( Binary Coded Decimal ).
BCD碼又稱
8421碼,在PC機中,BCD碼可用壓縮的BCD碼和非壓縮的BCD碼兩種格式表示。
壓縮的BCD碼用4位二進制數表示一個十制數,整個十進數形式為一個順序的以4位為一組的數串。
非壓縮的BCD碼以8位為一組表示一個十進制數,8位中的低4位表示8421的BCD碼,而高4位則沒有意義。
指令 | 英文全拼 | 翻譯 |
DAA | Decimal Adjust for Addition | 加法的十進制調整指令 |
DAS | Decimal Adjust for Subtraction | 減法的十進制調整指令 |
AAA | ASCII Adjust for Addition | 加法的ASCII調整指令 |
AAS | ASCII Adjust for Subtraction | 減法的ASCII調整指令 |
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暫存器中。
執行操作:[DI] = [SI],將位於DS段的由SI所指出的存儲單元的位元組或字傳送到位於ES段的由DI 所指出的存儲單元,再修改SI和DI,從而指向下一個元素。
在執行該指令之前,必須預置SI和DI的初值,用STD或CLD設定DF值。
格式:MOVS DST,SRC //同上,不常用,DST和SRC只是用來用類型檢查,並不允許使用其它定址方式來確定運算元。
1.目的串必須在附加段中,即必須是ES:[DI]
2.源串允許使用段跨越前綴來修飾,但偏移地址必須是[SI].
相關教材
《80x86彙編語言基礎教程》
基本信息
教材名稱:《80X86彙編語言基礎教程》
ISBN編號: 9787111253822
出版時間:2009-3-1
出版社:機械工業出版社
頁數: 213
版次印次: 1
作者: (美)德特默(Detmer,R.C.) 著,
鄭紅,陳麗瓊 譯
開本: 16開
裝幀: 平裝
印數: 1
內容簡介
學會一門具體的彙編語言對理解
計算機體系結構是非常有益的,然而,許多關於計算機組成和體系結構的教材對這方面的知識介紹得不多。《80x86
彙編語言基礎教程(附光碟)》主要針對Intel 80x86體系結構介紹彙編語言知識,因此既是計算機組成和體系結構課程的很好的補充教材,同時也適合作為單獨的彙編語言課程教材。通過《80x86彙編語言基礎教程(附光碟)》的學習,學生能夠使用微軟的MASM彙編器來編譯32位的平面存儲模式程式,並在微軟的Windbg調試器控制下跟蹤程式指令的執行,從中了解計算機內部存儲器和
暫存器內容的變化。《80x86彙編語言基礎教程(附光碟)》附帶的軟體包為編寫和調試控制台應用程式提供了很好的環境。
目錄
出版者的話
前言
第1章計算機中數的表示
第2章軟體工具和彙編語言語法
第3章基本指令
第4章分支與循環
第5章過程
第6章位運算
第7章浮點運算
附錄A 十六進制/ASC 碼轉換
附錄C MASM 6.11 保留字
附錄D 80x86 指令(按助記符排列)
附錄E 80x86 指令(按操作碼排列)
《彙編語言》
基本信息
教材名稱:《彙編語言》(第3版)
ISBN編號: 9787302172284
出版時間:2008-4-1
出版社: 清華大學出版社
頁數: 337
版次印次: 3
作者: 王爽 著
開本: 16開
裝幀: 平裝
印數: 1
字數: 527000
內容簡介
彙編語言是各種
CPU提供的機器指令的助記符的集合,人們可以用彙編語言直接控制硬體系統進行工作。
彙編語言是很多相關課程(如數據結構、作業系統、微機原理等)的重要基礎。為了更好地引導、幫助讀者學習彙編語言,作者以循序漸進的思想精心創作了這本書。本書具有如下特點:採用了全新的結構對課程的內容進行組織,對知識進行最小化分割,為讀者構造了循序漸進的學習線索;在深入本質的層面上對彙編語言進行講解;對關鍵環節進行深入的剖析。
本書可用作大學計算機專業本科生的彙編教材及希望深入學習計算機科學的讀者的自學教材。
目錄
第1章 基礎知識
第2章 暫存器
第3章 暫存器(記憶體訪問)
第4章 第一個程式
第5章 [BX]和loop指令
第6章 包含多個段的程式
第7章 更靈活的定位記憶體地址的方法
第8章 數據處理的兩個基本問題
第9章 轉移指令的原理
第10章 CALL和RET指令
第11章 標誌暫存器
第12章 內中斷
第13章 int指令
第14章 連線埠
第15章 外中斷
第16章 直接定址表
第17章 使用BIOS進行鍵盤輸入和磁碟讀寫
綜合研究
附註
《新版彙編語言程式設計》
基本信息
教材名稱:《新版彙編語言程式設計》
ISBN編號: 9787121026966
出版時間: 2007-01-01
作者: 錢曉捷 主編
裝幀: 平裝
字數: 563200
內容簡介
本書以Intel 80x86指令系統和MASM 6.x為主體,全面而系統地介紹16/32位整數、浮點、多媒體指令的彙編語言程式設計方法。全書可分為基礎和提高兩部分。前5章作為基礎部分,以當前“彙編語言程式設計”課程的教學為目標,為讀者講解16位基本整數指令及其彙編語言程式設計的知識。基礎部分的主要內容是:彙編語言程式設計的基礎知識,8086指令詳解,MASM偽指令和操作符,程式格式,程式結構及其設計方法。後4章為提高部分,從不同的方面介紹彙編語言程式設計的深入內容和實際套用知識。提高部分各章的內容相對獨立,主要有:32位80x86 CPU的整數指令系統及其編程,
彙編語言與C/C++的混合編程,80x87 FPU的浮點指令系統及其編程,多媒體擴展指令系統及其編程,64位指令簡介。本書可作為高等院校《彙編語言程式設計》課程的教材或參考書,主要讀者為計算機及相關學科的本科和高職、高專學生。本書內容廣博、語言淺顯、結構清晰、實例豐富,也適合於電子、自動控制等專業的高校學生和成教學生,
計算機套用開發人員,深入學習微機套用技術的普通讀者等。
目錄
第1章彙編語言基礎知識
第2章 8086的指令系統
第3章彙編語言程式格式
第4章基本彙編語言程式設計
第5章高級彙編語言程式設計
第6章 32位指令及其編程
第7章彙編語言與C/C++的混合編程
第8章 80x87浮點指令及其編程
第9章多媒體指令及其編程
第10章 64位指令簡介
附錄A 調試程式CodeView
附錄B 彙編程式MASM的偽指令和操作符
附錄C 80x86整數指令系統
附錄D 輸入輸出子程式庫IO.LIB
參考文獻
《彙編語言程式設計》
基本信息
產品名稱:《彙編語言程式設計》
ISBN編號:9787111272601
出版時間:2009-10-1
出版社: 機械工業出版社
頁數: 340
版次印次: 1
開本: 16開
裝幀: 平裝
印數: 1
字數: 544000
內容簡介
本書共8章,主要討論彙編語言的編程基礎、程式開發過程和調試方法。
本書的主要特點是通俗易懂,遵循由淺入深、由簡到繁、循序漸進的原則。力爭改變
彙編語言難學難教的狀況。與本書配套的《
彙編語言程式設計實驗與習題解答》一書另行出版,該書包含詳盡的彙編語言程式設計實驗和本書所有習題的解答。本書既可作為高等院校信息類(如計算機、自動控制、
電工電子等)專業的本科教材,也可作為工程技術人員的參考書。
目錄
出版說明
前言
第1章 彙編語言的基本概念
第2章 彙編語言程式中的指令與偽指令
第3章 彙編語言程式設計初步
第4章 子程式設計
第5章 彙編語言程式的套用示例
第6章 輸入輸出和中斷處理
第7章 宏和多模組程式設計
第8章 彙編語言程式開發與調試
附錄
參考文獻