133條指令有哪些?
8086指令包含133條基本指令, 一般分為五類來介紹
傳送指令,算術(shù)運算指令,邏輯運算和移位指令,串操作指令,控制轉(zhuǎn)移指令
一、數(shù)據(jù)傳送類指令
數(shù)據(jù)傳送是計算機中最基本、最重要的一種操作,傳送指令也是最常使用的一類指令
傳送指令把數(shù)據(jù)從一個位置傳送到另一個位置
除標志寄存器傳送指令外,均不影響標志位
重點掌握
MOV XCHG PUSH POP XLAT LEA
1、通用數(shù)據(jù)傳送指令
提供方便靈活的通用傳送操作
有3條指令
MOV
XCHG
PUSH POP
① 基本傳送指令MOV(move)
mov cl,4 ;cl←4,字節(jié)傳送
mov DX,0ffh ;dx←00ffh,字傳送
mov si,200h ;si←0200h,字傳送
mov bvar,0ah ;字節(jié)傳送
;假設(shè)bvar是一個字節(jié)變量,定義如下:bvar db 0
mov wvar,0bh ;字傳送
;假設(shè)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,非法指令的主要現(xiàn)象:
兩個操作數(shù)的類型不一致
無法確定是字節(jié)量還是字量操作
兩個操作數(shù)都是存儲器
段寄存器的操作有一些限制
例子:
1、當(dāng)無法通過任一個操作數(shù)確定是操作類型時,需要利用匯編語言的操作符顯式指明
MOV [BX+SI], 255 ;非法指令,修正:
;mov byte ptr [BX+si],255
;byte ptr 說明是字節(jié)操作
;mov word ptr [bx+si],255
;word ptr 說明是字操作
2,8088指令系統(tǒng)除串操作指令外,不允許兩個操作數(shù)都是存儲單元(存儲器操作數(shù))
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] ;非法指令
;指令存在,但不能執(zhí)行
② 交換指令XCHG(exchange)
XCHG reg,reg/mem
;reg ? reg/mem
寄存器與寄存器之間對換數(shù)據(jù)
寄存器與存儲器之間對換數(shù)據(jù)
不能在存儲器與存儲器之間對換數(shù)據(jù)
例子:
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
注意:不能在兩個內(nèi)存單元之間交換
如:XCHG [BX],[SI] 錯誤!
段寄存器中CS、IP不能做操作數(shù)
③ 堆棧操作指令
1.堆棧是一個“后進先出LIFO”(或說“先進后出FILO”)的主存區(qū)域,位于堆棧段中;SS段寄存器記錄其段地址
堆棧只有一個出口,即當(dāng)前棧頂;用堆棧指針寄存器SP指定
2,堆棧只有兩種基本操作:進棧和出棧,對應(yīng)兩條指令PUSH和POP
堆棧由棧底向低地址方向生成
push:進棧指令先使堆棧指針SP減2,然后把一個字操作數(shù)存入堆棧頂部
如:push ax
push [2000h]
出棧指令POP:出棧指令把棧頂?shù)囊粋€字傳送至指定的目的操作數(shù),然后堆棧指針SP加2
如:pop ax
pop wvar
3,堆棧操作的特點
堆棧操作的單位是字,進棧和出棧只對字進行
數(shù)據(jù)從棧頂壓入和彈出時,都是低地址送低字節(jié),高地址送高字節(jié)
堆棧操作遵循先進后出原則,但可用存儲器尋址方式隨機存取堆棧中的數(shù)據(jù)
堆棧段是程序中不可或缺的一個內(nèi)存區(qū),常用來
臨時存放數(shù)據(jù)
傳遞參數(shù)
保存和恢復(fù)寄存器
2、累加器專用傳送指令
① 輸入輸出指令(IN/OUT指令)
格式:IN AL,port;port為直接端口地址
IN AL,DX ;DX的內(nèi)容為端口地址(間接方式)
IN AX,port;
IN AX, DX
OUT port, AL
OUT DX, AL
OUT port, AX
OUT DX, AX
注意:①只能用累加寄存器不能用其它寄存器
②當(dāng)端口地址在00H—FFH之間可以用直接地址
當(dāng)端口地址大于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指定的緩沖區(qū)中、AL指定的位移處的一個字節(jié)數(shù)據(jù)取出賦給AL
XLAT ;al←ds:[bx+al]
換碼指令執(zhí)行前:
在主存建立一個字節(jié)量表格,內(nèi)含要轉(zhuǎn)換成的目的代碼
表格首地址存放于BX,AL存放相對表格首地址的位移量
換碼指令執(zhí)行后:
將AL寄存器的內(nèi)容轉(zhuǎn)換為目標代碼
③址傳送指令 三條LEA 、LDS、LES
將存儲器操作數(shù)的有效地址送至指定的16位通用寄存器
LEA r16, mem
;r16←mem的有效地址EA
例子: 有效地址的獲取
LEA AX, [2375H] ; AX=2375H
LEA SP, [BX+SI] ; SP=(BX)+(SI)
區(qū)別: LEA SI, BUFF; SI=BUFF
MOV SI,BUFF; SI=(BUFF)
LDS r16, mem
;ds、r16←mem中的雙字,
執(zhí)行后,會更新r16,ds的值。前面兩個字節(jié)送到r16,后面兩個字節(jié)送到ds
LES r16, mem
;es、r16←mem中的雙字,執(zhí)行后,會更新r16,ds的值,效果與lds類似
3、標志傳送指令
① 讀標志指令
LAHF ;標志寄存器低字傳送到AH
② 設(shè)標志指令
SAHF ; AH的內(nèi)容送標志寄存器低8位
③ 標志寄存器堆棧指令
PUSHF ;標志寄存器內(nèi)容(16位)壓棧
④ 標志寄存器出棧指令
POPF ;彈出標志寄存器的內(nèi)容。
二、 算術(shù)運算類指令
概述:算術(shù)運算類指令用來執(zhí)行二進制的算術(shù)運算:加減乘除以及BCD碼調(diào)整。
這類指令會根據(jù)運算結(jié)果影響狀態(tài)標志,有時要利用某些標志才能得到正確的結(jié)果;使用他們時請留心有關(guān)狀態(tài)標志。
重點掌握
加法指令:ADD、ADC、INC
減法指令:SUB 、SBB、DEC、CMP、NEG
1、 加法和減法指令
加法指令:ADD, ADC和INC
減法指令:SUB, SBB, DEC, NE