1. 通用數據傳送指令 MOV,PUSH,POP,XCHG,XLAT
(1)MOV
①MOV DS, 2000H ; //語法錯誤,不能用立即數給段寄存器賦值。
應該為:MOV AX, 2000
MOV DS, AX
② MOV WORD PTR[DI], 2000H
PTR 是屬性運算符,功能為修改操作數的類型。WORD PTR 的作用是將操作數的類型 設置為字類型。
③MOV [DI], 04AH ; //語法錯誤:源和目的操作數的類型都不確定,產生二異性。
因為[DI]代表的僅是首地址,不能確定它具體有多少個地址;而04AH也不能確定它前面有多少個0,占的字節數自然也不確定。
注意:
① MOV 指令不影響標志寄存器的任何標志位
② 源和目的操作數必須等長,即同時為字節類型或字類型。
③不允許給 CS(代碼段寄存器) 賦值。
④ MOV 指令不能訪問 IP 和 Flags
(2)PUSH,POP
PUSH 和 POP 是堆棧操作指令助記符。堆棧是程序在內存中開辟的一個數據區,用以 保存寄存器或存儲器中暫時不用而又必須保存的數據。
程序中堆棧是用段定義語句在內存中 定義的一個堆棧段,堆棧段的段基址存放在 SS 寄存器,段內偏移地址存放在 SP 寄存器中, SP 也常稱為堆棧指針,它總是指向棧頂。
例如: 設 SS=2000H,SP=102H,AX=623EH,執行下面指令后:
PUSH AX
AX 的數據 62H 存入 20101H 單元,3EH 存入 20100H 單元,SP=0100H
注意:
- 堆棧指令的 操作數必須是字類型,可以是 16 位的通用寄存器或段寄存器,也可以是兩個連續的內存單 元,可以采用任何尋址方式。
- CS 不能作為 出棧指令的操作數。
- 堆棧指令不影響任何標志位。
2. 輸入輸出指令 IN,OUT
8086CPU 對所有輸入輸出端口統一管理,提供了一個與內存儲器地址空間分開的、完 全獨立的地址空間,I/O 端口的地址有 8 位和 16 位兩種形式。
- 直接端口尋址方式:當端口地址是 8 位的二進制數時,可以在指令中直接使用該地址。
- 寄存器間接尋址方式:當端口地址為 16 位,不能直接使用,需要預先將其傳送到 DX 寄存器中,並且只能是 DX 作為間接尋址寄存器
8086CPU 無論從端口輸出數據還是輸入數據,都要通過累加器 AL 或 AX(只有這兩個寄存器),所以輸入輸 出指令又稱為累加器專用傳送指令。
IN AL, 60H ;從 60H 端口輸入一個字節。
MOV DX, 0378H
MOV AL, ‘A’
OUT DX, AL //三條代碼表示從並行口 0378H 輸出一個字符‘A’
3. 乘法指令 MUL,IMUL,AAM
(1)無符號數乘法指令 MUL
功能:如果 src 為字節類型,累加器 AL 與 src 相乘,結果存在 AX 中;如果 src 為字類 型累加器 AX 與 src 相乘,結果存在 DX:AX 中。
說明:兩個乘數的數據類型要相同,指令影響標志位 CF,OF 位。 例如:
MUL AH ;AL×AH 結果保存在 AX 中。
MUL BX ;AX×BX 結果保存在 DX:AX 中。
MUL BYTE PTR[SI] ;AL×[SI]結果保存在 AX 中。
MUL WORD PTR[BX+DI] ;AX×[BX+DI]結果保存在 DX:AX 中。
字節相乘的乘積在 AX 中,如果標志位 CF=OF=1,表明 AH 不為 0;字相乘的乘積在 DX:AX 中,如果標志位 CF=OF=1,表明乘積的高位 DX 不為 0。
(2)有符號數乘法指令 IMUL
功能:指令的功能和用法與 MUL 指令相同,只是操作數為帶符號數,結果也是帶符號 數。
(3)乘法的十進制調正指令 AAM
AAM 指令完成 AL 中數的調正。使用 AAM 的前提是兩個非壓縮 BCD 碼相乘,乘積在 AL 中,AH=0。
功能:把 AL 寄存器的內容除以 0AH,商存在 AH 中,余數存在 AL 中。 例
MOV AL, 8
MOV BL, 7
MUL BL
AAM ;AH=5,AL=6
4. 除法指令 DIV,IDIV,CBW,CWD,AAD
除法指令包括無符號數除法指令 DIV,帶符號數除法指令 IDIV。這兩條指令都隱含了 被除數 AX 或 DX:AX。
除數可以是寄存器或存儲器操作數,但不能是立即數。
被除數的字 長要求是除數字長的兩倍,如果除數是字節類型,被除數必須是字類型而且要預置在 AX ,結果的商存到 AL 中,余數存到 AH 中; 如果除數為字類型,被除數必須是雙字類型而且要預置在 DX:AX 中,結果的商存到 AX 中,余數存到 DX 中。
DIV BL
DIV BX
DIV BYTE PTR[SI]
DIV WORD PTR[DI]
如果字節操作的結果大於 FFH 則溢出,如果字操作的結果大於 FFFFH 則溢出,溢出將 產生除法錯中斷。
例子:MOV BL DIV BL
(2)帶符號數的除法 IDIV
IDIV 指令與 DIV 指令相似,只是參加運算的是帶符號數,結果也是帶符號數,符號與 被除數一致。被除數什么符號余數也是什么符號
(3)符號擴展指令 CBW,CWD 除法指令對操作數的長度嚴格要求,如果長度不符合要求,可以使用符號擴展指令對數 據類型進行調整。指令不影響標志位。
-
指令格式:CBW
功能:字節轉換為字,如果 AL<80H,則 AH 置 0;如果 AL≥80H,則將 FFH 賦給 AH。
說明:將 AL 中的數的符號位擴展至 16 位,擴展的符號部分存入 AH 中,即由 AL 擴 展為 AX,值保持不變。 例如:
MOV AL, 3EH ;AL=0011 1110B CBW ;AX=0000 0000 0011 1110B MOV AL, 93H CBW ;AX=1111 1111 1001 0011B
-
指令格式:CWD
功能:字轉換為雙字,如果 AX<8000H,則 DX 置 0;如果 AX≥8000H,則將 FFFFH 賦給 DX。
說明:CWD 將 AX 中的數的符號位擴展至 32 位,擴展的符號部分存入 DX 中。即由 DX:AX 代替 AX,值保持不變。 例如:
MOV AX, 0C539H ;AX=1100 0101 0011 1001B CWD ;DX=FFFFH,AX=C539H
(4)除法調正指令 AAD
AAD 指令進行除法調正的使用范圍有限,它只能用於兩位的非壓縮 BCD 的除法操作, 也就是不超過 99 的十進制數的除法操作。AAD 指令與其它調正指令不同,它用在除法指令 之前,即在除法執行之前首先用 AAD 指令將 AX 中兩位非壓縮 BCD 碼調正為二進制數, 然后再進行二進制除法。
功能:AH×10+AL 送入 AL,AH=0。 例如:
MOV AX, 0908H ;AX=0908H,AX 存有非壓縮 BCD 數 98
MOV BL, 8
AAD ;AX=09×0AH+08=92H
DIV BL ;AH=2,AL=0CH
邏輯運算指令
邏輯運算指令包括與(AND)、或(OR)、非(NOT)、異 或(XOR)和測試(TEST)指令.
(5)測試指令 TEST
指令格式: TEST OPRD1, OPRD2
功能:OPRD1 與 OPRD2 按位進行與操作,(與AND指令功能一樣)但是結果不回送 OPRD1 中,所以指令執行 后兩個操作數的值保持不變。
例:
TEST AL, 01H
指令執行后 AL 的值保持不變,但標志位受到影響。如果 ZF=0 說明 AL 的第 0 位為 1, 如果 ZF=1 說明 AL 的第 0 位為 0。
串操作指令
串或字符串是指在內存中連續存放的由字節或字組成的數據串,可以是數值型或字符型 數據。我們常常要從數據串中查找特定數據;或者比較兩個串是否相同等,或者把一個串從 內存的一個區域傳送到另一個區域等操作;使用串操作指令就是最佳選擇。串操作指令對串 中數據進行相同的操作,可以以字節為單位或以字為單位,可操作的最大串長度為 64K。串 操作指令包括:
MOVS 串傳送
CMPS 串比較
SCAS 串掃描
STOS 存入串
LODS 取串
這五種串操作指令都是隱含指令,說明如下:
① 源操作數(源串)默認由 DS:SI 指定,即源串默認在數據段,允許段超越為 CS、ES 和 SS。偏移地址指針 SI 自動修改。
② 目的操作數(目的串)默認由 ES:DI 指定,即目的串默認在附加數據段。不允許段 超越。偏移地址指針 DI 自動修改。
③ 通過設定標志寄存器中的方向標志位DF的值,可以控制串操作的方向。 DF設定為0, 偏移地址指針 SI 和 DI 自動增量,如果串操作為字節操作,每次偏移地址指針加 1,如果為 字操作,每次偏移地址指針加 2。DF 設定為 1,偏移地址指針自動減量。如果串操作為字節 操作,每次偏移地址指針減 1,如果為字操作,每次偏移地址指針減 2。
④ 串操作指令本身只操作一次,例如指令 MOVSB 的功能為將 DS:SI 指明的一個字節 傳送到 ES:DI 指明的內存單元中。如果要使整個的源串數據全部傳送到目的串中,需要再加 一個重復前綴 REP。用於串操作指令的重復前綴有三種,分別是: REP:無條件重復前綴 REPE:相等時重復(ZF=1), REPZ:比較結果為 0 時重復 REPNE:不相等時重復(ZF=0), REPNZ:比較結果不為 0 時重復
⑤ 帶重復操作前綴的串操作指令,需要指明重復次數。用計數器 CX 指定串長度,即重 復次數,每次串操作后 CX 自動減 1,直到 CX=0,串操作結束。 綜上所述:在使用串操作指令前應預先設置源串指針 DS:SI,目的串指針 ES:DI,計數 器 CX 和標志位 DF。
**1. 串傳送指令 MOVS **
功能:字符串傳送。
- MOVSB,隱含操作數,將 DS:SI 指明的一個字節傳送到 ES:DI 指明的內存單 元中。
- MOVSW,隱含操作數,將 DS:SI 指明的兩個字節傳送到 ES:DI 指明的內存單 元中。
- MOVS OPRD1,OPRD2,這種形式常常用在源串段超越的情況下。
將數據段中 STRING 1 中 100 個字節傳送到附加數據段中的 STRING 2 中:
MOV SI, OFFSET STRING1 ;初始化源串指針
MOV DI, OFFSET STRING2 ;初始化目的指針
MOV CX, 100 ;初始化計數器
CLD ;設置 DF=0,使 SI 和 DI 按增量變化,增量為 1 |
相反功能指令是STD,將方向標志位DF置1
REP MOVSB ;自動重復傳送,直到 CX=0
如果希望一次傳送兩個字節,則程序改為:
MOV SI, OFFSET STRING1
MOV DI, OFFSET STRING2
MOV CX, 50
CLD
REP MOVSW
如果 STRING 1 在附加數據段中,程序應為:
MOV SI, OFFSET STRING1
MOV DI, OFFSET STRING2
MOV CX, 100
CLD
REP MOVS BYTE PTR ES:[DI], BYTE PTR ES:[SI]