第三周 指令系統(tǒng)概述與數(shù)據(jù)傳送指令
大家好,又是我,沉迷學(xué)習(xí)無(wú)法自拔的小笨蛋康sir。 這個(gè)文集將會(huì)同步更新我觀看吳寧老師的《微機(jī)原理與接口技術(shù)》教學(xué)視頻寫(xiě)的筆記,學(xué)習(xí)筆記,大概每周一章。 有問(wèn)題大家可以在評(píng)論下面留言討論,歡迎糾錯(cuò)! 歡迎收藏閱讀,動(dòng)動(dòng)小手給個(gè)硬幣點(diǎn)個(gè)贊。 ????????????????????????????????????????????????????????????????——@正能量的康sir??
也可移步我的博客(https://blog.csdn.net/qq_33956508)獲得更好的閱讀體驗(yàn)(暫不更新),也會(huì)更新一些其它技術(shù)類(lèi)文章。

第三周 指令系統(tǒng)概述與數(shù)據(jù)傳送指令
8088/8086指令系統(tǒng)主要內(nèi)容:
有關(guān)指令系統(tǒng)的基本概念
對(duì)操作數(shù)的尋址方式
六大類(lèi)指令的操作原理:操作碼的含義、指令對(duì)操作數(shù)的要求、指令執(zhí)行的結(jié)果
第14講 指令系統(tǒng)基本概念
了解:指令及指令系統(tǒng)、指令的格式、指令中的操作數(shù)、指令字長(zhǎng)與機(jī)器字長(zhǎng)
指令與指令系統(tǒng)
指令:控制計(jì)算機(jī)完成某種操作的命令。
一條指令應(yīng)包含的信息:運(yùn)算數(shù)據(jù)的來(lái)源、運(yùn)算結(jié)果的去向、執(zhí)行的操作。
指令系統(tǒng):處理器所能識(shí)別的所有指令的合集
指令的兼容性:同一系列機(jī)的指令是兼容的。
指令格式
操作碼 ?[操作數(shù)],[操作數(shù)]這里的方括號(hào)表示操作數(shù)可選,可以有可以沒(méi)有
操作碼:執(zhí)行何種操作。又叫指令碼
操作數(shù):指令執(zhí)行的對(duì)象。前一個(gè)是目標(biāo)操作數(shù),后面的是源操作數(shù)。參加操作的數(shù)據(jù)或數(shù)據(jù)存放的地址。
指令格式按操作數(shù)數(shù)量劃分可分為四類(lèi):
零操作數(shù)指令:操作碼
單操作數(shù)指令:操作碼 操作數(shù)
雙操作數(shù)指令:操作碼 操作數(shù),操作數(shù)
多操作數(shù)指令:三操作數(shù)及以上
指令中的操作數(shù)
立即數(shù):表征參加操作的數(shù)據(jù)本身
寄存器、存儲(chǔ)器:表征數(shù)據(jù)存放的地址
立即操作數(shù):
立即數(shù)是參加操作的數(shù)據(jù),可以是8位或者16位,只能作為源操作數(shù)。立即數(shù)無(wú)法作為目標(biāo)操作數(shù)。立即數(shù)可以說(shuō)無(wú)符號(hào)數(shù)或帶符號(hào)數(shù),數(shù)值符合其取值范圍。
例:MOV AX,1234H
? MOV BL,22H
寄存器操作數(shù)
參加運(yùn)算的數(shù)存在指令給出的寄存器中,可以是16位或8位。
例:MOV AX,BX
? MOV DL,BX
存儲(chǔ)器操作數(shù)
參加運(yùn)算的數(shù)存放在存儲(chǔ)器的某一個(gè)或某兩個(gè)單元中。
表現(xiàn)形式:[操作數(shù)在內(nèi)存中的偏移地址]
指令的操作數(shù)出現(xiàn)[],表示要尋址的數(shù)在內(nèi)存中。
? 例:
MOV AL,[1200H]
MOV AX,[1200H]

(注意1200H是地址,第一條命令將偏移地址是1200H的內(nèi)容送給AL,第二條因?yàn)锳X是16位,將1200H的內(nèi)容送給AL,將1201H的內(nèi)容送給AH。內(nèi)容是11H,22H所以AX=1122H(是內(nèi)容不是地址了),AH(高八位)和AL(低八位)組成AX)
三種類(lèi)型操作數(shù)的比較
立即數(shù):
由指令直接給出,是常數(shù)性質(zhì)
無(wú)地址含義,只表示運(yùn)算的數(shù)據(jù)。不能作為目標(biāo)操作數(shù)。
寄存器操作數(shù):
表示運(yùn)算的數(shù)據(jù)存放在寄存器中
多數(shù)情況下,寄存器操作數(shù)指通用寄存器
在三類(lèi)操作數(shù)中所需運(yùn)行時(shí)間最短
存儲(chǔ)器操作數(shù):
表示運(yùn)算的數(shù)據(jù)存放在內(nèi)存
指令中“[ ]”里是數(shù)據(jù)所在單元的偏移地址
在三類(lèi)操作數(shù)中所需運(yùn)行時(shí)間最長(zhǎng)
第15講 尋址方式
尋找操作數(shù)所在地址的方法
操作數(shù)在哪里?
目標(biāo)操作數(shù):運(yùn)算結(jié)果的去向,另一個(gè)運(yùn)算數(shù)據(jù)。
源操作數(shù):運(yùn)算數(shù)據(jù)的來(lái)源
尋址方式
操作數(shù)可能的來(lái)源或運(yùn)算結(jié)果可能的去處:
由指令直接給出
寄存器
內(nèi)存單元
尋找操作數(shù)所在地址的方法可以有三種大類(lèi)型
指令直接給出的方式:運(yùn)算對(duì)象由指令直接給出
存放于寄存器中的尋址方式:參加運(yùn)算的數(shù)據(jù)存放在CPU的某個(gè)通用寄存器中
存放于存儲(chǔ)器中的尋址方式
另外,還有隱含給出的方式
1、立即尋址
立即尋址僅適合于源操作數(shù),即源操作數(shù)是參加操作的數(shù)據(jù)本身。這種方式應(yīng)用比較少。
由指令直接給出運(yùn)算的數(shù)據(jù)(操作數(shù)是立即數(shù))。為常數(shù)形式或字符形式。
立即數(shù)只表示運(yùn)算的數(shù)據(jù),無(wú)地址含義;
例:MOV AX,1200H

