數(shù)據(jù)尋址方式
一菩貌、立即數(shù)尋址
MOV AX,0102H; 指令代碼:B8 02 01
注意:按照低對(duì)低、高對(duì)高的小端存儲(chǔ)原則欺缘,低字節(jié)放在低地址單元
所以指令代碼中是 B8 02 01栋豫,而不是 B8 01 02
速度最快
二、寄存器尋址方式
8位寄存器r8⊙枋狻:AH/AL丧鸯、BH/BL、CH/CL嫩絮、DH/DL
16位寄存器r16:AX丛肢、BX、CX剿干、DX蜂怎、SI、DI置尔、BP杠步、SP
段寄存器seg :CS榜轿、DS幽歼、SS、ES
(即除了IP和FLAGS)
三谬盐、存儲(chǔ)器尋址方式
- 默認(rèn)段寄存器
寄存器尋址主存 | 默認(rèn)段寄存器 |
---|---|
BP寄存器 | SS堆棧段寄存器 |
其他寄存器 | DS數(shù)據(jù)段寄存器 |
- 尋址方式
尋址方式 | 示例 | 源操作數(shù)語法 |
---|---|---|
直接尋址 | MOV AX,[2000H] MOV AX,WVAR |
[數(shù)值] 直接引用變量名 |
寄存器間接尋址 | MOV AX,[BX] 效果:AX←DS:[BX] |
基址寄存器BX甸私、BP 變址寄存器SI、DI |
寄存器相對(duì)尋址 | MOV AX,[BX+06H] MOV AX,[BX+WVAR] MOV AX,WVAR[BX] |
基址寄存器BX飞傀、BP 或 變址寄存器SI皇型、DI 加上 8位或16位位移量 |
基址變址尋址 | MOV AX,[BX+SI] MOV AX,[BX][SI] |
基址寄存器BX诬烹、BP 加上 變址寄存器SI、DI |
相對(duì)基址變址尋址 | MOV AX,[BX+SI-06H] MOV AX,[BX+SI+WVAR] |
基址寄存器BX弃鸦、BP 加上 變址寄存器SI绞吁、DI 加上 8位或16位位移量 |
MOV AX,[WVAR]為直接尋址,假如WVAR的偏移地址為0010H寡键,則該指令等同于MOV AX,[0010H]掀泳,也等同于MOV AX,WVAR
BX 使用寄存器BX上的數(shù)據(jù)
[BX] 用寄存器BX的數(shù)據(jù)作為地址,使用該地址上的數(shù)據(jù)
[2000H] 使用2000H作為地址西轩,使用該地址上的數(shù)據(jù)
MOV AX,[BX+WVAR] 等效于 MOV AX,WVAR[BX]
MOV AX,[BX+SI] 等效于 MOV AX,[BX][SI]
MOV AX,[BX+SI+WVAR] 等效于 MOV AX,WVAR[BX+SI] 等效于 MOV AX,WVAR[BX][SI]
- 物理地址
物理地址用邏輯地址來表示员舵,邏輯地址等于:段寄存器內(nèi)的數(shù)據(jù) × 16 + 源操作數(shù)表達(dá)的地址
即 段地址左移4位 + 偏移地址
EA針對(duì)的是帶有 [ ] 的尋址方式(即存儲(chǔ)器尋址)
基本指令
一、前置知識(shí)
- 操作數(shù)的表達(dá)符號(hào)
尋址方式 | 操作數(shù)符號(hào)及含義 |
---|---|
立即數(shù) | imm:i8或i16 i8∨号稀:8位立即數(shù) i16??:16位立即數(shù) |
寄存器尋址 | reg:r8或r16 r8??:8位通用寄存器 r16:16位通用寄存器 seg:段寄存器 |
存儲(chǔ)器尋址 | men:m8或m16 m8 ?:8位存儲(chǔ)器操作數(shù) m16:16位存儲(chǔ)器操作數(shù) |
- 十六進(jìn)制表達(dá)的數(shù)值马僻,若以A-F開頭,則要加前導(dǎo)0注服,否則會(huì)被識(shí)別為變量名韭邓。
- 目的操作數(shù)和源操作數(shù)的類型要一致(同為字or同為字節(jié))
非法指令:
MOV AL,300 300D=12CH超過8位二進(jìn)制
MOV AL,050AH AL為字節(jié),050AH為字
MOV [AX],050AH 只知道目的操作數(shù)起始地址溶弟,不知道是字節(jié)還是字
MOV [SP],AX SP為堆棧指針女淑,不能間接尋址
合法指令:
MOV AX,05H 05H會(huì)根據(jù)AX自動(dòng)調(diào)整為字0005H
MOV AX,300 300D=12CH沒有超過16位二進(jìn)制 -
立即數(shù)傳給存儲(chǔ)單元時(shí),指令中的立即數(shù)可以理解為字or字節(jié)辜御,如果不顯式(byte指示字節(jié)鸭你,word指示字)指出則為非法指令。
非法指令:
MOV [BX+SI],255;
MOV [BX+SI],0002H;
合法指令:
mov byte ptr [bx+si],255; - 除串操作類指令外擒权,其余操作不可直接實(shí)現(xiàn)men到men
- 不可直接實(shí)現(xiàn)seg到seg袱巨,eg:MOV DS,ES;
不允許立即數(shù)到seg,eg:MOV DS,100H
不應(yīng)該直接改變CS(代碼寄存器)碳抄,eg:MOV CS,[SI]愉老,還有IP、FLAGS - 不能給立即數(shù)賦值剖效,eg:MOV DATA,2000H
- 定義字變量WVAR嫉入,WVAR+1表示字變量WVAR的高字節(jié)(從WVAR的起始地址+一個(gè)字節(jié))
但是以下指令為非法指令:
mov al,WVAR[0]
盡管WVAR[0]只是表示字節(jié),字節(jié)傳給8位寄存器仍舊非法璧尸,應(yīng)該將WVAR[0]聲明為字節(jié)劝贸,以下指令為合法指令:
mov al,byte ptr WVAR[0] - 寄存器的數(shù)值減1后再賦給另一個(gè)寄存器
非法指令:
mov cx,ax-1
合法指令:
dec ax
mov cx,ax
二、數(shù)據(jù)傳送類指令
指令 | 基本格式 | 功能 | 其他 |
---|---|---|---|
傳送指令 | MOV reg/men,imm MOV reg/men/seg,reg MOV reg/seg,men MOV reg/men,seg |
把一個(gè)字節(jié)或字的操作 數(shù)從源地址傳送到目的 地址 |
僅復(fù)制 源操作數(shù)不變 不改變標(biāo)志位 |
交換指令 | XCHG reg,men XCHG reg/men,reg |
源操作數(shù)和目的操作數(shù) 數(shù)據(jù)交換(字或字節(jié)) |
|
換碼指令 | XLAT |
AL ← [BX+AL] BX指向的內(nèi)容加AL 指向的內(nèi)容作為新地址 新地址指向的內(nèi)容賦值 給AL |
|
堆棧操作 指令 |
PUSH r16/m16/seg |
先 SP ← SP-2 后 SS:[SP]←r16/m16/seg |
堆棧操作的對(duì)象只能 是字逗宁,有2個(gè)字節(jié), 所以是SP-2 |
POP r16/m16/seg |
先 r16/m16/seg←SS:[SP] 后 SP ← SP+2 |
棧頂指針SP初始時(shí) 不是指向SS梦湘,而是 指向椣箍牛空間另一端 |
|
標(biāo)志操作 指令 |
CLC | CF←0 | |
STC | CF←1 | ||
CMC | CF←~CF | ||
CLD | DF←0 | 串操作后地址增大 | |
STD | DF←1 | 串操作后地址減小 | |
CLI | IF←0 | ||
STI | IF←1 | ||
地址傳送 指令 |
LEA r16,mem | 將存儲(chǔ)器操作數(shù)的有效 地址(段內(nèi)偏移地址) 傳送到16位通用寄存器 |
不是將men的內(nèi)容作為 地址并將該地址的數(shù)據(jù) 傳給r16,而是直接把這 個(gè)地址賦值給r16 |
seg一般只出現(xiàn)在MOV 件甥、PUSH、POP
操作符OFFSET哼拔,可以在匯編過程中獲得變量的偏移地址
三引有、算術(shù)運(yùn)算類指令
指令 | 基本格式 | 功能 | 對(duì)標(biāo)志位 的影響 |
其他 |
---|---|---|---|---|
加和減 指令 |
ADD dest,src | dest←dest + src | 全部 | |
SUB dest,src | dest←dest - src | 全部 | ||
帶進(jìn)位 加和減 指令 |
ADC dest,src | dest←dest+src+CF | 全部 | 對(duì)寄存器DX.AX 中較高位寄存器 DX進(jìn)行操作, 相當(dāng)于低位寄存 器AX倦逐,進(jìn)行了 進(jìn)位 |
SBB dest,src | dest←dest-src-CF | 全部 | 類似于ADC譬正,只 是進(jìn)行了借位 |
|
比較指令 | CMP dest,src | dest - src | 全部 | 結(jié)果不送回目的 操作數(shù)通過該指 令影響標(biāo)志位 |
增量指令 | INC reg/men | 自增 | 不影響CF | 非法指令 INC [0002H] 不知道是對(duì)字還 是字節(jié)進(jìn)行操作 |
減量指令 | DEC reg/men | 自減 | 不影響CF | |
求補(bǔ)指令 | NEG reg/men | reg/men←0-reg/men | 全部 | |
符號(hào)擴(kuò)展 指令 |
CBW | 字節(jié)轉(zhuǎn)為字 AL→AX 只是位數(shù)變多了 不改變數(shù)值大小 |
不影響 | AL為1xxx xxxx, 改變后為AX 1111 1111 1xxx xxxx,(AL最 高位為1則全1檬姥, 為0則全0) |
CWD | 字轉(zhuǎn)為雙字 AX→DX.AX |
不影響 | CBW和CWD只 針對(duì)有符號(hào)數(shù)曾我, 無符號(hào)數(shù)直接 高位清0 |
|
乘法指令 | MUL reg/men |
AX←AL×r8/m8 DX.AX←AX×r16/m16 |
如果乘積的 高一半是 低一半的 符號(hào)擴(kuò)展 則OF=CF=0 否則均為1 (即高一半 含有效值) 其他標(biāo)志位 無定義, 取值隨機(jī) |
無符號(hào)乘法健民, 加減指令利用 CF抒巢、OF區(qū)分 有無符號(hào) |
IMUL reg/men |
AX←AL×r8/m8 DX.AX←AX×r16/m16 |
同MUL | 有符號(hào)乘法 | |
除法指令 | DIV reg/men |
AL←AX÷r8/m8的商 AH←AX÷r8/m8的余數(shù) AX←DX.AX÷r16/m16 的商 DX←DX.AX÷r16/m16 的余數(shù) |
狀態(tài)標(biāo)志位 沒有定義, 但可能產(chǎn)生 溢出秉犹,此時(shí) CPU產(chǎn)生 編號(hào)為0 的內(nèi)部中斷 |
|
IDIV reg/men |
AL←AX÷r8/m8的商 AH←AX÷r8/m8的余數(shù) AX←DX.AX÷r16/m16 的商 DX←DX.AX÷r16/m16 的余數(shù) |
同DIV | 余數(shù)和被除數(shù) 符號(hào)相同 |
- 溢出(OF)不是最高位有進(jìn)位(CF)蛉谜,而是正數(shù)相加變負(fù)數(shù),負(fù)數(shù)相加變正數(shù)(補(bǔ)碼形式崇堵,最高位(符號(hào)位)變化)
- 十進(jìn)制數(shù)64型诚,壓縮BCD碼為64H,非壓縮BCD碼為0604H
- DAA和DAS分別實(shí)現(xiàn)加法和減法的壓縮BCD碼調(diào)整
AAA鸳劳、AAS狰贯、AAM和AAD分別實(shí)現(xiàn)加減乘除法的非壓縮BCD碼調(diào)整
四、位操作類指令
指令 | 基本格式 | 功能 | 對(duì)標(biāo)志位的影響 | 其他 |
---|---|---|---|---|
邏輯運(yùn)算 指令 |
AND dest,src | dest←dest ^ src |
CF=OF=0 影響SF棍辕、ZF暮现、PF AF未定義 |
|
OR dest,src | 或 | 跟“與”一樣 | ||
XOR dest,src | 異或,同為0楚昭, 異為1 |
跟“與”一樣 | ||
TEST dest,src | 跟“與”一樣 結(jié)果不返回 |
跟“與”一樣 | 只用來影響 標(biāo)志位 |
|
NOT reg/men | 非 | 不影響標(biāo)志位 | ||
移位指令 | SHL reg/men,1/CL | 邏輯左移 reg/men左移 1/CL位 最低位補(bǔ)0 最高位進(jìn)入CF |
用最后移入CF的位 設(shè)置進(jìn)位標(biāo)志CF 最高位操作數(shù)改變 則OF=1栖袋,否則為0 若移位次數(shù) >1 則OF不確定 |
移位位數(shù) 大于1時(shí) 只能用 寄存器CL 來表示 移位數(shù) |
SHR reg/men,1/CL | 邏輯右移 reg/men右移 1/CL位 最高位補(bǔ)0 最低位進(jìn)入CF |
和SHL一樣 | ||
SAL reg/men,1/CL | 算術(shù)左移 和SHL一樣 |
和SHL一樣 | 左移相當(dāng)于 ?2 |
|
SAR reg/men,1/CL | 算術(shù)右移 reg/men右移 1/CL位 最高位不變 最低位進(jìn)入CF |
和SHL一樣 | ||
循環(huán)移位 指令 |
ROL reg/men,1/CL | 不帶進(jìn)位 循環(huán)左移 移出的位補(bǔ)到 末位 |
移出的位給CF OF和SHL一樣 |
書P39 示意圖 |
ROR reg/men,1/CL | 不帶進(jìn)位 循環(huán)右移 移出的位補(bǔ)到 首位 |
和ROL一樣 | ||
RCL reg/men,1/CL |
帶進(jìn)位 循環(huán)左移 移出的位給到 CF CF給到末位 |
和ROL一樣 | ||
RCR reg/men,1/CL |
帶進(jìn)位 循環(huán)右移 移出的位給到 CF CF給到首位 |
和ROL一樣 |
五、控制轉(zhuǎn)移類指令
- 目的地指令所在的存儲(chǔ)器地址稱為目的地址抚太、目標(biāo)地址或轉(zhuǎn)移地址
- 代碼段寄存器CS指定段地址塘幅,指令指針I(yè)P指定偏移地址
- 表達(dá)相對(duì)尋址和直接尋址時(shí),采用目的地址的標(biāo)號(hào)label
表達(dá)間接尋址時(shí)尿贫,采用寄存器名和存儲(chǔ)器操作數(shù) - 段內(nèi)轉(zhuǎn)移(近轉(zhuǎn)移):不改變CS电媳,只改變IP偏移地址;其中位移量可以用一個(gè)字節(jié)表達(dá)的稱為“短轉(zhuǎn)移”
段間轉(zhuǎn)移(遠(yuǎn)轉(zhuǎn)移):需要改變CS段地址和IP偏移地址
指令 | 基本格式 | 功能 | 其他 |
---|---|---|---|
無條件 轉(zhuǎn)移指令 |
JMP label | IP←IP+距離 標(biāo)號(hào)處的位移量 |
跳到標(biāo)號(hào)處開始執(zhí)行指令 |
JMP r16/m16 | IP←r16/m16 | ||
JMP far ptr label | IP←標(biāo)號(hào)的偏移地址 CS←標(biāo)號(hào)的段地址 |
跳到標(biāo)號(hào)處開始執(zhí)行指令 | |
JMP far ptr men | IP←[men] CS←[men+2] |
主存中連續(xù)的兩個(gè)字單元 低字送IP庆亡,高字送CS |
|
條件轉(zhuǎn)移 指令 |
JCC label | 單個(gè)標(biāo)志位的 狀態(tài)判斷 如果條件滿足 則轉(zhuǎn)移去label執(zhí)行 IP ← IP+8位位移量 |
8位位移量 只能實(shí)現(xiàn)-128~+127個(gè) 單元范圍的跳轉(zhuǎn) 條件CC見書本P42 轉(zhuǎn)移指令前匾乓,常有CMP、 TEST又谋、加減運(yùn)算拼缝、 邏輯運(yùn)算 |
比較數(shù)據(jù)大小 利用標(biāo)志位CF娱局、ZF 或OF、SF咧七、ZF 確定高低衰齐、是否相等 |
無符號(hào)數(shù)用高(Above) 低(Below) 有符號(hào)數(shù)用大(Greater) 小(Less) N表示不,E表示相等 具體見書P44 |
||
循環(huán)指令 | LOOP label | CX←CX-1 CX≠0继阻,轉(zhuǎn)移 |
短轉(zhuǎn)移尋址方式 (段內(nèi)-128~+127) 循環(huán)指令不影響標(biāo)志 |
LOOPE label | CX←CX-1 CX≠0且ZF=1耻涛,轉(zhuǎn)移 |
||
LOOPNE label | CX←CX-1 CX≠0且ZF=0,轉(zhuǎn)移 |
||
JCXZ label | CX=0瘟檩,轉(zhuǎn)移 | ||
子程序 調(diào)用指令 |
CALL label | 相對(duì)尋址的段內(nèi)調(diào)用 | IP入棧:SP←SP-2 SS[SP]←IP 實(shí)現(xiàn)轉(zhuǎn)移:IP←IP+16位位移量 |
CALL r16/m16 | 間接尋址的段內(nèi)調(diào)用 | IP入棧:SP←SP-2 SS[SP]←IP 實(shí)現(xiàn)轉(zhuǎn)移:IP←r16/m16 |
|
CALL far ptr label | 直接尋址的段間調(diào)用 |
CS入棧:SP←SP-2 SS[SP]←CS IP入棧:SP←SP-2 SS[SP]←IP 實(shí)現(xiàn)轉(zhuǎn)移:IP←label偏移地址 CS←label段地址 |
|
CALL far ptr men | 間接尋址的段間調(diào)用 |
CS入棧:SP←SP-2 SS[SP]←CS IP入棧:SP←SP-2 SS[SP]←IP 實(shí)現(xiàn)轉(zhuǎn)移:IP←[men] CS←[men+2] |
|
子程序 返回指令 |
RET | 無參返回 | 彈出IP:IP←SS:[SP] SP←SP+2 段間返回則還要彈出CS: CS←SS[SP],SP←SP+2 |
RET i16 | 帶參返回 | 彈出IP:IP←SS:[SP] SP←SP+2 段間返回則還要彈出CS: CS←SS[SP],SP←SP+2 調(diào)整指針:SP←SP+i16 調(diào)整指針可以廢除若干 執(zhí)行CALL指令之前入棧 的參數(shù) |
|
中斷指令 | INT i8 | 中斷調(diào)用指令 產(chǎn)生i8號(hào)中斷 |
|
IRENT | 中斷返回指令 | ||
INTO | 溢出中斷指令 若溢出標(biāo)志OF=1 則產(chǎn)生4號(hào)中斷 否則順序執(zhí)行 |
中斷指令和系統(tǒng)功能調(diào)用:
- A產(chǎn)生“中斷”抹缕,在A的“斷點(diǎn)”處處理“中斷服務(wù)程序”
- 中斷服務(wù)程序本身可以安排在主存的任何位置,但起始地址則按向量號(hào)順序存放在最低000H~3FFH的1KB物理存儲(chǔ)器中
- ROM-BIOS和DOS功能調(diào)用方法:
1)在AH寄存器中設(shè)置系統(tǒng)功能調(diào)用號(hào)(即中斷服務(wù)程序的哪個(gè)子功能)
2)在指定寄存器中設(shè)置入口參數(shù)
3)用中斷調(diào)用指令(INT i8)執(zhí)行功能調(diào)用
4)根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況 - DOS常用輸入輸出功能調(diào)用
子功能號(hào) | 功能 | 入口參數(shù) | 出口參數(shù) |
---|---|---|---|
AH=01H | 輸入一個(gè)字符 | AL=輸入字符的ASCII碼 | |
AH=02H | 輸出一個(gè)字符 | DL=欲顯示字符的ASCII碼 | |
AH=09H | 輸出一個(gè)字符串 |
DS:DX=欲顯示的字符串 在內(nèi)存中的首地址 |
|
AH=0AH | 輸入一個(gè)字符串 |
DS:DX=輸入字符串 將在內(nèi)存緩沖區(qū)的首地址 |
|
AH=0BH | 判斷是否有輸入 |
AL=0芒帕,沒有輸入 AL=FFH歉嗓,已有輸入 |
- AH=09H號(hào)功能的調(diào)用,要求字符串必須以字符“$”(ASCII碼為24H)結(jié)束
- AH=0AH號(hào)功能的調(diào)用背蟆,要求
第一個(gè)字節(jié)填入最多欲接收的字符個(gè)數(shù)(1~255鉴分,包括最后的回車)
第二個(gè)字節(jié)存放實(shí)際輸入字符的個(gè)數(shù)(不包括最后的回車)
第三個(gè)字節(jié)開始存放實(shí)際輸入的字符串ASCII碼(最后總是回車符)
多出的字符被丟掉,最后一個(gè)字符是回車符 - ROM-BIOS常用的輸入輸出功能調(diào)用
子功能號(hào) | 功能 | 入口參數(shù) | 出口參數(shù) | 對(duì)應(yīng)DOS 功能號(hào) |
---|---|---|---|---|
AH=00H INT 16H |
輸入一個(gè)字符 | AX=鍵值代碼 | 01H | |
AH=01H INT 16H |
判定是否有輸入 | ZF=1带膀,沒有輸入 ZF=0志珍,已有輸入 |
0BH | |
AH=0EH INT 10H |
輸出一個(gè)字符 | AL=輸出字符的ASCII碼 BH=顯示頁號(hào) |
02H |
- AH=00H,INT 16H輸入時(shí)垛叨,
按下標(biāo)準(zhǔn)ASCII碼鍵:AL=ASCII碼伦糯,AH=掃描碼
按下擴(kuò)展鍵:AL=00H,AH=健擴(kuò)展碼
按下“ALT+小鍵盤數(shù)字按鍵”:AL=ASCII碼嗽元,AH=00H - AH=0EH敛纲,INT 10H輸出時(shí),通常使BX=0
六剂癌、處理器控制類指令
指令 | 基本格式 | 功能 | 其他 |
---|---|---|---|
空操作指令 | NOP | 空操作 實(shí)現(xiàn)軟件延時(shí) 預(yù)留指令空間 填充代碼空間 |
占用一個(gè)字節(jié)存儲(chǔ)單元 空耗一個(gè)指令執(zhí)行周期 |
暫停指令 | HLT | 暫停指令 用于等待中斷 |
CPU發(fā)生復(fù)位或外部 中斷時(shí)淤翔,CPU脫離暫停 狀態(tài) |
段超越前綴指令 | |||
LOCK | 封鎖總線的前綴指令 | ||
交權(quán)指令 ESC |
與浮點(diǎn)協(xié)處理器有關(guān) | ||
等待指令 WAIT |