第三章 匯編語言及程序設(shè)計(jì)1.ppt_第1頁
第三章 匯編語言及程序設(shè)計(jì)1.ppt_第2頁
第三章 匯編語言及程序設(shè)計(jì)1.ppt_第3頁
第三章 匯編語言及程序設(shè)計(jì)1.ppt_第4頁
第三章 匯編語言及程序設(shè)計(jì)1.ppt_第5頁
已閱讀5頁,還剩118頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第三章匯編語言及程序設(shè)計(jì) 3 18086 8088的指令系統(tǒng) 指令是控制計(jì)算機(jī)進(jìn)行各種操作的命令 指令系統(tǒng)是CPU所能執(zhí)行指令的集合 8086指令系統(tǒng)是其他微處理器指令的基礎(chǔ) 3 1 1指令的構(gòu)成和操作數(shù)的類型 1 指令的構(gòu)成指令格式 指令由操作碼字段和操作數(shù)字段組成 操作碼 指計(jì)算機(jī)所要執(zhí)行的操作 或稱為指出操作類型 是一種助記符 操作數(shù) 指在指令執(zhí)行操作的過程中所需要的操作數(shù) 該字段除可以是操作數(shù)本身外 也可以是操作數(shù)地址或是地址的一部分 還可以是指向操作數(shù)地址的指針或其它有關(guān)操作數(shù)的信息 雙操作數(shù)分為源操作數(shù) SRC 和目標(biāo)操作數(shù) DST 并由目標(biāo)操作數(shù)存放運(yùn)算結(jié)果 2 操作數(shù)的類型立即數(shù)操作數(shù) 數(shù)值直接存放在指令中 立即數(shù)可以是8位的 也可以是16位的有符號(hào)數(shù)或無符號(hào)數(shù) 寄存器操作數(shù) 數(shù)值存放寄存器中 指令中帶有寄存器的號(hào)碼 存儲(chǔ)器操作數(shù) 數(shù)值存放內(nèi)部存儲(chǔ)器中 指令中帶有存儲(chǔ)器的地址 3 1 2尋址方式 尋址方式就是指令中用于說明操作數(shù)所在地址的方法 或者說是尋找操作數(shù)有效地址的方法 1 立即尋址所提供的操作數(shù)直接包含在指令中 它緊跟在操作碼的后面 與操作碼一起放在代碼段區(qū)域中 例如 MOVAX 0A7FH立即數(shù)可以是8位的 也可以是16位的 若是16位的 則存儲(chǔ)時(shí)低位在前 高位在后 用來給寄存器或存儲(chǔ)器賦初值 2 寄存器尋址 操作數(shù)包含在CPU的內(nèi)部寄存器中 如寄存器AX BX CX DX等 例如 MOVDS AXMOVAL BH 3 直接尋址 操作數(shù)地址的16位偏移量直接包含在指令中 它與操作碼 起存放在代碼段區(qū)域 操作數(shù)一般在數(shù)據(jù)段區(qū)域中 它的地址為數(shù)據(jù)段寄存器DS加上這16位地址偏移量 MOVAX 2000H 4 寄存器間接尋址 操作數(shù)是在存儲(chǔ)器中 但是 操作數(shù)地址的16位偏移量包含在以下四個(gè)寄存器SI DI BP BX之一中 以SI DI BX間接尋址 則通常操作數(shù)在現(xiàn)行數(shù)據(jù)段區(qū)域中 即數(shù)據(jù)段寄存器 DS 16加上SI DI BX中的16位偏移量 為操作數(shù)的地址 例如 MOVAX SI 操作數(shù)地址是 DS 16 SI 以寄存器BP間接尋址 則操作數(shù)在堆棧段區(qū)域中 即堆棧段寄存器 SS 16與BP的內(nèi)容相加作為操作數(shù)的地址 例如 MOVAX BP 操作數(shù)地址是 SS 16 BP 5 寄存器相對(duì)尋址 由指定的寄存器內(nèi)容 加上指令中給出的8位或16位偏移量作為操作數(shù)的偏移地址 可以作為寄存器變址尋址的四個(gè)寄存器是SI DI BX BP 若用SI DI和BX作為變址 則與數(shù)據(jù)段寄存器相加 若用BP變址 則與堆棧段寄存器相加 形成操作數(shù)的地址即默認(rèn)在堆棧段 例如 MOVAX COUNT SI 操作數(shù)地址是 DS 16 SI COUNT 6 基址變址尋址 操作數(shù)在存貯器中 其偏移地址由 基址寄存器 變址寄存器 形成 把BX和BP看成是基址寄存器 把SI DI看著是變址寄存器 例如 MOVAX BX SI 或MOVAX BX SI 7 相對(duì)基址變址尋址 操作數(shù)在存貯器中 其偏移地址由 基址寄存器 變址寄存器 相對(duì)偏移量形成 把BX和BP看成是基址寄存器 把SI DI看著是變址寄存器 再加上指令中指定的8位或16位偏移量作為操作數(shù)的偏移地址 例如 MOVAX 0318H BX SI 3 1 38086 8088指令系統(tǒng) 1 數(shù)據(jù)傳送 DataTranster 2 算術(shù)運(yùn)算 Arithmetic 3 邏輯運(yùn)算 Logic 4 串操作 Stringmenipulation 5 程序控制 ProgramControl 6 處理器控制 ProcessorControl 一 數(shù)據(jù)傳送指令 1 數(shù)據(jù)傳送MOV指令一般格式 MOVDST SRCMOV是操作碼 DST和SRC分別是目的操作數(shù)和源操作數(shù) 功能 完成數(shù)據(jù)傳送 將源操作數(shù)的內(nèi)容傳到目的操作數(shù) 但源操作數(shù)的內(nèi)容不變 具體來說 一條數(shù)據(jù)傳送指令能實(shí)現(xiàn) CPU內(nèi)部寄存器之間數(shù)據(jù)的任意傳送 除了代碼段寄存器CS和指令指針I(yè)P以外 MOVAL BL 字節(jié)傳送MOVCX BX 字傳送MOVDS BX 立即數(shù)傳送至CPU內(nèi)部的通用寄存器組 即AX BX CX DX BP SP SI DI MOVCL 4MOVAX 03FFHMOVSI 057BH 能實(shí)現(xiàn)用立即數(shù)給存儲(chǔ)單元賦值例如 MOV 2000H 25HMOV SI 35H CPU內(nèi)部寄存器 除了CS和IP以外 與存儲(chǔ)器 所有尋址方式 之間的數(shù)據(jù)傳送 MOVAL BUFFERMOVAX SI MOV DI CXMOVSI BLOCK BP MOVDS DATA SI BX MOVDEST BP DI ES MOV指令應(yīng)注意幾個(gè)問題 可進(jìn)行8位 16位的數(shù)據(jù)操作 源操作數(shù)與目的操作數(shù)的數(shù)據(jù)類型要一致 存儲(chǔ)器間不能直接傳送 兩個(gè)段寄存器之間不能直接傳送信息 立即數(shù)不能作為目標(biāo)操作數(shù) 也不能直接傳送到段寄存器 CS和IP不能作為目標(biāo)操作數(shù) 2 堆棧指令 堆棧是一種數(shù)據(jù)存取的方式 與隊(duì)列比較 特點(diǎn)為先進(jìn)后出 包括入棧 PUSH 和出棧 POP 指令兩類 僅能進(jìn)行字運(yùn)算 操作數(shù)不能是立即數(shù) 堆棧區(qū)存數(shù)據(jù)時(shí)總是從高位開始向低位方向增長(zhǎng) 堆棧在內(nèi)存的地址由SS指明 堆棧指針SP指向堆棧區(qū)的棧頂 存放棧頂?shù)钠频刂?入棧指令PUSH一般格式 PUSHSRC源操作數(shù)可以是CPU內(nèi)部的16位通用寄存器 段寄存器和內(nèi)存操作數(shù) 所有尋址方式 入棧操作對(duì)象必須是16位數(shù) 功能 將數(shù)據(jù)壓入堆棧執(zhí)行步驟為 SP SP 2 SP 操作數(shù)低8位 SP 1 操作數(shù)高8位例如 PUSHBX執(zhí)行過程為 SP SP 1 SP BH SP SP 1 SP BL 出棧指令POP一般格式 POPDST功能 將數(shù)據(jù)彈出堆棧 對(duì)指令執(zhí)行的要求同入棧指令 CS IP除外 執(zhí)行步驟為 操作數(shù)低8位 SP 操作數(shù)高8位 SP 1 SP SP 2例如 POPAXPOP BX POPDS 3 交換指令XCHG 一般格式 XCHGDST SRC功能 完成數(shù)據(jù)交換交換指令 把一個(gè)字節(jié)或一個(gè)字的源操作數(shù)與目的操作數(shù)相交換 交換能在通用寄存器之間 通用寄存器與存儲(chǔ)器之間進(jìn)行 但段寄存器和立即數(shù)不能作為操作數(shù) 例如 XCHGAL CLXCHGAX DIXCHGBX SIXCHGAX BUFFERXCHGDATA SI DH 4 累加器專用傳送指令 IN指令一般格式 INAL n BAL n INAX n WAX n 1 n INAL DX BAL DX INAX DX WAX DX 1 DX 功能 從I O端口輸入數(shù)據(jù)至AL或AX 輸入指令允許把一個(gè)字節(jié)或一個(gè)字由一個(gè)輸入端口傳送到AL或AX中 若端口地址超過255時(shí) 則必須用DX保存端口地址 這樣用DX作端口尋址最多可尋找64K個(gè)端口 例 INAL 78H MOVDX 347H INAL DX OUT指令一般格式 OUTn AL BAL n OUTn AX WAX n 1 n OUTDX AL BAL DX OUTDX AX WAX DX 1 DX 功能 將AL或AX的內(nèi)容輸出至I O端口 該指令將AL或AX中的內(nèi)容傳送到一個(gè)輸出端口 端口尋址方式與IN指令相同 例 OUT79H AL MOVDX 347H OUTDX AL XLAT指令一般格式 XLAT AL DS 16 BX AL 功能 完成一個(gè)字節(jié)的查表轉(zhuǎn)換 要求 寄存器AL的內(nèi)容作為一個(gè)256字節(jié)的表的下標(biāo) 表的基地址在BX中 轉(zhuǎn)換后的結(jié)果存放在AL中 例如 MOVBX OFFSETTABLEMOVAL 1XLAT 查表OUT1 AL AL AAH本指令可用在數(shù)制轉(zhuǎn)換 函數(shù)表查表 代碼轉(zhuǎn)換等場(chǎng)合 5 地址傳送指令 有三條地址傳送指令 LEA一般格式 LEADST SRC功能 把源操作數(shù)SRC的地址偏移量傳送至目的操作數(shù)DST 要求 源操作數(shù)必須是一個(gè)內(nèi)存操作數(shù) 目的操作數(shù)必須是一個(gè)16位的通用寄存器 這條指令通常用來建立串操作指令所須的寄存器指針 例 LEABX BUFR 把變量BUFR的地址偏移量部分送到BX MOVBX BUFR 把變量BUFR的內(nèi)容送到BX MOVBX OFFSETBUFR 把變量BUFR的地址偏移量部分送到BX LDS一般格式 LDSDST SRC功能 完成一個(gè)地址指針的傳送 地址指針包括段地址部分和偏移量部分 指令將段地址送入DS 偏移量部分送入一個(gè)16位的指針寄存器或變址寄存器 要求 源操作數(shù)是一個(gè)內(nèi)存操作數(shù) 目的操作數(shù)是一個(gè)通用寄存器 變址寄存器 例如 LDSSI BX 將把BX所指的32位地址指針的段地址部分送入DS 偏移量部分送入SI LES LoadpointerintoES 一般格式 LESDST SRC這條指令除將地址指針的段地址部分送入ES外 與LDS類似 例如 LESDI BX COUNT 6 標(biāo)志寄存器傳送 LAHF將標(biāo)志寄存器中的SF ZF AF PF和CF 即低8位 傳送至AH寄存器的指定位 空位沒有定義 SAHF將寄存器AH的指定位 送至標(biāo)志寄存器的SF ZF AF PF和CF位 即低8位 根據(jù)AH的內(nèi)容 影響上述標(biāo)志位 對(duì)OF DF和IF無影響 PUSHF將標(biāo)志寄存器壓入堆棧頂部 同時(shí)修改堆棧指針 不影響標(biāo)志位 POPF堆棧頂部的一個(gè)字 傳送到標(biāo)志寄存器 同時(shí)修改堆棧指針 影響標(biāo)志位 二 算術(shù)運(yùn)算指令 8086 8088提供加 減 乘 除四種基本算術(shù)操作 這些操作都可用于字節(jié)或字的運(yùn)算 也可以用于帶符號(hào)數(shù)與無符號(hào)數(shù)的運(yùn)算 帶符號(hào)數(shù)用補(bǔ)碼表示 同時(shí)8086 8088也提供了各種校正操作 故可以進(jìn)行十進(jìn)制算術(shù)運(yùn)算算術(shù)運(yùn)算操作會(huì)影響標(biāo)志寄存器 加 減運(yùn)算會(huì)影響大部分的標(biāo)志位 但加 減 指令不影響 位 1 加法指令 Addition 一般形式 ADDDST SRC功能 DST DST SRC 完成兩個(gè)操作數(shù)相加 結(jié)果送至目的操作數(shù)DST 目的操作數(shù)可以是累加器 任一通用寄存器以及存儲(chǔ)器操作數(shù) 例如 ADDAL 30 累加器與立即數(shù)相加ADDBX 3000H 通用寄存器與存儲(chǔ)單元內(nèi)容相加ADDDI CX 通用寄存器之間 ADDDX DATA BX SI 通用寄存器與存儲(chǔ)單元內(nèi)容相加ADDBETA SI DX 存儲(chǔ)器操作數(shù)與寄存器相加這些指令對(duì)標(biāo)志位CF DF PF SF ZF和AF有影響 一般形式 ADCDST SRC 帶進(jìn)位的加法功能 DST DST SRC CF這條指令與上 條指令類似 只是在兩個(gè)操作數(shù)相加時(shí) 要把進(jìn)位標(biāo)志CF的現(xiàn)行值加上去 結(jié)果送至目的操作數(shù) 例如 ADCAL 30 累加器與立即數(shù)相加ADCBX 3000H 通用寄存器與存儲(chǔ)單元內(nèi)容相加 例 若有兩個(gè)四字節(jié)的數(shù) 已分別放在自FIRST和SECOND開始的存儲(chǔ)區(qū)中 每個(gè)數(shù)占四個(gè)存儲(chǔ)單元 存放時(shí) 最低字節(jié)在地址最低處 用以下程序段實(shí)現(xiàn)相加 MOVAX FIRSTADDAX SECOND ADDAX FIRST 4 MOVSECOND AX MOVFIRST 4 AX MOVAX FIRST 2ADDAX SECOND 2 ADCAX FIRST 6 MOVSECOND 2 AX MOVFIRST 6 AXMOVAX 0HADCAX 0MOVFIRST 8 AX 一般形式 INCDST 功能 DST DST 1完成對(duì)指定的操作數(shù)DST加1 然后返回此操作數(shù) 此指令主要用于在循環(huán)程序中修改地址指針和循環(huán)次數(shù)等 這條指令執(zhí)行的結(jié)果影響標(biāo)志位AF OF PF SF和ZF 而對(duì)進(jìn)位標(biāo)志沒有影響 如 INCALINC BX 2 減法指令 Subtraction 一般形式 SUBDST SRC 功能 DST DST SRC 完成兩個(gè)操作數(shù)相減 也即從DST中減去SRC 結(jié)果放在DST例如 SUBCX BXSUB BP CL 一般形式 SBBDST SRC 功能 DST DST SRC CF這條指令與SUB類似 只是在兩個(gè)操作數(shù)相減時(shí) 還要減去借位標(biāo)志CF的現(xiàn)行值 本指令對(duì)標(biāo)志位AF CF OF PF SF和ZF都有影響 同ADC指令一樣 本指令主要用于多字節(jié)操作數(shù)相減 一般形式 DECDST 功能 DST DST 1對(duì)指令的操作數(shù)減1 然后送回此操作數(shù) 在相減時(shí) 把操作數(shù)作為一個(gè)無符號(hào)二進(jìn)制數(shù)來對(duì)待 指令執(zhí)行的結(jié)果 影響標(biāo)志AF OF PF SF和ZF 但對(duì)CF標(biāo)志不影響 即保持此指令以前的值 例如 DEC SI DECCL 例 將存放在內(nèi)存中 和 中的兩個(gè) 字節(jié)長(zhǎng)度的數(shù)相加 結(jié)果放在 中 一般形式 NEGDST功能 取補(bǔ) 對(duì)操作數(shù)取補(bǔ) 即用零減去操作數(shù) 再把結(jié)果送回操作數(shù) 例如 NEGALNEGMULRE AL 00111100 則取補(bǔ)后為11000100即00000000 00111100 11000100若在字節(jié)操作時(shí)對(duì) 128 或在字操作時(shí)對(duì) 32768取補(bǔ) 則操作數(shù)沒變化 但標(biāo)志OF置位 此指令影響標(biāo)志AF CF OF PF SF和ZF 此指令的結(jié)果一般總是使標(biāo)志CF 1 除非在操作數(shù)為零時(shí) 才使CF 0 一般形式 CMPDST SRC 功能 DST SRC 比較指令完成兩個(gè)操作數(shù)相減 使結(jié)果反映在標(biāo)志位上 但并不送回結(jié)果 即不帶回送的減法 例如 CMPAL 100CMPDX DICMPCX COUHT BP CMPCOUNT SI AX比較指令主要用于比較兩個(gè)數(shù)之間的關(guān)系 在比較指令之后 根據(jù)ZF標(biāo)志即可判斷兩者是否相等 相等的比較 若兩者相等 相減以后結(jié)果為零 ZF標(biāo)志為1 否則為0 若兩者不相等 則可在比較指令之后利用其它標(biāo)志位的狀態(tài)來確定兩者的大小 大小的比較 如果是兩個(gè)無符號(hào)數(shù) 如CMPAX BX 進(jìn)行比較 則可以根據(jù)CF標(biāo)志的狀態(tài)判斷兩數(shù)大小 若結(jié)果沒有產(chǎn)生借位 CF 0 顯然AX BX 若產(chǎn)生了借位 即CF 1 則AX BX 3 乘法指令 分為無符號(hào)乘法指令和帶符號(hào)乘法指令兩類 1 無符號(hào)乘法指令MUL一般格式 MULSRC完成字節(jié)與字節(jié)相乘 字與字相乘 且默認(rèn)的操作數(shù)放在AL或AX中 而源操作數(shù)由指令給出 8位數(shù)相乘 結(jié)果為16位數(shù) 放在AX中 16位數(shù)相乘結(jié)果為32位數(shù) 高16位放在DX 低16位放在AX中 注意 源操作數(shù)不能為立即數(shù) 例如 MOVAL FIRST MULSECOND 結(jié)果為AX FIRST SECONDMOVAX THIRD MULAX 結(jié)果DX AX THIRD THIRDMOVAL 30HCBW 字?jǐn)U展AX 30HMOVBX 2000HMULBX 2 帶符號(hào)數(shù)乘法指令I(lǐng)MUL一般格式 IMULSRC SRC為源操作數(shù)這是一條帶符號(hào)數(shù)的乘法指令 同MUL一樣可以進(jìn)行字節(jié)與字節(jié) 字和字的乘法運(yùn)算 結(jié)果放在AX或DX AX中 當(dāng)結(jié)果的高半部分不是結(jié)果的低半部分的符號(hào)擴(kuò)展時(shí) 標(biāo)志位CF和OF將置位 4 除法指令 1 無符號(hào)數(shù)除法指令DIV一般格式 DIVSRC 2 帶符號(hào)數(shù)除法IDIV一般格式 IDIVSRC該指令執(zhí)行過程同DIV指令 但I(xiàn)DIV指令認(rèn)為操作數(shù)的最高位為符號(hào)位 除法運(yùn)算的結(jié)果商的最高位也為符號(hào)位 例如 AX 2000H DX 200H BX 1000H 則DIVBX執(zhí)行后 AX 2002H DX 0000 除法運(yùn)算中 源操作數(shù)可為除立即尋址方式之外的任何一種尋址方式 且指令執(zhí)行對(duì)所有的標(biāo)志位都無定義 由于除法指令中的字節(jié)運(yùn)算要求被除數(shù)為16位數(shù) 而字運(yùn)算要求被除數(shù)是32位數(shù) 在8086 8088系統(tǒng)中往往需要用符號(hào)擴(kuò)展的方法取得被除數(shù)所要的格式 因此指令系統(tǒng)中包括兩條符號(hào)擴(kuò)展指令 3 字節(jié)擴(kuò)展指令CBW一般格式 CBW該指令執(zhí)行時(shí)將AL寄存器的最高位擴(kuò)展到AH 4 字?jǐn)U展指令CWD一般格式 CWD該指令執(zhí)行時(shí)將AX寄存器的最高位擴(kuò)展到DX CBW CWD指令不影響標(biāo)志位 5 十進(jìn)制調(diào)整指令 針對(duì)十進(jìn)制算術(shù)運(yùn)算有一類十進(jìn)制調(diào)整指令 壓縮BCD碼的十進(jìn)制加法調(diào)整DAA 壓縮BCD碼的十進(jìn)制減法調(diào)整DAS 非壓縮BCD碼的十進(jìn)制加法調(diào)整AAA BCD碼進(jìn)行乘除法運(yùn)算時(shí) 一律使用費(fèi)壓縮無符號(hào)數(shù)形式 因而AAM和AAD應(yīng)固定地出現(xiàn)在MUL之前和DIV之后 三 邏輯運(yùn)算和移位指令 1 邏輯運(yùn)算指令 1 一般格式 NOTSRC功能 對(duì)操作數(shù)求反 然后送回原處 操作數(shù)可以是寄存器或存儲(chǔ)器內(nèi)容 此指令對(duì)標(biāo)志無影響 例如 NOTAL 2 一般格式 ANDDST SRC功能 對(duì)兩個(gè)操作數(shù)進(jìn)行按位的邏輯 與 運(yùn)算 結(jié)果送回目的操作數(shù) 其中目的操作數(shù)DST可以是累加器 任一通用寄存器 或內(nèi)存操作數(shù) 所有尋址方式 源操作數(shù)SRC可以是立即數(shù) 寄存器 也可以是內(nèi)存操作數(shù) 所有尋址方式 指令可以進(jìn)行字節(jié)操作 也可以進(jìn)行字操作 例如 ANDAL 0FH 可完成拆字的動(dòng)作ANDSI 0H 將SI清0 3 一般格式 TESTDST SRC功能 完成與AND指令相同的操作 結(jié)果反映在標(biāo)志位上 但并不送回 通常使用它進(jìn)行測(cè)試 例如若要檢測(cè)AL中的最低位是否為1 為1則轉(zhuǎn)移 可用以下指令 TESTAL 01HJNZTHERE THERE 若要檢測(cè)CX中的內(nèi)容是否為0 為0則轉(zhuǎn)移 該如何做呢 4 一般格式 ORDST SRC功能 對(duì)指定的兩個(gè)操作數(shù)進(jìn)行邏輯 或 運(yùn)算 結(jié)果送回目的操作數(shù) 其中 目的操作數(shù)DST 可以是累加器 可以是任 通用寄存器 也可以是一個(gè)內(nèi)存操作數(shù) 所有尋址方式 源操作數(shù)SRC 可以是立即數(shù) 寄存器 也可以是內(nèi)存操作數(shù) 所有尋址方式 ANDAL 0FHANDAH 0F0HORAL AH 完成拼字的動(dòng)作ORAX 0FFFH 將AX低12位置1ORBX BX 清相應(yīng)標(biāo)志 5 一般格式 XORDST SRC功能 對(duì)兩個(gè)指定的操作數(shù)進(jìn)行 異或 運(yùn)算 結(jié)果送回目的操作數(shù) 其中 目的操作數(shù)DST可以是累加器 可以是任一個(gè)通用寄存器 也可以是一個(gè)內(nèi)存操作數(shù) 全部尋址方式 源操作數(shù)可以是立即數(shù) 寄存器 也可以是內(nèi)存操作數(shù) 所有尋址方式 例如 XORAL AL 使AL清0XORSI SI 使SI清0XORCL 0FH 使低4位取反 高4位不變 邏輯運(yùn)算類指令中 單操作數(shù)指令NOT的操作數(shù)不能為立即數(shù) 雙操作數(shù)邏輯指令中 必須有一個(gè)操作數(shù)為寄存器尋址方式 且目的操作數(shù)不能為立即數(shù) 它們對(duì)標(biāo)志位的影響情況如下 NOT不影響標(biāo)志位 其它四種指令將使CF OF 0 AF無定義 而SF ZF和PF則根據(jù)運(yùn)算結(jié)果而定 2 移位指令 算術(shù)左移或邏輯左移指令SAL SHLOPR M M是移位次數(shù) 可以是1或寄存器CL這些指令可以對(duì)寄存器操作數(shù)或內(nèi)存操作數(shù)進(jìn)行指定的移位 可以進(jìn)行字節(jié)或字操作 可以一次只移1位 也可以移位由寄存器CL中的內(nèi)容規(guī)定的次數(shù) 算術(shù)右移指令SAROPR M 邏輯右移指令SHROPR M 2 循環(huán)移位指令 ROLOPR M 左循環(huán)移位ROROPR M 右循環(huán)移位未把標(biāo)志位CF包含在循環(huán)的環(huán)中 RCLOPR M 帶進(jìn)位左循環(huán)移位RCROPR M 帶進(jìn)位右循環(huán)移位把標(biāo)志位CF包含在循環(huán)中 作為整個(gè)循環(huán)一部分 四 串操作類指令 串操作類指令可以用來實(shí)現(xiàn)內(nèi)存區(qū)域的數(shù)據(jù)串操作 這些數(shù)據(jù)串可以是字節(jié)串 也可以是字串 1 重復(fù)指令前綴串操作類指令可以與重復(fù)指令前綴配合使用 從而可以使操作得以重復(fù)進(jìn)行 及時(shí)停止 重復(fù)指令前綴的幾種形式見表所示 舉例說明 2 串指令 對(duì)串指令要注意以下幾個(gè)問題 各指令所使用的默認(rèn)寄存器是 SI 源串地址 DI 目的地址 CX 字串長(zhǎng)度 AL 存取或搜索的默認(rèn)值 源串在數(shù)據(jù)段 目的串在附加段 方向標(biāo)志與地址指針的修改 DF 1 則修改地址指針時(shí)用減法 DF 0時(shí) 則修改地址指針時(shí)用加法 MOVS STOS LODS指令不影響標(biāo)志位 MOVS指令的功能MOVSDST SCRMOVSB 字節(jié)傳送MOVSW 字傳送把數(shù)據(jù)段中由SI間接尋址的一個(gè)字節(jié) 或一個(gè)字 傳送到附加段中由DI間接尋址的一個(gè)字節(jié)單元 或一個(gè)字單元 中去 然后 根據(jù)方向標(biāo)志DF及所傳送數(shù)據(jù)的類型 字節(jié)或字 對(duì)SI及DI進(jìn)行修改 在指令重復(fù)前綴REP的控制下 可將數(shù)據(jù)段中的整串?dāng)?shù)據(jù)傳送到附加段中去 例在數(shù)據(jù)段中有一字符串 其長(zhǎng)度為100 要求把它們傳送到附加段中的一個(gè)緩沖區(qū)中 其中源串存放在數(shù)據(jù)段中從符號(hào)地址1000H開始的存儲(chǔ)區(qū)域內(nèi) 每個(gè)字符占一個(gè)字節(jié) 2000H為附加段中用以存放字符串區(qū)域的首地址 MOVSI 1000H 置源串偏移地址MOVDI 2000H 置目的串偏移地址MOVCX 100 置串長(zhǎng)度CLD 方向標(biāo)志復(fù)位REPMOVSB 字符串傳送 CMPS指令的功能 把數(shù)據(jù)段中由SI間接尋址的一個(gè)字節(jié) 或一個(gè)字 與附加段中由DI間接尋址的一個(gè)字節(jié) 或一個(gè)字 進(jìn)行比較操作 使比較的結(jié)果影響標(biāo)志位 然后根據(jù)方向標(biāo)志DF及所進(jìn)行比較的操作數(shù)類型 字節(jié)或字 對(duì)SI及DI進(jìn)行修改 在指令重復(fù)前綴REPE REPZ或者REPNE REPNZ的控制下 可在兩個(gè)數(shù)據(jù)串中尋找第一個(gè)不相等的字節(jié) 或字 或者第一個(gè)相等的字節(jié) 或字 例在數(shù)據(jù)段中有一字符串 其長(zhǎng)度為17 存放在數(shù)據(jù)段中從符號(hào)地址MESS1開始的區(qū)域中 同樣在附加段中有一長(zhǎng)度相等的字符串 存放在附加段中從符號(hào)地址MESS2開始的區(qū)域中 現(xiàn)要求找出它們之間不相匹配的位置 實(shí)現(xiàn)上述功能的程序段如下 LEASI MESS1 裝入源串偏移地址LEADI MESS2 裝入目的串偏移地址MOVCX 17 裝入字符串長(zhǎng)度CLD 方向標(biāo)志復(fù)位REPECMPSB上述程序段執(zhí)行之后 SI或DI的內(nèi)容即為兩字符串中第一個(gè)不匹配字符的下一個(gè)字符的位置 若兩字符串中沒有不匹配的字符 則當(dāng)比較完畢后 CX 0 退出重復(fù)操作狀態(tài) SCAS指令的功能 用由指令指定的關(guān)鍵字節(jié)或關(guān)鍵字 分別存放在AL及AX寄存器中 與附加段中由DI間接尋址的字節(jié)串 或字串 中的一個(gè)字節(jié) 或字 進(jìn)行比較操作 使比較的結(jié)果影響標(biāo)志位 然后根據(jù)方向標(biāo)志DF及所進(jìn)行操作的數(shù)據(jù)類型 字節(jié)或字 對(duì)DI進(jìn)行修改 在指令重復(fù)前綴REPE REPZ或REPNE REPNZ的控制下 可在指定的數(shù)據(jù)串中搜索第一個(gè)與關(guān)鍵字節(jié) 或字 匹配的字節(jié) 或字 或者搜索第一個(gè)與關(guān)鍵字節(jié) 或字 不匹配的字節(jié) 或字 例在附加段中有一個(gè)字符串 存放在以符號(hào)地址MESS2開始的區(qū)域中 長(zhǎng)度為17 要求在該字符串中搜索空格符 ASCII碼為20H 實(shí)現(xiàn)上述功能的程序段如下 LEADI MESS2 裝入目的串偏移地址MOVAL 20H 裝入關(guān)鍵字節(jié)MOVCX 17 裝入字符串長(zhǎng)度REPNESCASB上述程序段執(zhí)行之后 DI的內(nèi)容即為相匹配字符的下一個(gè)字符的地址 CX中是剩下還未比較的字符個(gè)數(shù) 若字符串中沒有所要搜索的關(guān)鍵字節(jié) 或字 則當(dāng)查完之后 CX 0退出重復(fù)操作狀態(tài) STOS指令的功能 把指令中指定的一個(gè)字節(jié)或一個(gè)字 分別存放在AL及AX寄存器中 傳送到附加段中由DI間接尋址的字節(jié)內(nèi)存單元 或字內(nèi)存單元 中去 然后 根據(jù)方向標(biāo)志DF及所進(jìn)行操作的數(shù)據(jù)類型 字節(jié)或字 對(duì)DI進(jìn)行修改操作 在指令重復(fù)前綴的控制下 可連續(xù)將AL AX 的內(nèi)容存入到附加段中的一段內(nèi)存區(qū)域中去 該指令不影標(biāo)志位 例要對(duì)附加段中從MESS2開始的5個(gè)連續(xù)的內(nèi)存字節(jié)單元進(jìn)行清0操作 可用下列程序段實(shí)現(xiàn) LEADI MESS2 裝入目的區(qū)域偏移地址MOVAL 00H 為清零操作準(zhǔn)備MOVCX 5 設(shè)置區(qū)域長(zhǎng)度REPSTOSB LODS指令的功能 從串中取指令實(shí)現(xiàn)從指定的字節(jié)串 或字串 中讀出信息的操作 例比較DEST和SOURCE中的500個(gè)字節(jié) 找出第一個(gè)不相同的字節(jié) 如果找到 則將SOURCE中的這個(gè)數(shù)送AL中 CLDLEADI DESTLEASI SOURCEMOVCX 500REPECMPSBJCXZNEXTMATCH DECSIMOVAL BYTEPTR SI NEXT 五 程序控制指令 轉(zhuǎn)移類指令可改變CS與IP的值或僅改變IP的值 以改變指令執(zhí)行的順序 1 無條件轉(zhuǎn)移 調(diào)用和返回指令 1 無條件轉(zhuǎn)移指令JMP分直接轉(zhuǎn)移和間接轉(zhuǎn)移兩種 一般格式 JMPDST DST是轉(zhuǎn)移的目的地址 直接轉(zhuǎn)移的3種形式為 短程轉(zhuǎn)移JMPSHORTDST IP IP 8位位移量目的地址與JMP指令所處地址的距離應(yīng)在 128 127范圍之內(nèi) 近程轉(zhuǎn)移JMPNEARPTRDST IP IP 16位位移量或JMPDST NEAR可省略目的地址與JMP指令應(yīng)處于同一地址段范圍之內(nèi) 遠(yuǎn)程轉(zhuǎn)移JMPFARPTRDST IP DST的段內(nèi)位移量 CS DST所在段地址 遠(yuǎn)程轉(zhuǎn)移是段間的轉(zhuǎn)移 目的地址與JMP指令所在地址不在同一段內(nèi) 要修改CS和IP的內(nèi)容 間接轉(zhuǎn)移指令的目的地址可以由存儲(chǔ)器或寄存器給出 段內(nèi)間接轉(zhuǎn)移JMPWORDPTRDST IP EA 由DST的尋址方式確定 JMPWORDPTR BX IP DS 16 BX JMPWORDPTRBXIP BX 段間間接轉(zhuǎn)移JMPDOWRDPTRDST IP EA CS EA 2 該指令指定的雙字節(jié)指針的第一個(gè)字單元內(nèi)容送IP 第二個(gè)字單元內(nèi)容送CS JMPDWORDPTR BX SI 2 調(diào)用和返回指令CALL指令用來調(diào)用一個(gè)過程或子程序 由于過程或子程序有段間 即遠(yuǎn)程FAR 和段內(nèi)調(diào)用 即近程N(yùn)EAR 之分 所以CALL也有FAR和NEAR之分 因此RET也分段間與段內(nèi)返回兩種 調(diào)用指令一般格式為 段內(nèi)直接調(diào)用 CALLNEARPTRDST 操作 SP SP 2 SP 1 SP IP IP IP 16位位移量CALL指令首先將當(dāng)前IP內(nèi)容壓入堆棧 執(zhí)行RET指令而返回時(shí) 從堆棧中取出一個(gè)字放入IP中 段間直接調(diào)用 CALLFARPTRDST 操作 SP SP 2 SP 1 SP CS SP SP 2 SP 1 SP IP IP DST偏移地址 CS DST段地址CALL指令先把CS壓入堆棧 再把IP壓入堆棧 當(dāng)執(zhí)行RET指令而返回時(shí) 從堆棧中取出一個(gè)字放入IP中 然后從堆棧中再取出第二個(gè)字放入CS中 作為段間返回地址 段內(nèi)間接調(diào)用 CAL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論