2、寄存器尋址
參加操作的操作數(shù)在CPU的通用寄存器中
例:MOV AX,BX
AX<——BX
此種尋址方式中的寄存器主要是通用寄存器
不含控制寄存器。段寄存器限制使用。
3、 存儲(chǔ)器操作數(shù)的尋址方式
關(guān)注點(diǎn):
指令操作的對(duì)象在內(nèi)存中,表現(xiàn)形式為:[ ]
指令中給出運(yùn)算對(duì)象在內(nèi)存某個(gè)邏輯段中的偏移地址[偏移地址]
邏輯段的段某地址通過(guò)默認(rèn)或重設(shè)方式給出。
存儲(chǔ)器操作數(shù)的字長(zhǎng)本身不確定,其字長(zhǎng)取決于指令中另一個(gè)寄存器操作數(shù),或通過(guò)其他方式指定字長(zhǎng)。
直接尋址
指令中直接給出操作數(shù)的偏移地址
例:MOV AX,[1200H]

直接尋址方式下,操作數(shù)默認(rèn)為在數(shù)據(jù)段,但允許段重設(shè),即由指令給出所在邏輯段。
例:
MOV AX,ES:[1200H] 這里的“ES:”為段重設(shè)符
寄存器間接尋址
操作數(shù)存放在內(nèi)存中,數(shù)據(jù)在內(nèi)存中的偏移地址為方括號(hào)中通用寄存器的內(nèi)容
僅有4個(gè)通用寄存器可用于存放數(shù)據(jù)的偏移地址。間址寄存器BX,BP,SI,DI。
間接尋址的一般格式[間址寄存器]
例:MOV BX,1200H
MOV AX,[BX]

