一、傳送指令編碼
A通用。B累加器專用。C地址。D標誌spa
A:通用傳送指令指針
①:最基本的傳送指令 MOVorm
MOV 目的 源 #目的:OPRD1。源:OPRD2。blog
實現:接口
MOV AX,4234H內存
MOV AX,BXci
MOV AL,[1000H]字符串
注:①:能夠傳送16位的數據,也能夠傳送8位的數據ast
②:不能在兩個內存單元之間直接傳送
MOV [BX],[1000H] 錯誤的
③:CS和IP不能做爲目的操做數,可做爲源操做數
MOV CS,1000H 錯誤的
④:不能將當即數直接傳送到段寄存器中
⑤:段寄存器之間不能互相傳送
MOV DS,2000H 錯誤的
應該變爲兩句話傳輸 MOV AX,2000H
MOV DS,AX
MOV ES,DS 錯誤的
變爲兩句話傳輸:MOV AX,DS
MOV ES,AX
②:堆棧操做指令:PUSH和POP
堆棧:一段內存區域,可用於保存中間數據,運算結果或某些寄存器的值,須要時能夠從堆棧中將數據取出,按照先進後出的原則使用數據
注:微機把內存的一段區域做爲堆棧使用,即堆棧段SS,段內的物理地址由SS和SP決定,SP始終指向棧頂(棧頂是最底下)
PUSH OPRD(數據) 叫作壓棧
POP OPRD 叫作出棧
對PUSH和POP的說明:
①:堆棧操做老是按字運行的
②:PUSH AX AX爲1122H
注:每進入一個字,SP要減2(SP-2)
高字節放在較高地址,低字節放在較低地址
彈出一個字的時候,SP要加二(SP+2) #SP+2就是在回到所謂的棧底.
③:CS能夠壓棧,可是不能出棧。
③:交換指令XCHG
XCHG 目的 源
寄存器 <-> 寄存器(雙向)
或 寄存器 <--> 內存(雙向)
注:①:目的和源操做數,都不能是當即數或段寄存器,而且不能同時爲內存單元
XCHG [BX] [DI] 錯誤的 (同時都是內存單元,中括號表示內存單元)
②:CS 和IP不能爲源操做數,目的操做數
③:目的和源操做數,取值範圍要相同,同爲8位或16位
XCHG BL,DL 對的(同時8位)
XCHG AX,SI 對的(同時16位)
④:換碼指令XLAT:用於編碼制轉換
注:使累加器中的某個值轉換爲內存表格中對應的某個值,使用該指令前內存表的首地址,賦給BX,AL中存放表格某一項,與表格首地址的位移量,執行BX+AL獲得該表格中的一個地址,再將該地址所對應的值傳送到AL中
補充:使用XLAT換碼指令時,內存中必須有一個碼錶
⑤:輸入/輸出指令 IN、OUT
注:輸入指令用於CPU從外設端口接收數據,輸出指令用於CPU向外設端口發送數據
端口:CPU與外設之間經過接口進行數據交換,一個端口一般對應接口中的一個或幾個寄存器,每8位端口有一個地址叫作端口號,兩個相鄰的8位組成16位端口
端口數:最多爲65536個,端口號0000H~FFFFH
分類:直接輸入/輸出
前256端口直接輸出(2^8,00H~FFH)
IN 累加器,端口號
out 端口號,累加器
IN AL,50H #510H是端口號
IN AX,70H #AX裏存放的是70H與71H
OUT 44H,AL
直接輸入/輸出
IN 累加器,DX
IN AX,DX #這兩句話完成
地址傳送指令
LEA:取有效地址指令
LEA 目的,源
注:源操做數爲內存單元地址,目的操做數爲16位的寄存器
LEA AX,[2782H]
LEA BX,[BP+SI]
LDS:取地址指針,放入DS中,和其它寄存器的指令
注:將四個字節的內存單元地址送到兩個目的寄存器中,其中後兩個字節爲段地址,送到DS中
LES:取地址指針,放入ES和其餘寄存器的指令
LES DI,[2130H]
標誌傳送指令
LAHF:讀取標誌指令
SAHF:設置標誌指令
2、算術運算指令
加法
ADD:不帶進位的加法指令
ADC:帶進位的加法指令、
注:①:無符號和有符號加法,減法可使用同一個指令,無符號和有符號的乘法和除法,不能使用同一個指令
②:無符號運算產生溢出指的是CF=1時會設置進位,對於多字節運算中使用,要利用進位向高字節傳遞數值
INC:增量加1
注:IAC通常用在循環中,修改指針或修改循環次數
減法
SUB:不考慮錯位的減法指令
SUB BX,CX
SBB:考慮借位的減法的指令
DEC:減1
乘法:無符號乘法指令和有符號乘法指令
無符號:MUL
1、①:MUL BL
②:MUL CX
注:乘法隱含的一個操做數爲AL或AX
僞指令
2、MUL BYTE PTR[DI]
MUL WORD PTR[SI]
有符號:IMUL
IMUL CL
IMUL CX
除法
無符號:DIV
注:除法隱含的也是AX或AL
DIV CL
DIV CX
DIV BYTE PTR[DI]
有符號:IDIV
2、邏輯運算
AND 與
OR 或
NOT 非
XOR 異或
TEST 檢測(相似於AND)
AND:在與運算中,與0運算就是置0,與1運算就是原值不變。
OR:與1運算爲1,與0運算不變。
XOR:①:取反功能。②:寄存器清0
AND通常用於指定位數清零
OR通常用於指定位置置1
XOR通常用於某個寄存器清0
TESE:用於測定指定寄存器中某個位置是0仍是1
3、位移指令
①:SAL:非循環算術左移指令
注:左移低位補0,高位進入CF標誌位
②:SHL:非循環邏輯左移指令
③:SAR:非循環算術右移指令
注:高位不變向前填充,低位進入CF標誌位
④:SHR:非循環邏輯右移指令
注:以0填充,低位進入CF標誌位
ROL:不帶進位的循環左移指令
ROR:不帶進位的右移指令
RCL:帶進位的左移指令
RCR:帶進位的右移指令
4、串操做指令
注:①串操做指令要經過重複前綴來實現串操做
②:以SI做爲源操做數的指針寄存器,默認段爲DS段,以DI 做爲目的操做數的指針寄存器,默認段在ES 段
[DS:SI]à[ES:DI]
注:將DS段,SI所指出的字節或字,傳送到ES段,DI所指的存儲單元,自動修改地址DI和SI
字符串比較指令
CMPSB CMPSW
注:REPE/REPZ(功能:找不一樣的字符)表示CX !=0且比較的字節相等(ZF=1時)這個時候繼續比較,當ZF=0時,結束比較
REPNE/REPNZ(功能:找相同字符)表示CX !=0且比較的字符不等(ZF=0時),這個時候繼續比較,當ZF=1時,結束比較
字符串檢索指令
SCASB/SCASW
前綴:REPE/REPZ 當CX不等於0且AL(AX)內容相等,表示ZF=1,繼續檢索(找不同)
前綴:REPNE/REPNZ 當CX不等於0且與AL(AX)內容不等,ZF=0.繼續檢索(找同樣)
取字符串指令
LODSB/LODSW
存字符串指令
STOSB/STOSW
注:取字符串指令,不使用前綴,存字符串指令,使用REP前綴表示可使一個字符串填充到內存單元中
控制轉移指令
①:段內直接轉移指令
JMP 1000H
②:段內間接轉移指令
JMP CX
JMP[CX]
③:段間直接轉移指令
JMP B000H:0100H
④:段間間接轉移指令
JMP DW ORD PRT[BX+ SI]
CALL 和RET 子程序調用和返回指令
條件轉移指令
注:知足條件時執行指定的目標,不知足條件時執行下一條指令,判斷條件根據CF、SF、OF、PF、ZF、CX
條件跳轉指令分爲有符號數的跳轉和無符號跳轉,有符號的叫大於、小於,無符號的叫高於、低於。
JE/JZ 等於/爲0 時跳轉(ZF=1)à這裏計算機判斷
JNE/JNZ 不爲0時轉移(ZF=0時判斷)
有符號的:
JG/JNLE 大於/不小於等於
JNG/JLE 不大於/小於等於
JL/JNGE 小於/不大於等於
JNL/JGE 不小於/大於等於
無符號的:
JB/JNAE 低於/不高於等於
JNB/JAE 不低於/高於等於
JA/JNBE 高於/不低於等於
JNA/JBE 不高於/低於等於
JS 當SF爲1時跳轉
JNS 當SF爲0時轉移
JO 當OF爲1時跳轉
JNO 當OF爲0時轉移
JP 當PF爲1時跳轉
JNP 當PF爲0時轉移