?、 數據傳送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。
?、 算術指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。
三、 邏輯指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。
四、 控制轉移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。
五、 串操作指令:MOVS、LODS、STOS、CMPS、SCAS。
六、 標志處理指令:CLC、STC、CLD、STD。
8086指令包含133條基本指令, 一般分為五類來介紹
傳送指令,算術運算指令,邏輯運算和移位指令,串操作指令,控制轉移指令
一、數據傳送類指令
數據傳送是計算機中最基本、最重要的一種操作,傳送指令也是最常使用的一類指令
傳送指令把數據從一個位置傳送到另一個位置
除標志寄存器傳送指令外,均不影響標志位
重點掌握
MOV XCHG PUSH POP XLAT LEA
1、通用數據傳送指令
提供方便靈活的通用傳送操作
有3條指令
MOV
XCHG
PUSH POP
① 基本傳送指令MOV(move)
mov cl,4 ;cl←4,字節傳送
mov dx,0ffh ;dx←00ffh,字傳送
mov si,200h ;si←0200h,字傳送
mov bvar,0ah ;字節傳送
;假設bvar是一個字節變量,定義如下:bvar db 0
mov wvar,0bh ;字傳送
;假設wvar是一個字變量,定義如下:wvar dw 0
mov al,[bx] ;al←ds:[bx]
mov dx,[bp] ;dx←ss:[bp+0]
mov dx,[bp+4] ;dx←ss:[bp+4]
mov es,[si] ;es←ds:[si]
2,非法指令的主要現象:
兩個操作數的類型不一致
無法確定是字節量還是字量操作
兩個操作數都是存儲器
段寄存器的操作有一些限制
例子:
1、當無法通過任一個操作數確定是操作類型時,需要利用匯編語言的操作符顯式指明
MOV [BX+SI], 255 ;非法指令,修正:
;mov byte ptr [bx+si],255
;byte ptr 說明是字節操作
;mov word ptr [bx+si],255
;word ptr 說明是字操作
2,8088指令系統除串操作指令外,不允許兩個操作數都是存儲單元(存儲器操作數)
MOV buf2, buf1 如 MOV [BX],[SI]
3,MOV DS, ES ;非法指令,修正:
;mov ax,es
;mov ds,ax
MOV DS, 100H ;非法指令,修正:
;mov ax,100h
;mov ds,ax
MOV CS, [SI] ;非法指令
;指令存在,但不能執行
② 交換指令XCHG(exchange)
XCHG reg,reg/mem
;reg ? reg/mem
寄存器與寄存器之間對換數據
寄存器與存儲器之間對換數據
不能在存儲器與存儲器之間對換數據
例子:
mov ax,1199h ;ax=1199h
xchg ah,al ;ax=9911h
;等同于 xchg al,ah
mov wvar,5566h ;wvar是一個字量變量
xchg ax,wvar ;ax=5566h,wvar=9911h
;等同于 xchg wvar,ax
注意:不能在兩個內存單元之間交換
如:XCHG [BX],[SI] 錯誤!
段寄存器中CS、IP不能做操作數
③ 堆棧操作指令
1.堆棧是一個“后進先出LIFO”(或說“先進后出FILO”)的主存區域,位于堆棧段中;SS段寄存器記錄其段地址
堆棧只有一個出口,即當前棧頂;用堆棧指針寄存器SP指定
2,堆棧只有兩種基本操作:進棧和出棧,對應兩條指令PUSH和POP
堆棧由棧底向低地址方向生成
push:進棧指令先使堆棧指針SP減2,然后把一個字操作數存入堆棧頂部
如:push ax
push [2000h]
出棧指令POP:出棧指令把棧頂的一個字傳送至指定的目的操作數,然后堆棧指針SP加2
如:pop ax
pop wvar
3,堆棧操作的特點
堆棧操作的單位是字,進棧和出棧只對字進行
數據從棧頂壓入和彈出時,都是低地址送低字節,高地址送高字節
堆棧操作遵循先進后出原則,但可用存儲器尋址方式隨機存取堆棧中的數據
堆棧段是程序中不可或缺的一個內存區,常用來
臨時存放數據
傳遞參數
保存和恢復寄存器
2、累加器專用傳送指令
① 輸入輸出指令(IN/OUT指令)
格式:IN AL,port;port為直接端口地址
IN AL,DX ;DX的內容為端口地址(間接方式)
IN AX,port;
IN AX, DX
OUT port, AL
OUT DX, AL
OUT port, AX
OUT DX, AX
注意:①只能用累加寄存器不能用其它寄存器
②當端口地址在00H—FFH之間可以用直接地址
當端口地址大于FFH時必須用DX間址形式
例:IN AL,40H; (40H) AL
IN AX,80H; (80H)、(81H) AX
MOV DX, 0382H
IN AL,DX ; (0382H) AL
OUT 62H, AL
MOV DX, 0380H
OUT DX,AX
② 換碼指令XLAT(查表指令)
將BX指定的緩沖區中、AL指定的位移處的一個字節數據取出賦給AL
XLAT ;al←ds:[bx+al]
換碼指令執行前:
在主存建立一個字節量表格,內含要轉換成的目的代碼
表格首地址存放于BX,AL存放相對表格首地址的位移量
換碼指令執行后:
將AL寄存器的內容轉換為目標代碼
③址傳送指令 三條LEA 、LDS、LES
將存儲器操作數的有效地址送至指定的16位通用寄存器
LEA r16, mem
;r16←mem的有效地址EA
例子: 有效地址的獲取
LEA AX, [2375H] ; AX=2375H
LEA SP, [BX+SI] ; SP=(BX)+(SI)
區別: LEA SI, BUFF; SI=BUFF
MOV SI,BUFF; SI=(BUFF)
LDS r16, mem
;ds、r16←mem中的雙字,
執行后,會更新r16,ds的值。前面兩個字節送到r16,后面兩個字節送到ds
LES r16, mem
;es、r16←mem中的雙字,執行后,會更新r16,ds的值,效果與lds類似
3、標志傳送指令
① 讀標志指令
LAHF ;標志寄存器低字傳送到AH
② 設標志指令
SAHF ; AH的內容送標志寄存器低8位
③ 標志寄存器堆棧指令
PUSHF ;標志寄存器內容(16位)壓棧
④ 標志寄存器出棧指令
POPF ;彈出標志寄存器的內容。
二、 算術運算類指令
概述:算術運算類指令用來執行二進制的算術運算:加減乘除以及BCD碼調整。
這類指令會根據運算結果影響狀態標志,有時要利用某些標志才能得到正確的結果;使用他們時請留心有關狀態標志。
重點掌握
加法指令:ADD、ADC、INC
減法指令:SUB 、SBB、DEC、CMP、NEG
1、 加法和減法指令
加法指令:ADD, ADC和INC
減法指令:SUB, SBB, DEC, NE