由寄存器間接給出操作數(shù)的偏移地址
存放偏移地址的寄存器(“方括號(hào)中能出現(xiàn)的寄存器”)稱為間址寄存器——>BX,BP,SI,DI
操作數(shù)的段地址(數(shù)據(jù)處于哪個(gè)段)取決于選擇哪一個(gè)間接寄存器:
BX,SI,DI默認(rèn)在數(shù)據(jù)段, BP默認(rèn)在堆棧段
可以段重設(shè)
寄存器相對(duì)尋址
操作數(shù)的偏移地址為寄存器的內(nèi)容加上一個(gè)位移量。
如:MOV AX,[BX+DATA]段地址由所選間址寄存器決定,DATA是任意8bit或16bit常數(shù)。
例: MOV AX,2000H
MOV DS,AX
MOV BX,1200H
MOV AL,[BX]5相當(dāng)于[BX+5],也可以寫(xiě)成5[BX]

相對(duì)尋址主要用于一維數(shù)組的操作
常將位移量作為“表頭”地址,間址寄存器的值作為表內(nèi)相對(duì)地址
基址、變址尋址
操作數(shù)的偏移地址為 一個(gè)基址寄存器(BX、BP)的內(nèi)容+一個(gè)變址寄存器(SI、DI)的內(nèi)容
操作數(shù)的段地址由選擇的基址寄存器決定:
基址寄存器為BX,默認(rèn)在數(shù)據(jù)段
基址寄存器為BP,默認(rèn)在堆棧段
基址變址尋址方式與相對(duì)尋址方式一樣,主要用于一維數(shù)組操作。
例:
執(zhí)行下列指令:
MOV SI,1100H
MOV BX,SI
MOV AX,[SI+BX]也可表示為[BX][SI]

(5)基址、變址、相對(duì)尋址
操作數(shù)的偏移地址為:基址寄存器內(nèi)容+變址寄存器內(nèi)容+位移量
操作數(shù)的段地址由選擇的基址寄存器決定。
基址變址相對(duì)尋址方式主要用于二維表格操作。
例: 執(zhí)行以下程序段:
MOV DI,1100H
MOV BP,DI
MOV AL,[BP][DI]5也可表示為[BP+DI+5]
基址寄存器選擇BP表示操作數(shù)在堆棧段

4、隱含尋址
指令中隱含了一個(gè)或兩個(gè)操作數(shù)的地址,即操作數(shù)在默認(rèn)的地址中。
例:
MUL BL MUL表示乘法。只給出BL,被乘數(shù)默認(rèn)為AL,乘積默認(rèn)為AX
指令執(zhí)行:
ALxBL——AX
小結(jié)
尋址方式表示指令運(yùn)算對(duì)象的來(lái)源和運(yùn)算結(jié)果的去向
注意點(diǎn):
立即尋址僅針對(duì)源操作數(shù)
寄存器尋址表示指令運(yùn)算的數(shù)據(jù)在寄存器中(常為通用寄存器)
存儲(chǔ)器尋址表示指令運(yùn)算的對(duì)象在內(nèi)存中
數(shù)據(jù)在內(nèi)存中的偏移地址在[ ]中,段地址可以默認(rèn)或重設(shè)
存儲(chǔ)器尋址和寄存器尋址均可用于源或目標(biāo)操作數(shù)
深入理解了尋址方式,才能理解指令的執(zhí)行結(jié)果
尋址方式練習(xí)
設(shè)DS=6000H,ES=2000H,SS=1500H,SI=00A0H,BX=0800H,BP=1200H,字符常數(shù)VAR為0050H。說(shuō)明以下各條指令源操作數(shù)的尋址方式及存儲(chǔ)器操作數(shù)的物理地址。
MOV AX,BX 寄存器尋址
MOV DL,80H 立即尋址
MOV AX,VAR[BX][SI] 基址變址相對(duì)尋址 物理地址:608F0H
MOV AL,’B’ 立即尋址
MOV DI,ES:[BX] 寄存器間接尋址,物理地址:20800H
MOV DX,[BP] 寄存器間接尋址,物理地址:16200H
MOV BX,20H[BX] 寄存器相對(duì)尋址,物理地址:60820H
第16講 通用數(shù)據(jù)傳送指令
8086指令系統(tǒng)

