匯編語言指令大致分為以下幾類
> 一、傳送類指令
> 二、算數運算類指令
> 三、位操作指令
> 四、串操作指令
> 五、控制轉移類指令
> 六、處理器控制類指令
> 七、匯編指令偽指令
* * * * *
**一、傳送類指令**
**1.數據傳送指令**
**(1) MOV 目的操作數,源操作數**
`將源操作數送到目的操作數,目的和源的數的長度要相同,否則會長度不匹配`
**(2)XCHG 傳送指令**
`XCHG 目的操作數,源操作數 //把源和目的操作數交換數值`
**2.有效地址傳送指令LEA**
~~~
LEA 目的操作數,源操作數
把源操作數的偏移地址送目的操作數,
源操作數必須是一個內存操作數,
目的操作數必須是16位通用寄存器
~~~
**3.堆棧指針操作指令**
堆棧是一塊特殊的存儲器區域,這塊區域是以先進后出的方式工作,系統為此提供了特殊的指針SP,和段寄存器SS
主要特點是:
(1)堆棧是以字方式操作的
**(2)壓入堆棧**。
①先修改指針:`SP=SP -2`
②再存入一個字
**(3)彈出堆棧。**
①先彈出一個字
②再修改指針:`SP=SP +2`
**(4)入棧指令PUSH**
格式:PUSH 操作數
該指令為數據入棧指令
即將操作數指定的一個字節的內容傳送至SP所指的棧頂
尋址方式有寄存器尋址(段寄存器SS除外)和存儲器尋址,
不能用立即數作操作數。
該指令不影響標志位。
過程:
首先,堆棧`SP=SP-2`
然后,操作數的高位字節——>存入((SP)+1)單元中
操作數的低位字節——>送入(SP)
**(5)出棧指令:POP**
POP 操作數
將SP所指的棧頂內容傳送至操作數指定的一個字。
**尋址方式有:**
寄存器尋址(段寄存器SS除外)和存儲器尋址
不能用立即數作操作數。
該指令不影響標志位。
**過程:**
首先堆棧((SP)+1)單元字節——>操作數的高字節位,
(SP)單元字節——>操作數的低位字節。
然后`SP=SP-2`
**4.輸入輸出指令**
**(1)IN 輸入指令**
~~~
IN AL,N ; (N)——>AL
IN AX,N ; (N+1:N)——>AX
IN AL,63H ; 將端口地址為63H的一個字節內容輸入到AL
IN AX,55H ;將兩個相鄰端口地址58H和59H的16位數據輸入到AX
~~~
**(2)OUT 輸出指令**
~~~
OUT N,AL ;(AL)字節——>N端口地址的單元中
OUT N,AX ;(AX)字——>N+1和N端口地址的單元中
OUT 66H,AL ;將AL內容送端口地址66H的單元中
OUT 66H,AX ;將AX內容送66H和67H端口地址的單元中
~~~
**!注意:**
> 在匯編語言中,端口地址小于256(十六進制00H~FFH)時
> 可以直接在指令中寫出端口地址
> 如果端口地址大于256,先將端口地址送入DX寄存器中,
> 然后在IN或OUT指令中用DX代表端口地址。
* * * * *
**二、算數運算類指令**
參加運算的可以是無符號數或帶符號數,帶符號的數以補碼的形式存放或參與運算
**1.加法指令**
**(1)ADD 目的操作數,源操作數**
目的操作數+源操作數——>目的操作數
**(2)ADC帶進位的加法指令**
ADC 目的操作數,源操作數
目的操作數+源操作數+CF——>目的操作數
**例子:**
~~~
MOV AH,0 ;0——>AH
MOV AL,92H ;92H——>AL
ADD AL,86H ;92H+86H=18H——>AL,CF=1
ADC AH,0 ;(AH)+0+CF=0+0+1=1——>AH,即01H=AH
~~~
**(3)INC 加|指令**
INC 操作數 //操作數加1,結果送操作數
操作數可以是任意一個8或16位的通用寄存器或存儲單元,不能是立即數
指令中操作數當作無符號數時,主要用于計數器計數或修改指針地址的值。
如:
~~~
INC DI ;(DI)=DI+1
INC CX ;(CX)=CX+1
~~~
**說明**:除了指令INC對標志位CF不影響外,其它加法指令對標志位的影響如下
> ①CF:兩個數相加,最高有效位有進位時,即字節運算超出無符號輸的范圍
> 0~255,字運算超出無符號數的范圍0~65535時,CF=1,否則CF=0.
> 故兩個無符號數相加時,可用CF值來判斷是否超出了無符號數的表示范圍
> 如果CF=1表示此無符號數加法運算結果發生了溢出。
> ②PF:運算結果以二進制數表示時,若"1"的個數為偶數時PF=1,否則PF=0
> ③AF:運算中D3向D4有進位時,AF=1,否則為0
> ④ZF:運算結果為0時,ZF=1;否則ZF=0
> ⑤SF:運算結果最高位為1時,SF=1,否則為0
> ⑥OF:當兩個操作數的符號相同,而相加的結果的符號與操作數的符號相反時
> OF=1,否則OF=0。該標志位用來判斷帶符號數相加的溢出
**例如:**
~~~
ADD AL,30H ;(AH)+30H ——> AL
ADD AX,3000H ;(AX)+3000H ——> AX
ADD BX,[SI] ;(BX)+((SI))——>BX
~~~
**2.減法指令**
**(1)SUB**
`SUB 目的操作數,源操作數`
目的操作數=目的操作數-源操作數
**(2)SBB 帶錯位的減法指令**
`SBB 目的操作數,源操作數`
目的操作數=目的操作數-源操作數-CF
**(3)DEC 減1指令 格式:DEC 操作數**
`DEC DI ;DI=(DI)-1`
**(4)NEG 求補指令**
~~~
NEG 操作數 //0-操作數的內容后結果回送操作數
MOV DI,05H
NEG DI ;DI=0-(DI)=0-05H=0FBH
~~~
**(5)CMP 比較指令**
CMP 目的操作數,源操作數
執行時目的操作數與源操作數相減,只根據結果設置標志位
操作數均保持原值不變
**3.類型擴展指令**
為了解決操作數長度的匹配,有時需要把數據類型進行擴展。
主要有把字節擴展成字,把字擴展成雙字
~~~
CBW:字節擴展成字
CWD:字擴展成雙字
~~~
**例子:**
**正數的擴展**
~~~
MOV AL,52H
CBW ;執行指令后,AX=0052H
CWD ;執行指令后,DX=0000H,AX=0052H
~~~
**負數的擴展**
~~~
MOV AL,86H
CBW ;執行指令后,AX=FF86H
CWD ;執行指令后,DX=FFFFH,FF86H
~~~
**4.乘法指令**
~~~
MUL :無符號數乘法
IMUL:帶符號數乘法
~~~
目的操作數必須是累加器,不必在指令中寫出。
**例子:**
**無符號數乘法**
~~~
MOV AL,05H
MOV BL,06H
MUL BL //執行結果AX=30=001EH
~~~
**有符號數乘法**
~~~
MOV AL,-5
MOV BL,+6
IMUL BL //AX=-30=FFE2H
~~~
**5.除法指令**
**DIV:無符號除法**
~~~
SRC(源操作數)為字節時,AL=AX/SRC的商,AH=AX/SRC的余數
SRC為字時:AX=(DX,AX)/SRC的商,DX=(DX,AX)/SRC的余數
~~~
商和余數都是無符號數。
**IDIV:有符號除法**
操作同上類似,目的操作數必須是累加器AX和DX,不必寫出。
* * * * *
**三、位操作指令**
~~~
AND 與運算.
or 或運算.
XOR 異或運算.
NOT 取反.
TEST 測試.(兩操作數作與運算,僅修改標志位,不回送結果).
SHL 邏輯左移.
SAL 算術左移.(=SHL)
SHR 邏輯右移.
SAR 算術右移.(=SHR)
ROL 循環左移.
ROR 循環右移.
RCL 通過進位的循環左移.
RCR 通過進位的循環右移.
以上八種移位指令,其移位次數可達255次.
移位一次時, 可直接用操作碼. 如 SHL AX,1.
移位>1次時, 則由寄存器CL給出移位次數.
如 MOV CL,04
SHL AX,CL
~~~
**四、串操作指令**
~~~
DS:SI 源串段寄存器 :源串變址.
ES:DI 目標串段寄存器:目標串變址.
CX 重復次數計數器.
AL/AX 掃描值.
D標志 0表示重復操作中SI和DI應自動增量; 1表示應自動減量.
Z標志 用來控制掃描或比較操作的結束.
MOVS 串傳送.
( MOVSB 傳送字符. MOVSW 傳送字. MOVSD 傳送雙字. )
CMPS 串比較.
( CMPSB 比較字符. CMPSW 比較字. )
SCAS 串掃描.
把AL或AX的內容與目標串作比較,比較結果反映在標志位.
LODS 裝入串.
把源串中的元素(字或字節)逐一裝入AL或AX中.
( LODSB 傳送字符. LODSW 傳送字. LODSD 傳送雙字. )
STOS 保存串.
是LODS的逆過程.
REP 當CX/ECX<>0時重復.,也就是直到CX=0時結束
REPE/REPZ 當ZF=1或比較結果相等,且CX/ECX<>0時重復.
REPNE/REPNZ 當ZF=0或比較結果不相等,且CX/ECX<>0時重復.
REPC 當CF=1且CX/ECX<>0時重復.
REPNC 當CF=0且CX/ECX<>0時重復.
~~~
**五、控制轉移類指令**
**1>無條件轉移指令 (長轉移)**
~~~
JMP 無條件轉移指令
CALL 過程調用
RET/RETF過程返回.
~~~
**2>條件轉移指令 (短轉移,-128到+127的距離內)**
~~~
( 當且僅當(SF XOR OF)=1時,OP1<OP2 )
JA/JNBE 不小于或不等于時轉移.
JAE/JNB 大于或等于轉移.
JB/JNAE 小于轉移.
JBE/JNA 小于或等于轉移.
以上四條,測試無符號整數運算的結果(標志C和Z).
JG/JNLE 大于轉移.
JGE/JNL 大于或等于轉移.
JL/JNGE 小于轉移.
JLE/JNG 小于或等于轉移.
以上四條,測試帶符號整數運算的結果(標志S,O和Z).
JE/JZ 等于轉移.
JNE/JNZ 不等于時轉移.
JC 有進位時轉移.
JNC 無進位時轉移.
JNO 不溢出時轉移.
JNP/JPO 奇偶性為奇數時轉移.
JNS 符號位為 "0" 時轉移.
JO 溢出轉移.
JP/JPE 奇偶性為偶數時轉移.
JS 符號位為 "1" 時轉移.
~~~
**3>循環控制指令(短轉移)**
~~~
LOOP CX不為零時循環.
LOOPE/LOOPZ CX不為零且標志Z=1時循環.
LOOPNE/LOOPNZ CX不為零且標志Z=0時循環.
JCXZ CX為零時轉移.
JECXZ ECX為零時轉移.
~~~
**4>中斷指令**
~~~
INT 中斷指令
INTO 溢出中斷
IRET 中斷返回
~~~
**六、處理器控制類指令**
處理器控制類指令只能完成對CPU的簡單控制功能。
共有12條
**對標志位操作**
~~~
CLC(進位位置0指令)
CMC(進位位求反指令)
STC(進位位置為1指令)
CLD(方向標志置1指令)
STD(方向標志位置1指令)
CLI(中斷標志置0指令)
STI(中斷標志置1指令)
~~~
**同步控制**
~~~
WAIT(等待)
ESC(交權)
LOCK(封鎖總線)
~~~
**其他**
~~~
NOP(無操作)
HLT(暫停)
~~~
* * * * *
**七、匯編指令偽指令**
~~~
DW 定義字(2字節).
PROC 定義過程.
ENDP 過程結束.
SEGMENT 定義段.
ASSUME 建立段寄存器尋址.
ENDS 段結束.
END 程序結束.
~~~
* * * * *