




已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第三章8086 8088的指令系統(tǒng) 第一節(jié)尋址方式 第二節(jié)指令系統(tǒng) 一 立即尋址 二 寄存器尋址 三 直接尋址 四 寄存器間接尋址 五 變址尋址 六 基址加變址尋址 一 數(shù)據(jù)傳送指令 二 算術(shù)運(yùn)算指令 三 邏輯運(yùn)算指令 四 串操作指令 五 控制轉(zhuǎn)移指令 六 處理器控制指令 習(xí)題 3 3 1 4 8 10 3 6 單 3 7 3 10 1 4 3 12 3 14 單 化妝品 計(jì)算機(jī)的指令一般由操作碼和操作數(shù)組成 操作碼規(guī)定了指令的功能 而操作數(shù)則規(guī)定了指令操作的對象 操作數(shù)可以以立即數(shù)的形式存放在指令中 但在大多數(shù)情況下 操作數(shù)是以地址的形式存放在指令 指示操作數(shù)在哪兒 用于說明操作數(shù)所在地址的方法稱為尋址方式 3 18086的尋址方式 在微機(jī)中 操作數(shù)存放在 1 在指令中 2 在CPU的某一內(nèi)部寄存器中 3 在內(nèi)存的數(shù)據(jù)區(qū)中 4 I O端口 在8086CPU中 內(nèi)存地址是由數(shù)據(jù)段地址和段內(nèi)偏移量組成 而指令中規(guī)定的地址即為段內(nèi)偏移量 邏輯地址 有效地址EA 有效地址EA構(gòu)成的方法不同 則為不同的尋址方式 第三章8086的尋址方式和指令系統(tǒng) 操作數(shù) 8位或16的常數(shù) 直接包含在指令中 緊跟在操作碼后面 與操作碼一起放在代碼段區(qū)域中 操作數(shù)im既可是8位的 也可是16位的 例 MOVAX imMOVAL 26H 二 寄存器尋址 RegisterAddreing 例 MOVDS AX 一 立即尋址方式 ImmediateAddressing imH imL 操作數(shù)放在指令規(guī)定的寄存器中 操作數(shù)的有效地址EA是指令的一部分 它與操作碼一起放在代碼段區(qū)域中 操作數(shù)的物理地址為數(shù)據(jù)段寄存器DS加上16位地址偏移量 例 若 DS 3000HMOVAX 2000H 指令中存儲單元的地址也可用符號地址表示 例 AREA1DW0867HMOVAX AREA1 注意區(qū)分 AREA1EQU0867HMOVAX AREA1 30 50 三 直接尋址方式 DirectAddressing 操作數(shù)在存儲單元中 操作數(shù)的有效地址EA在指令碼所指定的寄存器中 可作為間址的寄存器有SI DI BX BP 若 1 操作數(shù)在數(shù)據(jù)段DS中 則以寄存器BX SI或DI間接尋址 2 操作數(shù)在堆棧段中 則以寄存器BP間接尋址 例 若 DS 2000H SI 1000HMOVAX SI 50 A0 四 寄存器間接尋址方式 RegisterIndirectAddressing 操作數(shù)在存儲單元中 操作數(shù)的有效地址是以指令指定的寄存器內(nèi)容加上指令中給定的8位或16位位移量 例 若 DS 3000H SI 2000H COUNT 3000HMOVAX COUNT SI 或MOVAX COUNT SI 若指令指定的寄存器是BX SI或DI 段寄存器使用DS 若指令指定的寄存器是BP 則段寄存器使用SS 30 50 五 寄存器相對尋址方式 RegisterRelativeAddressing 物理地址 16 DS SI COUNT 30000H 2000H 3000H 35000H 操作數(shù)在存儲單元中 操作數(shù)的有效地址是一個基址寄存器 BX或BP 和一個變址寄存器 SI或DI 的內(nèi)容之和 兩個寄存器均由指令指定 一般由基址寄存器決定所使用的段寄存器 六 基址變址尋址方式 BasedIndexedAddressing 若指令指定的寄存器是BX 段寄存器使用DS 若指令指定的寄存器是BP 則段寄存器使用SS 物理地址 16 DS BX SI或 16 DS BX DI 物理地址 16 SS BP SI或 16 SS BP DI 例 MOVAX BX SI 若DS 3000H SI 2000H BX 3000H 35000H 0ABCDH則 物理地址 16 DS BX SI 35000HAX 0ABCDH 操作數(shù)在存儲單元中 操作數(shù)的有效地址是基址寄存器 BX或BP 內(nèi)容加上變址寄存器 SI或DI 的內(nèi)容 再加上指令中指定的8位或16位位移量 一般由基址寄存器決定所使用的段寄存器 例 MOVAX COUNT BX SI 七 相對基址變址尋址方式 RelativeBasedIndexedAddressing 若指令指定的寄存器是BX 段寄存器使用DS 物理地址 16 DS BX SI 8位或16位位移量或 16 DS BX DI 8位或16位位移量 若指令指定的寄存器是BP 則段寄存器使用SS物理地址 16 SS BP SI 8位或16位位移量或 16 SS BP DI 8位或16位位移量 若DS 3000H SI 0300H BX 1500H COUNT 0200H 31A00H 26BFH則 物理地址 16 DS BX SI COUNT 31A00HAX 26BFH 立即數(shù)可以出現(xiàn)在方括號內(nèi) 表示直接地址 1 指令中使用方括號的地址表達(dá)式必須遵循下列規(guī)則 只有SI BP DI BX可以出現(xiàn)在方括號內(nèi) 它們可以單獨(dú)出現(xiàn) 也可以相加后出現(xiàn) 或以寄存器與立即數(shù)相加的形式出現(xiàn) 但BX和BP或SI和DI不能同時出現(xiàn)在同一個 內(nèi) SI和DI也不能同時出現(xiàn) 方括號有相加的含義 下面幾種寫法都是等價的 1200 BX SI BX 1200 SI BX SI 1200 方括號內(nèi)包含BP 則隱含使用SS提供基地址 其余情況均使用DS提供基地址 需說明的幾個問題 2 段超越 在8088系統(tǒng)中 數(shù)據(jù)通常在數(shù)據(jù)段中 但若需要 數(shù)據(jù)也可存放在碼段 堆棧段以及附加段中 這種情況就是段超越 應(yīng)用時 需在指令中加以說明 例 MOVAX ES 0500H ES表示數(shù)據(jù)在附加段中 是修改屬性運(yùn)算符 3 其它尋址方式 1 隱含尋址 指令中不指明操作數(shù) 2 I O端口尋址 8086有直接端口尋址和間接端口尋址兩種方式 端口尋址范圍分別為0 0FFH和0 FFFFH 3 轉(zhuǎn)移類指令尋址 4 一條指令有幾種尋址方式 3 28086的指令系統(tǒng) 8088的指令系統(tǒng)可以分為六個功能組 功能 將源操作數(shù)的一個字節(jié) B 或一個字 W 傳送到目的操作數(shù)所指的單元 說明 指令中至少要有一項(xiàng)明確指出傳送的是字節(jié)還是字 可用不同的尋址方式 不影響標(biāo)志位 源操作數(shù)不變 存儲器之間 立即數(shù)與段寄存器 段寄存器之間不能用一條指令完成數(shù)據(jù)傳送 MOV指令允許傳送數(shù)據(jù)的途徑如下圖所示 2 堆棧操作指令 進(jìn)棧指令PUSHOPRD 功能 將一個字的源操作數(shù)傳送至由SP所指向的堆棧的頂部 堆棧是以 先進(jìn)后出 的方式工作的一個存儲區(qū) 例 PUSHAX指令執(zhí)行過程 指令執(zhí)行后 AX 2A8CH SP 2000 0130H 2000 012EH 8CH 2000 0000H 2AH SP 出棧指令POPOPRD 功能 把當(dāng)前SP所指向的堆棧頂部的一個字送到指定的目的操作數(shù)中 CS不能作為目的操作數(shù) 操作 每執(zhí)行一次出棧操作 SP 2 SP 指向新的棧頂 例 設(shè)SS 2000H SP 0130H 20130H 396EH BX 4FAEH 執(zhí)行指令POPBX的過程如下圖所示 執(zhí)行指令前BX 4FAEH 2000 0000H 2000 0000H 2000 0130H 2000 0130H SP 2000 0132H SP 執(zhí)行指令后BX 6EH 39 SP 2000 0131H 3 交換指令 指令格式 XCHGOPRD1 OPRD2功能 把一個字或一個字節(jié)的源操作數(shù)與目的操作數(shù)交換 交換可在寄存器之間 寄存器與存儲器之間進(jìn)行 但段寄存器不能作為操作數(shù) 也不能直接交換兩個存儲單元中的內(nèi)容 例 設(shè)AX 31B0H DS 3000H BX 1800H 31800H 1995H 執(zhí)行指令XCHGAX BX 的過程為 執(zhí)行指令前 AX 31B0H 31800H 31801H 31800H 31801H 執(zhí)行指令后 AX 95H 19H 31H B0H 1995H 二 累加器專用傳送指令1 輸入指令I(lǐng)N 功能 從8位端口讀入一個字節(jié)到AL 或從16位端口讀入一個字到AX 指令格式 INAL n或INAX n n為 255的端口地址 INAL DX或INAX DX 端口地址放在DX中 第一種格式 端口地址n 00 FFH 直接包含在IN指令里 共允許尋址256個端口 當(dāng)端口地址號大于FFH時 必須用第二種尋址方式 即先將端口號送入DX寄存器 再執(zhí)行輸入操作 例 用IN指令從輸入端口讀取數(shù)據(jù) 1 INAL 0E3H E3H端口 AL 執(zhí)行指令前 執(zhí)行指令后 E3H端口 AL 9DH 2 INAX 80H 執(zhí)行指令后 17 5BH 2 輸出指令OUT 功能 將AL中的一個字節(jié)寫到一個8位端口 或把AX中的一個字寫到一個16位端口 例 用OUT指令對輸出端口進(jìn)行操作 1 OUT84H AX 2 MOVDX 300HOUTDX AL 9AH 46H 3FH 3 換碼指令XLAT 查表指令 指令格式 XLAT 功能 BX AL AL 該指令執(zhí)行前 先把轉(zhuǎn)換表首地址的偏移量送入BX中 而把要查找表內(nèi)單元的偏移量 0 255 送入AL中 執(zhí)行換碼指令后 把該單元的內(nèi)容送入AL中 例 若十進(jìn)制數(shù)字0 9的LED七段顯示碼對照表已存放在內(nèi)存中 表格的首地址為TABLE 用XLAT指令求數(shù)字5的七段顯示碼值程序如下 TABLEDB40H 79H 24H 30H 19HDB12H 02H 78H 00H 18H 建立七段顯示碼表格 5 表格首地址 12H MOVAL 5 AL MOVBX OFFSETTABLE BX XLAT AL 例 SI 1000H DS 5000H 51000H 1234H 執(zhí)行指令LEABX SI 后 BX 1000H 執(zhí)行指令MOVBX SI 后 BX 1234H 功能 從源操作數(shù)指定的存儲單元中的雙字指針?biāo)偷街噶钪付ǖ募拇嫫?常指定SI 及DS寄存器中 例 設(shè)DS 1200H 13450H 3F46H 13452H 0A92H執(zhí)行指令LDSSI 1450H 后 SI 3F46H DS 0A92H 功能 從源操作數(shù)指定的存儲單元中的雙字指針?biāo)偷街噶钪付ǖ募拇嫫?常指定DI 及ES寄存器中 例 設(shè)DS 0100H BX 0020H 01020H 0300H 01022H 0500H ES 3000H DI 0300H ES 0500H 執(zhí)行指令LESDI BX 后 四 標(biāo)志寄存器傳送指令 1 LAHF標(biāo)志送到AH指令 指令格式 LAHF 功能 把標(biāo)志寄存器中的SF ZF AF PF和CF分別送到AH寄存器的位7 6 4 2和0 位5 3 1的內(nèi)容未定義 功能 把寄存器AH中的7 6 4 2 0位傳送到標(biāo)志寄存器的SF ZF AF PF和CF位 高位標(biāo)志OF DF IF和TF不受影響 功能 修改堆棧指針 使SP 2 SP 把整個標(biāo)志寄存器的內(nèi)容壓入堆棧 指令執(zhí)行后對標(biāo)志位無影響 4 POPF標(biāo)志出棧指令指令格式 POPF 功能 把當(dāng)前堆棧指針SP所指的一個字 傳送給標(biāo)志寄存器 并修改堆棧指針 使SP 2 SP 在過程 子程序 調(diào)用和中斷服務(wù)程序中 可用PUSHF和POPF指令來保護(hù)和恢復(fù)標(biāo)志位 另外 這兩條指令也可用來改變追蹤標(biāo)志TF 入棧 修改 出棧 8088無直接改變T標(biāo)志的指令 8088指令系統(tǒng)提供了加 減 乘 除四種基本運(yùn)算指令 可處理無符號或帶符號的8位或16位二進(jìn)制數(shù)的算術(shù)運(yùn)算 帶符號數(shù)是用補(bǔ)碼表示 還提供了各種調(diào)整操作指令 故可進(jìn)行壓縮的或非壓縮的十進(jìn)制數(shù)的算術(shù)運(yùn)算 絕大部分算術(shù)運(yùn)算指令都影響狀態(tài)標(biāo)志位 功能 將源和目的操作數(shù)相加 結(jié)果送到目的操作數(shù)中 即OPRD1 OPRD2 OPRD1 這兩條指令的源操作數(shù)OPRD2可以是寄存器 存儲器或立即數(shù) 目的操作數(shù)OPRD1只能用寄存器和存儲單元 注意 源操作數(shù)和目的操作數(shù)不能同時為存儲器 而且它們的類型必須一致 即都是字節(jié)或字 它們影響的標(biāo)志位為 CF OF PF SF ZF和AF 二 算術(shù)運(yùn)算指令 執(zhí)行指令A(yù)DDAX CX AX 5389H CF 1ADCDX BX DX 1128H CF 0 例 設(shè) AX 7365H BX 1025H CX 0E024H DX 0102H 結(jié)果 AX 5389H DX 1128H BX 1025H CX 0E024H 標(biāo)志位SF 0 ZF 0 CF 0 OF 0 AF 0 3 INCOPRD增量指令 單操作數(shù) 功能 對目的操作數(shù)加1 結(jié)果送回目的操作數(shù) 即OPRD 1 OPRD 目的操作數(shù)可以在通用寄存器或內(nèi)存中 指令執(zhí)行后影響AF OF PF SF和ZF 但不影響CF 例 INCBLINCCX 例 對內(nèi)存單元的內(nèi)容加1必須說明該單元的類型INCBYTEPTR BX INCWORDPTR BX 4 AAA未組合BCD碼加法調(diào)整指令 功能 在用ADD或ADC指令對兩個未組合BCD碼作加法后 運(yùn)算結(jié)果已存在AL中 用AAA指令對AL中的數(shù)據(jù)進(jìn)行調(diào)整 產(chǎn)生一個未組合的十進(jìn)制和放在AX中 例 實(shí)現(xiàn)兩個未組合十進(jìn)制數(shù)加法運(yùn)算 設(shè)AL 08H BL 07H ADDAL BL AAA AL 0FH AX 0105H 未組合十進(jìn)制數(shù)的和放在AX中 5 DAA組合BCD碼加法調(diào)整指令 例 實(shí)現(xiàn)兩個組合十進(jìn)制數(shù)加法運(yùn)算 設(shè)AL 28H BL 68H 執(zhí)行ADDAL BL AL 90H CF 0 AF 1 DAA AL 06H AL AL 96H 結(jié)果AL 96H CF 0 AF 0 功能 將兩個組合BCD碼相加后 存放在AL中的結(jié)果 調(diào)整為正確的組合BCD數(shù) DAA指令要緊跟在ADD或ADC指令之后使用 以實(shí)現(xiàn)組合的十進(jìn)制數(shù)加法運(yùn)算 例 求兩個多字節(jié)無符號數(shù)之和 加數(shù)在DATA1開始的單元中 被加數(shù)在DATA2開始的單元中 字節(jié)長度為5 和存放在DATA2中 程序框圖 源程序段 MOVCX 5MOVSI 0CLC MOVAL DATA1 SI LOP ADCDATA2 SI AL INCSIDECCX JNZLOPHLT 二 減法指令 2 SBBOPRD1 OPRD2功能 OPRD1 OPRD2 CF OPRD1 這兩條指令均影響AF CF OF PF SF和ZF 3 DECOPRD減量指令功能 OPRD 1 OPRD 執(zhí)行后不影響CF 但影響AF OF PF SF和ZF 4 NEGOPRD取負(fù)指令功能 0 OPRD OPRD 指令執(zhí)行后影響AF CF OF PF SF和ZF 若字節(jié)操作數(shù)為80H 128 字操作數(shù)為8000H 32768 執(zhí)行NEG指令后操作數(shù)無變化 但OF 1 如操作數(shù)為0 執(zhí)行該指令后 結(jié)果仍為0 且CF 0 否則CF 1 例1 設(shè) DX 3A49H CF 1執(zhí)行指令SBBDX 1850H執(zhí)行結(jié)果 DX 21F8H CF 0 例2 已知 AL 13H執(zhí)行指令NEGAL執(zhí)行結(jié)果 AL 0EDH 以上5條指令實(shí)際上都做減法操作 而且都可以進(jìn)行字或字節(jié)運(yùn)算 對于雙操作數(shù)指令 源操作數(shù)可以是寄存器 存儲器或立即數(shù) 目的操作數(shù)可以是寄存器或存儲器 但不能立即數(shù) 而且兩個操作數(shù)不能同時為儲存器 對于單操作數(shù)指令 目的操作數(shù)可以是寄存器或存儲器 但不能立即數(shù) 如果操作數(shù)是存儲器 還必須指出其類型 5 比較指令CMPOPRD1 OPRD2 功能 將目的操作數(shù)減去源操作數(shù) 但不送結(jié)果 僅將結(jié)果反映在標(biāo)志位上 接著可用條件轉(zhuǎn)移指令決定程序的流向 比較指令主要用在希望比較兩個數(shù)之間的關(guān)系 而又不破壞原操作數(shù)的場合 即兩者是否相等 或兩個中哪一個大 一般有下列幾種情況 在比較指令之后 根據(jù)ZF標(biāo)志即可判斷兩者是否相等 若兩者相等 執(zhí)行CMP指令后 ZF 1 否則為0 若是兩個無符號數(shù)進(jìn)行比較 則在比較指令之后 可根據(jù)CF的狀態(tài)判斷大小 若是判斷兩個帶符號數(shù)的大小 可根據(jù)SF和OF進(jìn)行判斷 在執(zhí)行CMPAX BX后1 當(dāng)無溢出 OF 0 若SF 0 則AX BX 否則AXBX 即 OF 異或 SF 0 則AX BX OF 異或 SF 1 則AX BX 比較指令的應(yīng)用 6 AAS未組合BCD碼減法調(diào)整指令 功能 在用SUB或SBB指令對兩個未組合十進(jìn)制數(shù)進(jìn)行相減后 對AL中所得結(jié)果進(jìn)行調(diào)整 在AL中得到一個正確的未組合十進(jìn)制數(shù)之差 如果有借位 則CF置1 影響AF CF 對OF PF SF ZF未定義 7 DAS組合BCD碼減法調(diào)整指令 功能 在兩個組合十進(jìn)制數(shù)用SUB或SBB相減后 結(jié)果已存放在AL中的情況下 用DAS對AL進(jìn)行調(diào)整 在AL中得到正確的組合十進(jìn)制數(shù) 影響AF CF PF SF ZF 對OF未定義 例 在BLOCK開始的內(nèi)存單元中有100個16位帶符號數(shù) 請尋找出最大值并送MAX單元 DECCX 比較次數(shù)減一JNZAGAIN 未完 繼續(xù) MOVBX OFFSETBLOCK 設(shè)置塊指針MOVAX BX 取一數(shù)送AXINCBX 修改指針I(yè)NCBXMOVCX 99 設(shè)置比較次數(shù) AGAIN CMPAX BX 比較 JGNEXT AX BX 轉(zhuǎn)NEXTMOVAX BX 小于 則小數(shù)送AX NEXT INCBX 修改指針I(yè)NCBX MOVMAX AX 完 則存大數(shù)HLT 三 乘法指令 1 無符號數(shù)乘法指令MULsrc 功能 完成將AL 字節(jié) 或AX 字 中的無符號數(shù)與源操作數(shù)相乘 雙倍長度的乘積送回到AX或DX AX 影響標(biāo)志位CF OF 若乘積的高半部分 在字節(jié)相乘時為AH 在字相乘時為DX 不為零 則標(biāo)志CF 1 OF 1 否則CF 0 OF 0 2 帶符號數(shù)乘法指令I(lǐng)MULsrc 功能 完成兩個帶符號數(shù)相乘 操作及對標(biāo)志位的影響與MUL指令完全類似 字節(jié)操作數(shù) AL src AX字操作數(shù) AX src DX AX 3 AAM 功能 把在AX中的兩個未組合十進(jìn)制數(shù)相乘的結(jié)果 進(jìn)行十進(jìn)制數(shù)的調(diào)整 使得在AX中得到正確的未組合十進(jìn)制數(shù)的乘積 指令執(zhí)行后影響標(biāo)志位PF SF ZF 對AF CF OF未定義 例 設(shè) AL 90H BL 04H 執(zhí)行指令MULBL后 AX 0240H CF 1 OF 1 例 設(shè) AL 09H BH 06H執(zhí)行MULBL AL 36HAAM 調(diào)整得 AH 05H AL 04H即 AX 0504H為未組合十進(jìn)制數(shù)09和06相乘的結(jié)果54 功能 對兩個無符號數(shù)進(jìn)行除法運(yùn)算 源操作數(shù)可以是字節(jié)或字 字節(jié)操作數(shù) AX src 字節(jié) 的商 AL 最大為FFH 余數(shù) AH 字操作數(shù) DX AX src 字 的商 AX 最大為FFFFH 余數(shù) DX 若被除數(shù)只有16位 除數(shù)也是16位 則必須將16位被除數(shù)送AX 并將DX清0 然后相除 DIV指令執(zhí)行后 所有標(biāo)志位均無定義 2 帶符號數(shù)除法指令I(lǐng)DIVsrc 功能 該指令執(zhí)行的操作與DIV相同 但操作數(shù)都必須是帶符號數(shù) 商和余數(shù)也都是帶符號數(shù) 而且規(guī)定余數(shù)的符號和被除數(shù)的相同 且所有標(biāo)志位均無定義 對于IDIV指令 字節(jié)操作時要求被除數(shù)為16位 字操作時要求被除數(shù)為32位 如果被除數(shù)不滿足這個條件 不能簡單地將高位置0 而應(yīng)該先用下面的符號擴(kuò)展指令將被除數(shù)轉(zhuǎn)換成除法指令所要求的格式 再執(zhí)行除法指令 3 把字節(jié)轉(zhuǎn)換為字指令CBW 若 AL 80H 擴(kuò)展后 AH 00H 若 AL 80H 擴(kuò)展后 AH 0FFH 該指令執(zhí)行后 不影響標(biāo)志位 功能 把AL中字節(jié)的符號位擴(kuò)展到AH的所有位 4 CWD把字轉(zhuǎn)換成雙字指令指令執(zhí)行后 不影響標(biāo)志位 功能 把AX中字的符號位擴(kuò)展送到DX寄存器的所有位中去 若 AX 8000H 則 DX 0000H 若 AX 8000H 則 DX 0FFFFH 例 編程求 38 3的商和余數(shù) MOVAL 0BAH 被除數(shù) 38送ALMOVCH 03H 除數(shù) 3送CHCBW 把字節(jié)擴(kuò)展為字 使AX 0FFBAHIDIVCH AL 0F4H 12 商 AH 0FEH 2 余數(shù) 5 AAD未組合十進(jìn)制數(shù)除法調(diào)整指令 功能 能把AX中的兩個未組合的十進(jìn)制數(shù) 在兩個數(shù)相除以前進(jìn)行校正 這樣在兩個未組合的十進(jìn)制數(shù)相除以后 可以得到正確的未組合十進(jìn)制結(jié)果 例 設(shè)AX中存有兩個未組合BCD數(shù)0307H 即十進(jìn)制數(shù)37 BL中存有一個未組合十進(jìn)制數(shù)05H 若要完成37 5的運(yùn)算 可用以下兩條指令 AAD AH 10 AL 37 25H ALDIVBL AL 7 商 AH 2 余數(shù) 注意 加法 減法和乘法的十進(jìn)制調(diào)整指令都是緊跟在加法 減法和乘法運(yùn)算指令之后 對運(yùn)算結(jié)果進(jìn)行調(diào)整 而除法的十進(jìn)制調(diào)整指令A(yù)AD則不同 它是在除法運(yùn)算之前進(jìn)行調(diào)整 指令格式 NOTsrc 功能 將目的操作數(shù)求反后送回目的操作數(shù) 即src src目的操作數(shù)可以是8位或16位寄存器或存儲器 例 設(shè) BX 8DCFH 執(zhí)行NOTBX后 BX 7230H 指令執(zhí)行后對標(biāo)志位沒有影響 指令格式 SALOPRD CNT SHL邏輯左移指令指令格式 SHLOPRD CNT 功能 以上兩條指令的功能完全相同 均將寄存器或存儲器中目的操作數(shù)的各位左移 每移一次 最低有效位LSB補(bǔ)0 而最高有效位MSB進(jìn)入標(biāo)志位CF 移動一次 相當(dāng)于將目的操作數(shù)乘以2 指令中的計(jì)數(shù)值CNT決定所要移位的次數(shù) 若只需要移位一次 可直接將指令中的CNT置1 若移位次數(shù)大于1 應(yīng)先將移位次數(shù)送進(jìn)CL寄存器 再把CL放在指令的CNT位置上 SHR邏輯右移指令 指令格式 SHROPRD CNT功能 對目的操作數(shù)中的各位進(jìn)行右移 每執(zhí)行一次移位操作 操作數(shù)右移一位 最低位進(jìn)入CF 最高位補(bǔ)0 右移次數(shù)由計(jì)數(shù)值決定 同SAL SHL指令一樣 若目的操作數(shù)是無符號數(shù) 每右移一次 使目的操作數(shù)除以2 例如 右移2次相當(dāng)于除以4 右移3次相當(dāng)于除以8等等 但用這種方法作除法時 余數(shù)將被丟掉 SAR算術(shù)右移指令 指令格式 SAROPRD CNT功能 它的功能與SHR相似 移位次數(shù)由CNT決定 每移位一次 OPRD各位右移一位 最低位進(jìn)入CF 但最高位 即符號位 保持不變 而不是補(bǔ)0 每移一次 相當(dāng)于對帶符號數(shù)進(jìn)行除2操作 MSBLSB MSBLSB CF CF 0 SHR指令 SAR指令 指令執(zhí)行后對標(biāo)志位的影響 標(biāo)志位CF總是為目的操作數(shù)最后被移出的那一位的值 標(biāo)志位OF 只有當(dāng)CNT 1時才有效 用以表示移位前后符號位是否改變 若改變 OF 1 否則OF 0 即對左移指令 SAL SHL 若移位后最高有效位與標(biāo)志位CF不相等 則OF 1 否則OF 0 而對右移指令 若移位后 操作數(shù)的最高有效位與次高位不同 則OF 1 否則OF 0 標(biāo)志位ZF SF根據(jù)指令執(zhí)行后目的操作數(shù)的狀態(tài)來決定 PF只有當(dāng)目的操作數(shù)在AL中時才有效 標(biāo)志位AF未定義 例1 設(shè) BL 5AH 執(zhí)行指令SHLBL 1后 BL 0B4H 標(biāo)志位CF 0 OF 1 例2 設(shè) DS 2800H DI 180AH 2980AH 1256H執(zhí)行MOVCL 02HSAR DI CL后 2980AH 0495H CF 1 ZF 0 SF 0 MSB LSB 操作 CF MSB LSB 操作 CF 操作 MSB LSB 操作 MSB LSB 四條指令都按指令中CNT規(guī)定的移位次數(shù)進(jìn)行循環(huán)移位 移位后的結(jié)果仍送回目的操作數(shù) OPRD可以是8 16位的寄存器或內(nèi)存操作數(shù) 移位次數(shù)可以是1 也可以由CL寄存器的值指定 標(biāo)志位CF的值由最后一次被移出的值決定 OF位僅在CNT為1時才有效 在移位后操作數(shù)的最高有效位 符號位 發(fā)生變化時 則OF 1 否則OF置0 例 設(shè)CF 1 AL 0B4H 若執(zhí)行指令ROLAL 1 則 AL 69H CF 1 OF 1若執(zhí)行指令RCRAL 1 則 AL 0DAH CF 0 OF 0 功能 對兩個操作數(shù)進(jìn)行按位 邏輯與 操作 結(jié)果送回目的操作數(shù) 主要用于使操作數(shù)的某些位保持不變 和 1 相與 而使某些位清0 和 0 相與 例 設(shè) AX 3538H 執(zhí)行指令A(yù)NDAX 0F0FH后 AX 0508H 功能 對兩個操作數(shù)進(jìn)行 邏輯與 操作 但不回送結(jié)果 即指令執(zhí)行后兩操作數(shù)不變 該指令常用在要檢測某些條件是否滿足 但又不希望改變原有操作數(shù)的情況下 緊跟在這條指令后面的往往是一條件轉(zhuǎn)移指令 根據(jù)測試結(jié)果產(chǎn)生分支 轉(zhuǎn)向不同的處理程序 例如 要判斷在BX寄存器中16位數(shù)的最高位是否為 1 可用指令TESTBX 8000H若最高位為 1 指令執(zhí)行后 ZF 0 若不是 1 則ZF 1 結(jié)果是0 功能 對兩個操作數(shù)進(jìn)行按位 邏輯或 操作 結(jié)果送回目的操作數(shù) 該指令主要用于使操作數(shù)的某些位保留 和 0 相或 而使某些位置1 和 1 相或 例如 AX中存放兩個未組合BCD數(shù)0509H 要將它們分別轉(zhuǎn)換成ASCII碼 結(jié)果仍放在AX中 則可用如下指令實(shí)現(xiàn) ORAX 3030H AX 3539H 功能 對兩個操作數(shù)進(jìn)行按位邏輯異或運(yùn)算 結(jié)果送回目的操作數(shù) 主要用于使操作數(shù)的某些位保留 和 0 相異或 而使某些位取反 和 1 相異或 例如 欲使BH寄存器中的高4位取反 低4位保持不變 可執(zhí)行指令XORBH 0F0H 四 串操作指令 串操作指令是用于處理存放在存儲器中的字或字節(jié)數(shù)據(jù) 字符串長度可達(dá)64K字節(jié) 串操作指令共有五種基本指令 可以對字符串進(jìn)行傳送 比較 搜索及存和取操作 在串操作指令可前加重復(fù)前綴 指令就重復(fù)執(zhí)行 直至CX寄存器中的操作次數(shù)滿足為止 重復(fù)過程可以被中斷 串操作指令的源串位于當(dāng)前數(shù)據(jù)段中 以SI為指針 目的串必須位于當(dāng)前附加段中 以DI為指針 每執(zhí)行一次串操作指令 指針SI和DI會自動修改 標(biāo)志位DF 0為遞增方向 這時在每次操作后SI DI增量 字節(jié)操作時加1 字操作時加2 DF 1為遞減方向 這時在每次操作后SI DI減量 字節(jié)操作時減1 字操作時減2 要處理的字符串長度 字節(jié)或字?jǐn)?shù) 放在CX寄存器中 1 MOVS串傳送指令 不影響標(biāo)志位 格式 1 MOVSOPRD1 OPRD22 MOVSB 字節(jié)傳送指令 MOVSW 字傳送指令 功能 把由SI作指針的源串中的一個字節(jié)或一個字 傳送到由DI作指針的目的串中 且自動修改指針SI和DI 可方便地實(shí)現(xiàn)在存儲單元之間傳送數(shù)據(jù) 若在指令前加前綴REP則可執(zhí)行至CX 0 例 編寫程序段把數(shù)據(jù)段中以SRC為偏移地址 長度為100個字節(jié)的字符串 傳送到附加段中以LOC為偏移地址的存儲區(qū)域中 程序段 LEASI SRCLEADI LOCMOVCX 100CLDREPMOVSB AGAIN MOVSLOC SRCDECCXJNZAGAIN 指令REPMOVSB也可用幾條指令代替 2 CMPS串比較指令 格式 1 CMPSOPRD1 OPRD22 CMPSB 字節(jié)操作 CMPSW 字操作 功能 將以SI為指針的源串中的一個字 或字節(jié) 與DI為指針的目的串中的一個字 或字節(jié) 相比較 相減 但不影響操作數(shù) 結(jié)果反映在標(biāo)志位上 同時相應(yīng)修改源串和目的串的指針 指向串中的下一個元素 標(biāo)志位AF CF OF PF ZF和SF反映兩個串的相應(yīng)元素之間的關(guān)系 在CMPS指令前可以加重復(fù)前綴 即REPECMPS或REPZCMPS 其功能相同 若比較結(jié)果為CX 0 指定的長度還未比較完 和ZF 1 兩串相等 則重復(fù)比較 直至CX 0 比完了 或ZF 0 兩串不相等 時才停止操作 也可改用重復(fù)前綴REPNE或REPNZ 它們表示 若CX 0 串沒有結(jié)束 和串不等 ZF 0 則重復(fù)比較 直至CX 0或ZF 1時才停止比較 例 在自KA和KB單元開始各有一個由30個字符組成的字符串 檢查這兩個字符串是否相等 并在GG單元中建立一個標(biāo)志 相等為00 不等為FFH 程序段 LEASI KALEADI KBMOVCX 30CLDREPECMPSBJNZL1MOVGG 0JMPL2L1 MOVGG 0FFHL2 HLT 初始化 KA指針?biāo)蚐IKB指針?biāo)虳I串長送CX指針增量變化 思考 第一個不相等的字符的地址 3 SCAS串搜索指令 格式 1 SCAS目的串2 SCASB或SCASW 功能 將AL 字節(jié)操作 或AX 字操作 的內(nèi)容減去附加段中以DI為指針的目的串元素 結(jié)果反映在標(biāo)志位上 但不改變目的串元素及累加器的內(nèi)容 操作后自動修改指針DI 使之指向下一個待搜索的串元素 SCAS指令前也可加重復(fù)前綴REPE REPZ 表示相等繼續(xù)搜索 不等提前退出 REPNE REPNZ表示不等繼續(xù)搜索 相等提前退出 利用SCAS指令 可在內(nèi)存中搜索所需要的數(shù)據(jù) 關(guān)鍵字 指令執(zhí)行前應(yīng)先將關(guān)鍵字存放在累加器中 例 內(nèi)存中以BUF0單元開始的區(qū)域連續(xù)存放著一個長度為80的字符串 ASCII碼串 查找字符串中是否有字符 B 若有 將關(guān)鍵字的地址送BX 若沒有查到 則將BX寄存器清0 程序段 LEADI BUF0MOVAL B MOVCX 80CLDREPNESCASBJZNEXTMOVBX 0JMPDONENEXT DECDIMOVBX DIDONE HLT 4 LODS從串中取指令 格式 1 LODSSRC2 LODSB或LODSW 功能 把數(shù)據(jù)段中以SI為指針的串元素 傳送到AL 字節(jié)操作 或AX 字操作 中 同時修改SI 使它指向串中的下一個元素 該指令一般不加重復(fù)前綴 例 設(shè) DS 7000H SI 0100H 70100H 08H 70101H 12H DF 0 執(zhí)行指令LODSW后 AX 1208H SI 0102H 5 STOS存入串指令 格式 1 STOSOPRD2 STOSB或STOSW 功能 把累加器AL或AX中的一個字節(jié)或字 傳送到附加段中以DI為目標(biāo)指針的目的串中 同時修改指針DI 以指向串中的下一個單元 STOS指令可與REP重復(fù)前綴連用 即執(zhí)行指令REPSTOS 能方便地用累加器中的一個常數(shù) 對一個數(shù)據(jù)串進(jìn)行初始化 例 設(shè) DS 2000H ES 1000H DI 0500H AL 20H CX 10 DF 0執(zhí)行指令REPSTOSB后 內(nèi)存中10500H 10509H單元被置為20H 同時使 DI 050AH CX 0 例 在以BLOCK為起始地址的內(nèi)存緩沖區(qū)中 有一個長度為100字節(jié)的帶符號數(shù) 要求把其中的正 負(fù)數(shù)分開 分別送至同一段的兩個緩沖器 存放正數(shù)的緩沖區(qū)起始地址為PDATA 存放負(fù)數(shù)的緩沖區(qū)起始地址為NDATA 初始化 設(shè)置源塊指針 設(shè)置正數(shù)塊指針 設(shè)置負(fù)數(shù)塊指針 設(shè)置處理字節(jié)計(jì)數(shù)器 注 串取和串存指令自動修改塊指針 程序段 START LEASI BLOCKLEADI PDATALEABX NDATAMOVCX 100LOP LODSB 取源串的一個字節(jié)送ALTESTAL 80H 測試符號位JNZMINUS 是負(fù)數(shù) 轉(zhuǎn)移到MINUSSTOSB 正數(shù)存入正數(shù)區(qū)域JMPNEXTMINUS XCHGBX DI 交換正 負(fù)數(shù)指針STOSB 負(fù)數(shù)送入負(fù)數(shù)區(qū)XCHGBX DI 恢復(fù)正 負(fù)數(shù)指針NEXT DECCX 次數(shù)減1JNZLOP 未處理完 繼續(xù)HLT 五 控制轉(zhuǎn)移指令 通常 程序中的指令都是順序地逐條執(zhí)行的 指令的執(zhí)行順序由CS和IP決定 每取出一條指令 指令指針I(yè)P自動進(jìn)行調(diào)整 指向下一條指令 當(dāng)程序執(zhí)行到某些特定位置 需要脫離程序的正常執(zhí)行順序 而把它轉(zhuǎn)移到指定的目標(biāo)時 可以利用控制轉(zhuǎn)移指令來改變CS和IP的值 從而改變指令的執(zhí)行順序 這類指令可分為 無條件轉(zhuǎn)移和過程調(diào)用 條件轉(zhuǎn)移 循環(huán)控制及中斷等幾類 一 無條件轉(zhuǎn)移和過程調(diào)用指令 1 調(diào)用指令 指令格式 CALL過程名 執(zhí)行CALL指令時 首先保留斷點(diǎn)于堆棧中 然后轉(zhuǎn)移到目標(biāo)單元 該指令的執(zhí)行對標(biāo)志寄存器無影響 過程調(diào)用有段內(nèi)調(diào)用和段間調(diào)用兩種類型 五 控制轉(zhuǎn)移指令 段內(nèi)間接調(diào)用 CALL指令中指定的16位通用寄存器或存儲單元的內(nèi)容為目標(biāo)地址 例 設(shè) BX 0200H 執(zhí)行指令CALLBX后 CPU轉(zhuǎn)向何處執(zhí)行程序 例 DS 1000H BX 200H SI 300H 10500H 3210H 執(zhí)行指令CALLWORDPTR BX SI 后 IP DS 16 BX SI 10500H 3210H 2 段間調(diào)用 CALL指令和被調(diào)用的過程不在同一代碼段中 段間直接調(diào)用指令 目標(biāo)地址直接在CALL指令中 該指令操作為 SP減2 把現(xiàn)行的碼段寄存器CS的內(nèi)容入棧 CS由指令中包含的段字代替 SP又一次減2 IP入棧 且IP由在指令中的地址偏移字代替 例 CALLDWORDPTR BX 設(shè)執(zhí)行CALL指令前 DS 1000H BX 0200H 10200H 31F4H 10202H 5200H 執(zhí)行指令時 先將返回地址的偏移量和段地址都入棧 再轉(zhuǎn)向過程入口 指令中操作數(shù)的物理地址 DS 16 BX 10200H 從該單元開始取得的雙字就是過程的入口地址 所以 入口地址的CS IP分別為 10200H IP即 IP 31F4H 10202H CS CS 5200H 段間間接調(diào)用指令 這類指令的操作數(shù)必須是存儲單元 從該單元開始存放的雙字表示過程的入口地址 其中前2個字節(jié)是偏移量 后兩個字節(jié)為代碼段基地址 指令中用DWORDPTR說明是對存儲單元進(jìn)行雙字操作 指令格式 JMP目的 段內(nèi)直接轉(zhuǎn)移指令 指令碼中直接給出轉(zhuǎn)移的目的地址 格式1 JMPSHORT標(biāo)號 直接短轉(zhuǎn)移指令 2 轉(zhuǎn)移指令 指令功能 使程序無條件地轉(zhuǎn)移到指令中指定的目的地址去執(zhí)行 指令的執(zhí)行不影響標(biāo)志位 也分為段內(nèi)轉(zhuǎn)移 近轉(zhuǎn)移 和段間轉(zhuǎn)移 遠(yuǎn)轉(zhuǎn)移 段間直接轉(zhuǎn)移指令 指令中用遠(yuǎn)標(biāo)號直接給出了轉(zhuǎn)向的段地址和偏移量 只要用指令中給出的偏移地址和段地址分別取代IP和CS的內(nèi)容 就使程序從一個代碼段轉(zhuǎn)到另一代碼段去執(zhí)行 指令格式為 JMPFARPTROPRD 段間間接轉(zhuǎn)移指令 目標(biāo)地址事先放在存儲器的4個連續(xù)單元中 轉(zhuǎn)移指令中給出存放目標(biāo)地址的存儲單元的首地址 地址低的字為偏移量 地址高的字為段地址 指令格式為 JMPDWORDPTROPRD 段內(nèi)間接轉(zhuǎn)移指令 指令轉(zhuǎn)向的16位有效地址放在16位寄存器或字存儲單元中 格式 JMPWORDPTROPRD 例 若JMPBX指令執(zhí)行前 BX 4500H 則指令執(zhí)行時 將當(dāng)前IP修改成4500H 程序轉(zhuǎn)到代碼段內(nèi)偏移地址為4500H處執(zhí)行 PTR 修改屬性運(yùn)算符 3 返回指令RET 1 RET指令 該通常作為一個子程序的最后一條指令 它用以返回到調(diào)用這個子程序的斷點(diǎn)處 段內(nèi)返回指令是把SP所指的堆棧頂部的一個字的內(nèi)容彈回到指令指針 且SP加2 若是段間返回指令 除了上述操作外 把新的SP所指的堆棧頂部的一個字的內(nèi)容彈回到CS SP再加2 RET指令對標(biāo)志位無影響 2 RETn 帶立即數(shù)返回指令 這種指令允許返回地址出棧后 再從堆棧中彈出n個字節(jié)的數(shù)據(jù) 也就是讓SP再加上n n為0000 FFFFH范圍內(nèi)的任何一個偶數(shù) 例如 指令RET8表示從堆棧中彈出地址后 再使SP的值加上8 RETn指令可以讓調(diào)用過程的主程序通過堆棧向過程傳遞參數(shù) 這些參數(shù)必須在調(diào)用過程前推入堆棧 過程在運(yùn)行中可以通過堆棧指針找到它們 當(dāng)過程返回時 這些參數(shù)已沒有用處 應(yīng)該把它們從堆棧中彈出 使用帶立即數(shù)返回指令后 可以在過程返回主程序時 使SP自動增量 從而不需要用POP指令就能把這些參數(shù)從堆棧中彈出 二 條件轉(zhuǎn)移指令 條件轉(zhuǎn)移指令是根據(jù)上一條指令執(zhí)行后 CPU設(shè)置的狀態(tài)標(biāo)志作為判別測試條件來決定是否轉(zhuǎn)移 若滿足指令所規(guī)定的條件 則程序轉(zhuǎn)移到指定目標(biāo) 若不滿足條件 則程序順序往下執(zhí)行指令 注意 所有條件轉(zhuǎn)移指令的目標(biāo)地址都是采用相對尋址方式 即以條件轉(zhuǎn)移指令為基準(zhǔn)的 128 127個字節(jié)的范圍之內(nèi) 且指令執(zhí)行后不影響標(biāo)志位 條件轉(zhuǎn)移指令可以分為以下兩大類 1 根據(jù)單個標(biāo)志位的條件轉(zhuǎn)移指令 指令基本格式 JXX目標(biāo) 2 組合條件的條件轉(zhuǎn)移指令 這類指令的助記符中不直接給出標(biāo)志狀態(tài)位的測試條件 但仍以某一個標(biāo)志或幾個標(biāo)志的狀態(tài)組合 作為測試的條件 若條件成立則轉(zhuǎn)移 否則順序往下執(zhí)行 這些指令通常放在比較指令CMP之后 通過測試狀態(tài)位來比較兩個數(shù)的大小 對兩個無符號數(shù)進(jìn)行比較后 一定要用無符號數(shù)比較測試指令決定程序流向 對帶符號數(shù)比較后 則要用帶符號數(shù)比較測試指令 3 JCXZOPRD測試轉(zhuǎn)移指令 功能 根據(jù)CX寄存器的內(nèi)容是否為0 使程序產(chǎn)生分支 進(jìn)入不同程序段 若 CX 0 則轉(zhuǎn)移 例 某學(xué)生的英語成績在AL中 若低于60分 則打印 F 若高于或等于85分 則打印 G 打印 P 試編程實(shí)現(xiàn) 程序段 CMPAL 60
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025初三升高一數(shù)學(xué)暑假銜接講義25講含答案(必修一內(nèi)容)5.6 三角函數(shù)倍角公式
- 統(tǒng)編版2025年七年級語文下學(xué)期期末總復(fù)習(xí)(專題訓(xùn)練)專題04文言文閱讀(考題猜想)(學(xué)生版+解析)
- 愛崗敬業(yè)14課件
- 考研復(fù)習(xí)-風(fēng)景園林基礎(chǔ)考研試題【奪冠】附答案詳解
- 風(fēng)景園林基礎(chǔ)考研資料試題及參考答案詳解【綜合題】
- 《風(fēng)景園林招投標(biāo)與概預(yù)算》試題A附參考答案詳解(考試直接用)
- 2025-2026年高校教師資格證之《高等教育法規(guī)》通關(guān)題庫含答案詳解(考試直接用)
- 泰州市2024-2025學(xué)年三年級下學(xué)期數(shù)學(xué)期末試題一(有答案)
- 2023國家能源投資集團(tuán)有限責(zé)任公司第一批社會招聘筆試備考題庫含答案詳解ab卷
- 2025年河北省定州市輔警招聘考試試題題庫及參考答案詳解一套
- JGT 352-2017 現(xiàn)澆混凝土空心結(jié)構(gòu)成孔芯模
- 第18講 八下課標(biāo)文言文復(fù)習(xí)(練習(xí))-2024年中考語文一輪復(fù)習(xí)講練測(全國)(原卷版)
- 山東省濟(jì)南市平陰縣2023-2024學(xué)年八年級下學(xué)期期末數(shù)學(xué)試題
- 2024全新股份合作協(xié)議樣板下載
- 礫巖和角礫巖課件
- 上海市虹口區(qū)2023-2024學(xué)年八年級下學(xué)期期末考試語文試題
- 酒店管理綜合實(shí)訓(xùn)智慧樹知到期末考試答案章節(jié)答案2024年浙江越秀外國語學(xué)院
- 小升初古詩閱讀專項(xiàng)訓(xùn)練合集(含答案)
- 井下支護(hù)安全操作規(guī)程
- 《爆破基礎(chǔ)知識》課件
- 十大醫(yī)藥代表成功經(jīng)驗(yàn)分享
評論
0/150
提交評論