1) MOV
a) MOV A, B 不允許指定段寄存器
b) MOV 寄存器,data 不允許指定段寄存器
c) MOC 段寄存器,mem 不允許使用CS寄存器,此條指令執行后不響應中斷,要等下一跳指令執行完后才能相應中斷
d) MOV mem/reg,data 目的操作數只用存儲器尋址方式,不用寄存器
2) MOVSX 帶符號擴展傳送
a) 傳遞時將源操作數符號擴展送人目的寄存器,先做符號位擴展,再傳送
b) MOVSX reg,mem 該指令的源操作數可以是8位或者16位的寄存器或者存儲單元的內容,而且目的操作數則必須是16位或32位寄存器
c) MOVSX reg1,reg2
3) MOVZX 帶零擴展傳送
a) 一般的雙操作數指令的源操作數和目的操作數的長度是一致的,但是MOVSX,MOVZX的源操作數長度一定要小于目的操作數
b) MOVZX reg1,reg2
MOVZX reg,mem
4) PUSH
5) POP
a) 堆棧的存取在16位指令中必須以字為單位(不允許字節堆棧),在32位指令中必須以雙字為單元,所以PUSH,POP指令只能作字或雙字操作
b) 當操作數長度為16位時,SP或ESP均為±2,進出棧是字,操作數長度是32位時,SP或ESP均為±4,進出棧是4
c) 特殊情況:8086中的PUSH SP指令入棧的是該指令已修改了的SP新值,而PUSH ESP指令入棧的卻是ESP在執行該指令之前的舊值。
PUSH POP指令使用與存儲器有關的尋址方式且用ESP作為基址寄存器時,PUSH指令使用該指令執行前的ESP內容,POP指令則使用該指令執行后的ESP內容來計算基址
6) PUSHA/PUSHAD 所有寄存器進棧
a) PUSHA進棧的次序:AX,CX,DX,BX, 指令執行前的SP,BP,SI,DI
b) PUSHA指令執行后(SP) – 16 à (SP) 仍指向棧頂
7) POPA/POPAD 所有寄存器出棧
a) POPA出棧順序:DI,SI,SP,BX,DX.CX.AX 執行后,(SP)+16 à (SP) 仍指向棧頂
b) 說明:SP的出棧只是修改了指針,使其后的BX能順利出棧,而堆棧中原先由PUSHA指令存入的SP的原始內容被丟棄,并未真正的送到SP寄存器中
8) XCHG 交換
a) 兩個操作數中必須有一個在寄存器中,因此可以在寄存器之間,寄存器與存儲器之間交換信息,但不允許使用段寄存器
b) 允許字節或字操作
c) 不能使用立即數尋址,其他的尋址方式都可以
這組指令只限于使用累加器EAX,AX或AL 傳遞信息
1) IN 輸入
a) 長格式(8位):
i. IN AL,PORT 字節
ii. IN AX,PORT 字 (PORT + 1 ,PORT)
iii. IN EAX PORT 雙字 (PORT + 3 ,PORT + 2, PORT + 1 , PORT)
b) 短格式(16位):
i. IN AL,DX 字節
ii. IN AX,DX 字
iii. IN EAX,DX 雙字
2) OUT 輸出
a) 長格式(8位):
i. OUT PORT,AL 字節
ii. OUT PORT,AX 字
iii. OUT PORT,EAX 雙字
b) 短格式(16位):
i. OUT DX,AL
ii. OUT DX,AX
iii. OUT,DX,EAX
3) XLAT 換碼
a) 把代碼轉換成另外一種代碼
b) XLAT OPR
OPR是表格首地址
XLAT
c) 執行之前,建立一個字節表格
i. 表格首地址,提前存入BX或EBX寄存器
ii. 需要轉換代碼相對于表格首地址的位移量提前放在AL寄存器中
d) 轉換后的代碼在AL中
4) CPU只能用累加器(AX,EAX或AL)接收或發送信息
5) IN/OUT提供了雙字、字和字節三種方式,外設端口的寬度決定使用哪一種
6) 端口號:外部設備最多可以有65536個 0000~FFFFH
a) 前256個端口(00~FFH)可以直接在指令中指定
b) 長格式:可以在指令中直接指定端口號,但只限于前256個端口
c) 短格式:端口號>=256時,只能使用短格式,此時必須先把端口號放到DX寄存器中,然后再用IN/OUT傳遞信息
d) 注意:這里的端口號或者DX的內容均是地址,而傳送的是端口中的信息,在使用短格式時,DX內容就是端口號本身,不需要任何段寄存器來修改他的值
1) LEA 有效地址送寄存器
a) 目的操作數可以使用16位或者32位寄存器,但不能使用段寄存器
b) 源操作數可以使用除了立即數和寄存器之外的任何一種存儲器尋址方式
c) LEA BX, LIST
MOV BX, OFFSET LIST 這兩句的意義一樣
2) LDS 指針送寄存器和DS
3) LES 指針送寄存器和ES
4) LFS 指針送寄存器和FS
5) LGS 指針送寄存器和GS
6) LSS 指針送寄存器和SS
7) 本組指令的目的寄存器不允許使用段寄存器
1) LAHF 標志送AH
2) SAHF AH送標志寄存器
3) PUSHF 標志進棧
4) POPF 標志出棧
1) CBW 字節轉字
a) AL的內容符號擴展到AH,形成AX中的字
2) CWD/CWDE 字轉雙字
a) CWD AX的內容符號擴展到DX,形成DX:AX中的雙字
b) CWDE AX的內容符號擴展到EAX中,形成EAX中的雙字
3) CDQ 雙字轉換為4字
a) EAX的內容符號擴展到EDX,形成EDX:EAX中的4字
4) BSW 字節交換
a) 只能用于486及其后繼機型
b) 使指令指定的32位寄存器的字節次序變反
1) 加法指令
a) ADD
b) ADC 帶進位加,把CF中的值也加上
c) INC 自加1
d) XADD 交換并相加
i. 只能用于486及其后繼機型
ii. 把目的操作數裝入源,并把源和目的操作數之和送目的地址
源操作數只能使用寄存器尋址方式,目的操作數可用寄存器或任意一種存儲器尋址方式
e) 實現雙精度加法時,需要注意:
i. 低位字和高位字的加法必須用兩條指令完成,且在高位字相加時,為了將低位字假發所產生的進位值加入到高位字之內,應該使用ADC指令。
ii. 雙精度數的溢出,是根據ADC指令的OF判斷,低位字加法用的ADD指令的溢出是無意義的
2) 減法指令
a) SUB
b) SBB 帶借位減法
i. 減去CF值
c) DEC 自減1
d) NEG 求補(和求補碼完全不同)
i. 求補,將操作數取反加一
ii. 求補碼,正數的補碼與原碼一致;負數的補碼,先將符號去掉后的數值取反,然后+1
iii. 只有當操作數為0,求補運算的結果使CF = 0,其他情況為1
iv. 當字節運算時對-128求補,以及字運算時對-32768求補,和雙字運算時對- 求補時OF = 1,其他均為0
e) CMP
i. 將兩個操作數相減,但是不保存結果,只是根據計算結果設置條件標志位
ii. 后面通常跟著條件轉移指令,根據比較結果而產生不同的程序分支
f) CMPXCHG
g) CMPXCHG8B 比較并交換8字節
h)
3) 乘法指令 例題 P65
a) MUL 無符號乘法
b) IMUL 有符號乘法
i. 如果乘積的高一半是低一半的符號位擴展,那么CF和OF都是0,否則為1
c) 8位目的操作數放在AL中,16位乘積放在AX中
d) 16位目的操作數放在AX中,32位乘積的高位字放在DX,低位字放在AX中
e) 目的操作數必須放在累加器中(AX/AL/AH)
f) 源操作數可以使用除了立即數尋址方式之外的任意一種尋址方式
4) 除法指令
a) DIV 無符號處罰
b) IDIV 有符號除法
c) 字節運算:
16位被除數放在AX中,8位除數為源操作數。8位商放在AL中,8位余數放在AH中
d) 字運算:
32位被除數的高位字放在DX中,低位字放在AX中,16位除數為源操作數。16位上放在AX中,16位余數放在DX中
e) 目的操作數必須放在AX或DX,AX或EDX,EAX中
新聞熱點
疑難解答