從功能上包括六大類(lèi):數(shù)據(jù)傳送、算術(shù)運(yùn)算、邏輯運(yùn)算和移位、串操作、程序控制、處理器控制
掌握:指令碼的含義、指令對(duì)操作數(shù)的要求、指令的對(duì)標(biāo)志位的影響、指令的功能
數(shù)據(jù)傳送指令包括:通用數(shù)據(jù)傳送指令、輸入輸出指令 、地址傳送指令、標(biāo)志傳送指令。
除標(biāo)志傳送指令外,其它指令的執(zhí)行對(duì)標(biāo)志位不產(chǎn)生影響
一、通用數(shù)據(jù)傳送指令
通用數(shù)據(jù)傳送指令又可分為:一般數(shù)據(jù)傳送指令、堆棧操作指令、交換指令、查表轉(zhuǎn)換指令、字位擴(kuò)展指令
注意該類(lèi)所有指令的執(zhí)行均不影響標(biāo)志位。
一般數(shù)據(jù)傳送指令
MOV
格式:MOV dest,src
操作:src——> dest
例:MOV AL,BL
注意點(diǎn):
兩操作數(shù)字長(zhǎng)必須相同;
兩操作數(shù)不允許同時(shí)為存儲(chǔ)器操作數(shù);
兩操作數(shù)不允許同時(shí)為段寄存器;
在源操作數(shù)時(shí)立即數(shù)時(shí),目標(biāo)操作數(shù)不能是段寄存器;
IP和CS不作為目標(biāo)操作數(shù),F(xiàn)LAGS一般也不作為操作數(shù)在指令中出現(xiàn)。
判斷下列指令的正確性:
MOV AL,BX 錯(cuò),兩操作數(shù)字長(zhǎng)不想等
MOV AX,[SI]05H 對(duì),源操作數(shù)為相對(duì)尋址
MOV [BX][BP],BX 錯(cuò),目標(biāo)操作數(shù)尋址方式錯(cuò)誤,BX、BP都是基址寄存器
MOV DS,1000H 錯(cuò),不能用立即尋址方式為段寄存器賦值
MOV DX,09H 對(duì)
MOV [1200],[SI] 錯(cuò),兩操作數(shù)不能同時(shí)為存儲(chǔ)器操作數(shù)
一般數(shù)據(jù)傳送指令應(yīng)用例
將(*)的ASCII碼2AH送入內(nèi)存數(shù)據(jù)段1000H開(kāi)始的100個(gè)單元。
題目分析:
確定首地址
確定數(shù)據(jù)長(zhǎng)度
寫(xiě)一次數(shù)據(jù)
修改單元地址
修改長(zhǎng)度值
判斷寫(xiě)完否?
未完繼續(xù)寫(xiě)入,否則結(jié)束

程序段:
MOV DI,1000H
MOV CX,64H ;即100次
MOV AL,2AH ;這里也可以寫(xiě)作MOV AL,’*’用單引號(hào)把字符包起來(lái)
AGAIN:MOV [DI],AL ;AGAIN只是一個(gè)標(biāo)號(hào)
INC DI ;DI+1
DEC CX ;CX-1
JNZ AGAIN ;CX≠0則繼續(xù)。JNZ(jmp not zero) 如果CX不為0則跳轉(zhuǎn),跳轉(zhuǎn)到AGAIN
HLT ;暫停指令
(分號(hào)+文字,是注釋的寫(xiě)法)
上段程序在代碼段中的存放形式

在數(shù)據(jù)段中的分布

堆棧操作指令
堆棧操作的原則:
先進(jìn)后出
以字為單位
(16位的系統(tǒng)中一個(gè)字的長(zhǎng)度是 2 字節(jié),也就是?16 位。所以堆棧指令一定是16位的操作數(shù))
堆棧操作指令:
壓棧指令 格式 PUSH OPRD
出棧指令 格式 POP OPRD
(OPRD代表16位寄存器或存儲(chǔ)器兩單元)
壓棧指令PUSH
指令執(zhí)行過(guò)程
SP-2——>SP
操作數(shù)高字節(jié)——>SP+1
操作數(shù)低字節(jié)——>SP

壓棧指令的操作
設(shè)AX=1234H,SP=1200H
執(zhí)行PUSH AX指令后堆棧區(qū)的狀態(tài):

出棧指令的操作
執(zhí)行POP AX

堆棧操作指令說(shuō)明
指令的操作數(shù)必須是16位
操作數(shù)可以是寄存器或存儲(chǔ)器兩單元,但不能是立即數(shù);(約定單操作數(shù)格式指令聲明字長(zhǎng))
不能從棧頂彈出一個(gè)字給CS;
PUSH和POP指令在程序中一般成對(duì)出現(xiàn);
PUSH指令的操作方向是從高地址向低地址,而POP指令的操作正好相反
堆棧操作指令例
MOV AX,1234H
MOV SP,AX
MOV BX,5678H
MOV [BX],AH
MOV [BX+1],BL
PUSH AX
PUSH BX
PUSH WORD PTR[BX]
…
POP WORD PTR[BX]
POP AX
POP BX ;和上一句一起,使AX和BX的內(nèi)容互換

交換指令
格式: XCHG REG,MEM/REG
注:兩操作數(shù)必須有一個(gè)是寄存器(通用寄存器或存儲(chǔ)器)操作數(shù)(不用區(qū)分源和目的)
不允許使用段寄存器
例:XCHG AX,BX
XCHG [2000],CL
查表指令
格式:XLAT
說(shuō)明:用BX的內(nèi)容代表表格首地址,AL內(nèi)容為表內(nèi)位移量,BX+AL得到要查找元素的偏移地址
操作:將BX+AL所指單元的內(nèi)容送AL
字位擴(kuò)展指令
將符號(hào)數(shù)的符號(hào)位擴(kuò)展到高位
指令為零操作數(shù)指令,采用隱含尋址,隱含的操作數(shù)為AL及AX,DX
無(wú)符號(hào)數(shù)的擴(kuò)展規(guī)則為在高位補(bǔ)0.
(1)字節(jié)到字的擴(kuò)展指令
格式:CBW
操作:將AL內(nèi)容擴(kuò)展到AX
規(guī)則:
若最高位=1,則執(zhí)行后AH=FFH
若最高位=0,則執(zhí)行后AH=00H
(2)字到雙字的擴(kuò)展指令
格式:CWD
操作:將AX內(nèi)容擴(kuò)展到DX AX
規(guī)則:
若最高位=1,則執(zhí)行后DX=FFFFH
若最高位=0,則執(zhí)行后DX=0000H
第17講 地址傳送指令和標(biāo)志傳送指令
三、地址傳送指令分三小類(lèi)
地址傳送指令分三小類(lèi):
取偏移地址指令LEA——>取近地址指針(取當(dāng)前數(shù)據(jù)段某個(gè)區(qū)域的單元地址)
*LDS指令
*LES指令 后面這兩個(gè)指令用來(lái)取遠(yuǎn)地址指針(在另外一個(gè)數(shù)據(jù)段或附加段中取)
LEA指令
操作:將變量的16位偏移地址寫(xiě)入到目標(biāo)寄存器。(“變量”指內(nèi)存單元的符號(hào)地址。屬于存儲(chǔ)器操作數(shù))
當(dāng)程序中用符號(hào)表示內(nèi)存偏移地址時(shí),須使用該指令。
格式:LEA REG,MEM (MEM是存儲(chǔ)操作數(shù))
指令要求:源操作數(shù)必須是一個(gè)存儲(chǔ)器操作數(shù),目標(biāo)操作數(shù)通常是間址寄存器。
LEA指令與MOV指令執(zhí)行結(jié)果對(duì)比
例一:
(1)MOV指令:MOV AL,i
結(jié)果:AL=4
MOV指令讀取指定內(nèi)存單元的內(nèi)容源操作數(shù)為直接尋址方式
(2)LEA指令:LEA BX,I
結(jié)果:BX=i
LEA指令讀取指定內(nèi)存單元的偏移地址(獲得i值本身)

(i是之前聲明過(guò)的一個(gè)變量)
例二:
比較下列指令:
MOV SI,DATA1 ;DATA1是符號(hào)地址
結(jié)果SI=1234H
LEA SI,DATA1
結(jié)果SI=DATA1
MOV BX,1100H
MOV AX,[BX] ;結(jié)果AX=7788H
LEA BX,[BX] ;結(jié)果BX=1100H

LEA指令在程序中的應(yīng)用
將數(shù)據(jù)段中首地址為MEM1 的50個(gè)字節(jié)的數(shù)據(jù)傳送到同一邏輯段首地址為MEM2的區(qū)域存放。編寫(xiě)相應(yīng)的程序段。

程序:
LEA SI,MEM1
LEA DI,MEM2
MOV CL,50
NEXT:MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
DEC CL
JNZ NEXT ;CL≠0則轉(zhuǎn)NEXT
HLT

2. LDS、LES指令
LDS和LES均用于將一個(gè)32位的遠(yuǎn)地址指針寫(xiě)入到目標(biāo)寄存器。
LDS(Load pointer using DS)的一般格式:LDS 通用寄存器,存儲(chǔ)器操作數(shù)
(存儲(chǔ)器操作數(shù):將源操作數(shù)的偏移地址送目標(biāo)寄存器,將源操作數(shù)的段地址送DS.)
LES(Load pointer using ES)的一般格式:LES 通用寄存器,存儲(chǔ)器操作數(shù)
(存儲(chǔ)器操作數(shù):將源操作數(shù)的偏移地址送目標(biāo)寄存器, 將源操作數(shù)的段地址送ES)
標(biāo)志傳送指令
標(biāo)志傳送指令
LAHF(Load AH from Flags)隱含操作數(shù)AH
SAHF(Store AH into Flags)隱含操作數(shù)AH
PUSHF(Push flags onto stack)隱含操作數(shù)FLAGS
POPF(Pop flags off stack)隱含操作數(shù)FLAGS
LAHF,SAHF
指令格式:LAHF
操作:將FLAGS的低8位裝入AH

16位的FLAGS中7位空閑,9位有效。9位中低8位里的5個(gè)標(biāo)志位狀態(tài)同時(shí)傳給AH
SAHF反之,即從AH傳回FLAGS.
第18講 輸入輸出指令
輸入輸出指令
掌握:
指令的格式及操作
指令的兩種尋址方式
指令對(duì)操作數(shù)的要求
關(guān)于I/O端口
I/O端口:I/O接口中用于存儲(chǔ)數(shù)據(jù)、可以直接被CPU訪問(wèn)的寄存器
計(jì)算機(jī)輸入輸出系統(tǒng)中可以包含若干接口控制電路(芯片),每個(gè)接口中都包含了1個(gè)或多個(gè)端口。

輸入輸出指令
專門(mén)面向I/O端口操作的指令
端口地址在指令中的表示方式——尋址方式
指令功能:從端口地址讀入數(shù)據(jù)到累加器/將累加器的值輸出到端口中
指令格式:
輸入指令:IN acc,PORT ;(PORT表示端口地址)
輸出指令:OUT PORT,acc;(acc是AL或AX,不能是AH)
指令尋址方式
根據(jù)端口地址碼的長(zhǎng)度,指令具有兩種不同的端口地址表現(xiàn)形式。
直接尋址: 端口地址為8位時(shí),指令中直接給出8位端口地址;尋址256個(gè)端口。
間接尋址:端口地址為16位時(shí),指令中的端口地址必須由DX指定;可尋址64K個(gè)端口。
I/O指令例
IN AX,80H——>從80H端口讀入16bit數(shù)據(jù)到AX
MOV DX,2400H
IN AL,DX——>從2400H端口讀入8bit數(shù)據(jù)到AL
OUT 35H,AX——>將AX的值寫(xiě)入到35H端口中
OUT AX,35H——>錯(cuò),格式錯(cuò)誤
小結(jié)
例:
MOV SI,100
MOV DX,03F8H
IN AL,DX
如果AL的最高位=0,則轉(zhuǎn)向③,否則繼續(xù)下一步
MOV AX,[SI]
OUT 58H,AX
程序功能:
彈幕的答案
監(jiān)聽(tīng)03F8H端口,如果最高位為1,就把數(shù)據(jù)段中偏移地址為100的內(nèi)容輸出到58H端口
本章命令總結(jié):MOV、堆棧操作PUSH\POP、取偏移地址LEA、 輸入輸出IN\OUT這幾個(gè)用的多,查表、交換、LDS\LES、SAHF\LAHF用的少。