詳解匯編語言各種指令的解釋與用法
【數(shù)據(jù)傳輸指令】
一、通用數(shù)據(jù)傳送指令
1、傳送指令MOV(move)
指令的匯編格式:MOV DST,SRC 指令的基本功能:(DST)<-(SRC) 將原操作數(shù)(字節(jié)或字)傳送到目的地址。指令支持的尋址方式:目的操作數(shù)和源操作數(shù)不能同時(shí)用存儲(chǔ)器尋址方式,這個(gè)限制適用于所有指令。指令的執(zhí)行對標(biāo)志位的影響:不影響標(biāo)志位。指令的特殊要求:目的操作數(shù)DST和源操作數(shù)SRC不允許同時(shí)為段寄存器;目的操作數(shù)DST不能是CS,也不能用立即數(shù)方式。
2、進(jìn)棧指令 PUSH(push onto the stack)
出棧指令 POP (pop from the stack) 指令的匯編格式:PUSH SRC ;POP DST 指令的基本功能:PUSH指令在程序中常用來暫存某些數(shù)據(jù),而POP指令又可將這些數(shù)據(jù)恢復(fù)。PUSH SRC (SP)<-(SP)-2 ;(SP)<-(SRC) POP DST (DST)<-((SP));(SP)<-(SP) 指令支持的尋址方式:push 和 pop指令不能不能使用立即數(shù)尋址方式。指令對標(biāo)志位的影響:PUSH 和 POP指令都不影響標(biāo)志位。指令的特殊要求:PUSH 和 POP指令只能是字操作,因此,存取字?jǐn)?shù)據(jù)后,SP的修改必須是+2 或者 -2; POP指令的DST不允許是CS寄存器;
3、交換指令 XCHG(exchange)
指令的匯編格式:XCHG OPR1,OPR2 指令的基本功能:(OPR1)<->(OPR2) 指令支持的尋址方式:一個(gè)操作數(shù)必須在寄存器中,另一個(gè)操作數(shù)可以在寄存器或存儲(chǔ)器中。指令對標(biāo)志位的影戲:不影響標(biāo)志位。指令的特殊要求:不允許使用段寄存器。
二、累加器專用傳送指令
4、輸入指令 IN(input)
輸出指令 OUT (output) 指令的匯編格式:IN ac,port port<=0FFH IN ac,DX port>0FFH OUT port,ac port<=0FFH OUT DX,ac port>0FFH 指令的基本功能:對8086及其后繼機(jī)型的微處理機(jī),所有I/O端口與CPU之間的通信都由輸入輸出指令I(lǐng)N和OUT來完成。IN指令將信息從I/O輸入到CPU,OUT指令將信息從CPU輸出到I/O端口,因此,IN和OUT指令都要指出I/O端口地址。 IN ac,port port<=0FFH (AL)<-(port)傳送字節(jié) 或 (AX)<-(port+1,port)傳送字 IN ac,DX port>0FFH (AL)<-((DX))傳送字節(jié)或 (AX)<-((DX)+1,(DX))傳送字 OUT port,ac port<=0FFH (port)<-(AL)傳送字節(jié) 或 (port+1,port)<-(AX)傳送字 OUT DX,ac port>0FFH (DX)<-(AL)傳送字節(jié) 或 ((DX)+1,(DX))<-(AX)傳送字指令對標(biāo)志位的影響:不影響標(biāo)志位。指令的特殊要求:只限于在AL或AX與I/O端口之間傳送信息。傳送16位信息用AX,傳送8位信息用AL,這取決于外設(shè)端口的寬度。
5、換碼指令 XLAT(translate)
指令的匯編格式:XLAT opr 或 XLAT 指令的基本功能:這條指令根據(jù)AL寄存器提供的位移量,將BX指使的字節(jié)表格中的代碼換存在AL中。 (AL)<-((DS)*16+(BX)+(AL)) 指令對標(biāo)志位的影響:不影響標(biāo)志位。指令的特殊要求:所建字節(jié)表格的長度不能超過256字節(jié),因?yàn)榇娣盼灰屏康氖?位寄存器AL。opr為表格的首地址,因?yàn)閛pr所表示的偏移地址已存入BX寄存器,所以opr在換碼指令中可有可無,有則提高程序的可讀性。
三、地址傳送指令
6、有效地址傳送器 LEA(load effective address)
指令的匯編格式:LEA reg,src 指令的基本功能:LEA指令把源操作數(shù)的有效地址送到指定的寄存器,這個(gè)有效地址是由src選定的一種存儲(chǔ)器尋址方式確定的。指令支持的尋址方式:各種存儲(chǔ)器尋址方式。指令對標(biāo)志位的影響:不影響標(biāo)志位。指令的特出要求:指令中reg不能是段寄存器;
7、指針?biāo)图拇嫫骱虳S LDS(load DS with point)
指針?biāo)图拇嫫骱虴S LES (load ES with point) 指令的匯編格式:LDS reg,src LES reg,src 指令的基本功能:LDS和LES指令把確定內(nèi)存單元位置的偏移地址送寄存器,段地址DS或ES。這個(gè)偏移地址和段地址(也稱地址指針)是由src指定的兩個(gè)相繼字單元提供的。 LDS reg,src (reg)<-(src) (DS)<-(src+2) LES reg,src (reg)<-(src) (ES)<-(src+2) 指令支持的尋址方式:src必須為存儲(chǔ)器尋址方式指令對標(biāo)志位的影響:不影響標(biāo)志位。指令的特殊要求:指令中REG不能是段寄存器;
四、標(biāo)志寄存器傳送指令
8、標(biāo)志寄存器的低字節(jié)送AH LAHF(load AH with FLAGS)
指令的匯編格式:LAHF 指令的基本功能:(AH)<-(FLAGS)0-7 指令對標(biāo)志位的影響:不影響標(biāo)志位
9、AH送標(biāo)志寄存器低字節(jié) SAHF(store AH into FLAGS) 指令的格式:SAHF 指令的基本功能:(FLAGS)0-7<-(AH) 指令對標(biāo)志位的影響:由裝入值來確定標(biāo)志位的值。
10、標(biāo)志進(jìn)棧 PUSHF(push the flags)
指令的匯編格式:PUSHF 指令的基本功能:(SP)<-(SP)-2 ((SP)+1,(SP))<-(FLAGS)0-15 指令對標(biāo)志位的影響:不影響標(biāo)志位。
11、標(biāo)志出棧 POPF(pop the FLAGES)
指令的匯編格式:POPF 指令的基本功能:(FLAGS)0-15<-((SP)+1,(SP)) (SP)<-(SP)+2 指令對標(biāo)志位的影響:由裝入值來確定標(biāo)志位的值。
【算術(shù)指令】
一、加法指令
12、加法指令 ADD(addition)
指令的匯編格式:add dst,src 指令的基本功能:(dst)<-(src)+(dst) 指令支持的尋址方式:他們兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,源操作數(shù)和目地操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:SF=1 加法結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 加法結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 加法結(jié)果為零 ZF=0 加法結(jié)果不為零 CF=1 最高有效位向高位有進(jìn)位 CF=0 最高有效位向高位無進(jìn)位 OF=1 兩個(gè)同符號(hào)數(shù)相加(正數(shù)+正數(shù)或負(fù)數(shù)+負(fù)數(shù)),結(jié)果符號(hào)與其相反。 OF=0 兩個(gè)不同符號(hào)數(shù)相加,或同符號(hào)數(shù)相加,結(jié)果符號(hào)與其相同。
13、帶進(jìn)為加法指令 ADC(add with carry)
指令的匯編格式:ADD dst,src 指令的基本功能:(dst)<-(src)+(dst)+CF 指令支持的尋址方式:他們兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,源操作數(shù)和目地操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:SF=1 加法結(jié)果為負(fù)數(shù) SF=0 加法結(jié)果為正數(shù) ZF=1 加法結(jié)果為零 ZF=0 加法結(jié)果不為零 CF=1 最高有效位向高位有進(jìn)位 CF=0 最低有效位相高位無進(jìn)位 OF=1 兩個(gè)同符號(hào)數(shù)相加,結(jié)果符號(hào)與其相反, OF=0 兩個(gè)同符號(hào)數(shù)相加,或同符號(hào)相加,結(jié)果符號(hào)與其相同
14、加1指令 INC(increament)
指令的匯編格式:INC opr 指令的基本功能:(opr)<-(opr) 指令支持的尋址方式 可以使用除立即數(shù)方式外的任何尋址方式指令對標(biāo)志位的影響:SF=1 加法結(jié)果為負(fù)數(shù) SF=0 加法結(jié)果為正數(shù) ZF=1 加法結(jié)果為零 ZF=0 加法結(jié)果不為零 OF=1 兩個(gè)同符號(hào)數(shù)相加,結(jié)果符號(hào)與其相反, OF=0 兩個(gè)同符號(hào)數(shù)相加,或同符號(hào)相加,結(jié)果符號(hào)與其相同。
二、減法指令
15、減法指令 SUB(subtract) 指令的匯編格式:SUB dst,src 指令的基本功能:(dst)<-(dst)-(src) 指令支持的尋址方式:他們兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,源操作數(shù)和目地操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:SF=1 減法結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 減法結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 減法結(jié)果為零 ZF=0 減法結(jié)果不為零 CF=1 二進(jìn)制減法運(yùn)算中最高有效位向高位有借位(被減數(shù)小于減數(shù),不夠減的情況) CF=0 二進(jìn)制減法運(yùn)算中最高有效為向高位無借位(被減數(shù)〉=減數(shù),夠減的情況) OF=1 兩數(shù)符號(hào)相反(正數(shù)-負(fù)數(shù),或負(fù)數(shù)-正數(shù)),而結(jié)果符號(hào)與減數(shù)相同。 OF=0 同符號(hào)數(shù)相減時(shí),或不同符號(hào)數(shù)相減,其結(jié)果符號(hào)與減數(shù)不同。
16、帶借位減法指令 SBB(subtract with borrow)
指令的匯編格式:SBB dst,src 指令的基本功能:(dst)<-(dst)-(src)-CF 指令支持的尋址方式:他們兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,源操作數(shù)和目地操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:SF=1 減法結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 減法結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 減法結(jié)果為零 ZF=0 減法結(jié)果不為零 CF=1 二進(jìn)制減法運(yùn)算中最高有效位向高位有借位(被減數(shù)小于減數(shù),不夠減的情況) CF=0 二進(jìn)制減法運(yùn)算中最高有效為向高位無借位(被減數(shù)〉=減數(shù),夠減的情況) OF=1 兩數(shù)符號(hào)相反(正數(shù)-負(fù)數(shù),或負(fù)數(shù)-正數(shù)),而結(jié)果符號(hào)與減數(shù)相同。 OF=0 同符號(hào)數(shù)相減時(shí),或不同符號(hào)數(shù)相減,其結(jié)果符號(hào)與減數(shù)不同。
17、減1指令 DEC(decrement)
指令的匯編格式:DEC opr 指令的基本功能:(opr)<-(opr)-1 指令支持的尋址方式:可以使用除立即數(shù)方式外的任何尋址方式。指令對標(biāo)志位的影響:SF=1 減法結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 減法結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 減法結(jié)果為零 ZF=0 減法結(jié)果不為零 OF=1 兩數(shù)符號(hào)相反(正數(shù)-負(fù)數(shù),或負(fù)數(shù)-正數(shù)),而結(jié)果符號(hào)與減數(shù)相同。 OF=0 同符號(hào)數(shù)相減時(shí),或不同符號(hào)數(shù)相減,其結(jié)果符號(hào)與減數(shù)不同。
18、比較指令 CMP(compare)
指令的匯編格式:CMP opr1,opr2 指令的基本功能:(opr1)-(opr2),根據(jù)相減結(jié)果設(shè)置條件碼,但不回送結(jié)果。指令支持的尋址方式:他們兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,源操作數(shù)和目地操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:
SF=1 減法結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 減法結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 減法結(jié)果為零 ZF=0 減法結(jié)果不為零 CF=1 二進(jìn)制減法運(yùn)算中
最高有效位向高位有借位(被減數(shù)小于減數(shù),不夠減的情況) CF=0 二進(jìn)制減法運(yùn)算中最高有效為向高位無借位(被減數(shù)〉=減數(shù),夠減的情況) OF=1 兩數(shù)符號(hào)相反(正數(shù)-負(fù)數(shù),或負(fù)數(shù)-正數(shù)),而結(jié)果符號(hào)與減數(shù)相同。 OF=0 同符號(hào)數(shù)相減時(shí),或不同符號(hào)數(shù)相減,其結(jié)果符號(hào)與減數(shù)不同。
19、求補(bǔ)指令 NEG(negate)
指令的匯編格式:NEG opr 指令的基本功能:(opr)<- -(opr) 指令支持的尋址方式:可以使用除立即數(shù)方式外的任何尋址方式。指令對標(biāo)志位的影響:CF=1 不為0的操作數(shù)求補(bǔ)時(shí) CF=0 為0的操作數(shù)求補(bǔ)時(shí) OF=1 操作數(shù)為-128(字節(jié)運(yùn)算)或操作數(shù)為-32768(字運(yùn)算) OF=0 當(dāng)求補(bǔ)運(yùn)算的操作數(shù)不為-128(字節(jié))或-32768(字)時(shí)三、乘法指令
20、無符號(hào)乘法指令 NUL(unsigned multiple)
有符號(hào)乘法指令 IMUL(signed muliple) 指令的匯編格式:NUL src IMUL src 指令的基本功能:(AX)<-(AL)*(src) (DX,AX)<-(AX)*(src) 指令支持的尋址方式:src可以使用除立即數(shù)方式以外的任一種尋址方式。指令對標(biāo)志位的影響:乘法指令只影響標(biāo)志位CF和OF,其他條件碼位無定義。 MUL指令的條件碼設(shè)置為: CF OF=0 0 乘積的高一半為0(字節(jié)操作的(AH)或字操作的(DX)) CF OF=1 1 乘積的高一半不為0 IMUL指令的條件碼設(shè)置為: CF OF=0 0 乘積的高一半為低一半的符號(hào)擴(kuò)展. CF OF=1 1 其他情況指令的特殊要求:MUL和IMUL指令的區(qū)別僅在于操作數(shù)是無符號(hào)還是帶符號(hào)數(shù),它們的共同點(diǎn)是,指令中只給出源操作數(shù)src,目的操作數(shù)是隱含的,它只能是累加器(字運(yùn)算為AX,字節(jié)運(yùn)算為AL)。隱含的乘積寄存器是AX或DX(高位)和AX(低位)。
四、符號(hào)擴(kuò)展指令
21、節(jié)擴(kuò)展為字 CBW(convert byte to word)
指令的匯編格式:CBW 指令的基本功能:(AH)=00H 當(dāng)(AL)的最高有效位為0時(shí) (AH)=FFH 當(dāng)(AL)的最高有效位為1時(shí)指令對標(biāo)志位的影響:不影響標(biāo)志位指令的特殊要求:這是條無操作數(shù)的指令,進(jìn)行符號(hào)擴(kuò)展的操作數(shù)必須存放在AL寄存器 AX寄存器中。
22、字?jǐn)U展為雙字 CWD(convert word to double word)
指令的匯編格式:CWD 指令的基本功能:(DX)=0000H 當(dāng)(AX)的最高有效位為0時(shí) (DX)=FFFFH 當(dāng)(AX)的最高有效位為1時(shí)指令對標(biāo)志位的影響:不影響標(biāo)志位指令的特殊要求:這是條無操作數(shù)的指令,進(jìn)行符號(hào)擴(kuò)展的操作數(shù)必須存放在AL寄存器或AX寄存器中。
五、除法指令
23、無符號(hào)數(shù)除法 DIV(unsigned divide) 帶符號(hào)數(shù)除法 IDIV (singed divide) 指令的匯編格式:DIV src IDIV src 指令的基本功能:字操作 (AL)<-(AX)/src的商 (AH)<-(AX)/src的余數(shù)字節(jié)操作 (AX)<-(DX,AX)/src的商 (DX)<-(DX,AX)/src的余數(shù)指令支持的尋址方式:src作為除數(shù),可用除立即數(shù)以外的任一種尋址方式來取得。指令對標(biāo)志位的影響:不影響條件碼。指令的特殊要求:除法指令要求字操作時(shí),被除數(shù)必須為32位,除數(shù)是16位,商和余數(shù)是16位的;字節(jié)操作時(shí),被除數(shù)必須為16位,除數(shù)是8位,得到的商和余數(shù)是8位的。
六、十進(jìn)制調(diào)整指令
【邏輯指令】
一、邏輯運(yùn)算
指令的格式:ANDdst,src 指令的基本功能:(dst)<-(dst)與(src) 指令支持的尋址方式:兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,源操作數(shù)和目地操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:指令執(zhí)行后 CF 和 OF 置零,AF無定義。 SF=1 指令執(zhí)行后的結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 指令執(zhí)行后的結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 指令執(zhí)行后的結(jié)果為零 ZF=0 指令執(zhí)行后的結(jié)果不為零 PF=1 結(jié)果操作數(shù)中1的個(gè)數(shù)為偶數(shù)時(shí)置1 PF=0 結(jié)果操作數(shù)中1的個(gè)數(shù)為奇數(shù)時(shí)置0 25、邏輯或 OR(logic or) 指令的匯編格式:OR dst,src 指令的基本功能:(dst)<-(dst)或(src) 指令支持的尋址方式:兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,原操作數(shù)和目的操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:令執(zhí)行后 CF 和 OF 置零,AF無定義。 SF=1 指令執(zhí)行后的結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 指令執(zhí)行后的結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 指令執(zhí)行后的結(jié)果為零 ZF=0 指令執(zhí)行后的結(jié)果不為零 PF=1 結(jié)果操作數(shù)中1的個(gè)數(shù)為偶數(shù)時(shí)置1 PF=0 結(jié)果操作數(shù)中1的個(gè)數(shù)為奇數(shù)時(shí)置0 26、邏輯非 NOT(logic not) 指令的匯編格式:NOT orc 指令的基本功能:(dst)<-(opr) 指令支持的尋址方式:除立即數(shù)尋址方式以外的其余尋址方式指令對標(biāo)志位的影響:對標(biāo)志位無影響 27、異或 XOR(exclusice or) 指令的匯編格式:XOR dst,src 指令的基本功能:(dst)<-(dst)異或(src) 指令支持的尋址方式:兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址。即為除源操作數(shù)為立即數(shù)的情況外,原操作數(shù)和目的操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:令執(zhí)行后 CF 和 OF 置零,AF無定義。 SF=1 指令執(zhí)行后的結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 指令執(zhí)行后的結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 指令執(zhí)行后的結(jié)果為零 ZF=0 指令執(zhí)行后的結(jié)果不為零 PF=1 結(jié)果操作數(shù)中1的個(gè)數(shù)為偶數(shù)時(shí)置1 PF=0 結(jié)果操作數(shù)中1的個(gè)數(shù)為奇數(shù)時(shí)置0 28、測試指令 TEST 指令的匯編格式:TEST opr1,opr2 指令的基本功能:(opr1)與(opr2) 指令支持的尋址方式:兩個(gè)操作數(shù)不能同時(shí)為存儲(chǔ)器尋址,即為除源操作數(shù)為立即數(shù)的情況外,源操作數(shù)和目的操作數(shù)必須有一個(gè)寄存器尋址方式。指令對標(biāo)志位的影響:令執(zhí)行后 CF 和 OF 置零,AF無定義。 SF=1 指令執(zhí)行后的結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 指令執(zhí)行后的結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 指令執(zhí)行后的結(jié)果為零 ZF=0 指令執(zhí)行后的結(jié)果不為零 PF=1 結(jié)果操作數(shù)中1的個(gè)數(shù)為偶數(shù)時(shí)置1 PF=0 結(jié)果操作數(shù)中1的個(gè)數(shù)為奇數(shù)時(shí)置0
二、移位指令
29、邏輯左移 SHL(shift logical left) 指令的匯編格式:SHL dst,cnt 指令的基本功能:SHL指令向左逐位移動(dòng)cnt次,每次逐位移動(dòng)后,最低位用0來補(bǔ)充,最高位移入CF。指令支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移位次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫在指令中,cnt〉1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值 OF=1 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),移動(dòng)時(shí)最高位的值未發(fā)生變化。 SF、ZF、PF根據(jù)移動(dòng)后的結(jié)果設(shè)置
30、邏輯右移 SHR (shift logical right) 指令的匯編格式:SHR dst,cnt 指令的基本功能:SHR指令向右逐位移動(dòng)cnt次,每次逐位移動(dòng)后,最高位用0來補(bǔ)充,最低位移入CF。指令支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移位次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫在指令中,cnt〉1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值 OF=1 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),移動(dòng)時(shí)最高位的值未發(fā)生變化。 SF、ZF、PF根據(jù)移動(dòng)后的結(jié)果設(shè)置。 31、算術(shù)左移 SAL(shift arithmetic left) 指令的匯編格式:SAL dst cnt 指令的基本功能:SAL指令向左逐位移動(dòng)cnt次,每次逐位移動(dòng)后,最低位用0來補(bǔ)充,最高位移入CF。指令支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移位次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫在指令中,cnt〉1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值 OF=1 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),移動(dòng)時(shí)最高位的值未發(fā)生變化。 SF、ZF、PF根據(jù)移動(dòng)后的結(jié)果設(shè)置。 32、算術(shù)右移 SAR(shift arithmetic right) 指令的匯編格式:SAR dst,cnt 指令的基本功能:SAR指令向右逐位移動(dòng)cnt次,每次逐位移動(dòng)后,最高位用符號(hào)位來補(bǔ)充,最低位移入CF。指令支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移位次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫在指令中,cnt〉1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值 OF=1 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),移動(dòng)時(shí)最高位的值未發(fā)生變化。 SF、ZF、PF根據(jù)移動(dòng)后的結(jié)果設(shè)置。 33、循環(huán)左移 ROL(rotate left) 指令的匯編格式:ROL dst,cnt 指令的基本功能:ROL 對由dst指定的寄存器或存儲(chǔ)器操作數(shù)左移循環(huán)移動(dòng)cnt所指定的次數(shù),每左移一次,把最高位同時(shí)移入CF和操作數(shù)最低位。指令支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移動(dòng)次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫在指令中,cnt〉1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值 OF=1 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),移動(dòng)時(shí)最高位的值未發(fā)生變化。 SF、ZF、PF根據(jù)移動(dòng)后的結(jié)果設(shè)置。 34、循環(huán)右移 ROR(rotate right) 指令的匯編格式:ROR dst,cnt 指令的基本功能:ROR 對由dst指定的寄存器或存儲(chǔ)器操作數(shù)右移循環(huán)移動(dòng)cnt所指定的次數(shù),每右移一次,把最低位同時(shí)移入CF和操作數(shù)最高位。指令支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移動(dòng)次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫在指令中,cnt>1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值 OF=1 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),移動(dòng)時(shí)最高位的值未發(fā)生變化。 SF、ZF、PF根據(jù)移動(dòng)后的結(jié)果設(shè)置。 35、帶進(jìn)位的循環(huán)左移RCL(rotate left through carry) 指令的匯編格式:RCL dst,cnt 指令的基本功能:RCL 對由dst指定的寄存器或存儲(chǔ)器操作數(shù),連同進(jìn)位標(biāo)志CF左循環(huán)移動(dòng),m所指定的次數(shù),每左移一次,把操作數(shù)的最高位移入CF,而CF中原有內(nèi)容移入操作數(shù)的最低位。指定支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移動(dòng)次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫在指令中,cnt〉1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值。 OF=1 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值未發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),移動(dòng)后最高位的值發(fā)生變化。 SF、ZF、PF標(biāo)志位不受影響。 36、帶進(jìn)位的循環(huán)右移 RCR(rotate right through carry) 指令的匯編格式:RCR dst,cnt 指令的基本功能:RCR 對由dst指定的寄存器或存儲(chǔ)器操作數(shù),連同進(jìn)位標(biāo)志CF右循環(huán)移動(dòng),m所指定的次數(shù),每右移一次,把操作數(shù)的最高低位移入CF,而CF中原有內(nèi)容移入操作數(shù)的最高位。指令支持的尋址方式:目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移動(dòng)次數(shù)(或位數(shù))cnt=1時(shí),1可以直接寫入指令中,cnt〉1時(shí),cnt必須放入CL寄存器中。指令對標(biāo)志位的影響:CF=移入的數(shù)值。 OF=1 當(dāng)cnt=1時(shí),操作數(shù)最高位的值未發(fā)生變化。 OF=0 當(dāng)cnt=1時(shí),操作數(shù)最高位的值發(fā)生變化。 SF、ZF、PF標(biāo)志位不受影響。
【串處理指令】
一、設(shè)置方向標(biāo)志指令
37、DF置零 CLD(clear direction flag) DF置一 STD (set direction flag) 指令的匯編格式:CLD STD 指令的基本功能:CLD DF=0 STD DF=1 二、串處理指令 38、串傳送 MOVSB / MOVSW(move string byte/word) 指令的匯編格式:MOVSB MOVSW 指令的基本功能:(ES:DI)<-(DS:SI) (SI)<-(SI)+/-1(字節(jié))或+/-2(字) (DI)<-(DI)+/-1(字節(jié))或+/-2(字) 指令對條件碼的影響:不影響條件碼。指令的特殊要求:源串必須在數(shù)據(jù)段中,目的串必須在附加段中,串處理指令隱含的尋址方式是SI和DI寄存器的間接尋址方式。源串允許使用段跨越前綴來指定段。 39、存串 STOSB / STOSW(stroe from string byte/word) 指令的匯編格式:STOSB STOSW 指令的基本功能:(ES:DI)<-(AL)或(AX) (DI)<-(DI)+/-1(字節(jié))或+/-2(字) 指令對條件碼的影響:不影響條件碼。指令的特殊要求:源串必須在數(shù)據(jù)段中,目的串必須在附加段中,串處理指令隱含的尋址方式是SI和DI寄存器的間接尋址方式。源串允許使用段跨越前綴來指定段。 40、取串LODSB / LODSW(load from string byte/word) 指令的匯編格式:LODSB LODSW 指令的基本功能:(AL)或(AX)<-(DS:SI) (SI)<-(SI)+/-1(字節(jié))或+/-2(字) 指令對條件碼的影響:不影響條件碼。指令的特殊要求:源串必須在數(shù)據(jù)段中,目的串必須在附加段中,串處理指令隱含的尋址方式是SI和DI寄存器的間接尋址方式。源串允許使用段跨越前綴來指定段。 41、串比較 CMPSB / CMPSW(compare string byte/word) 指令的匯編格式:CMPSB CMPSW 指令的基本功能:(DS:SI)-(ES:DI) 根據(jù)比較結(jié)果設(shè)置條件碼 (SI)<-(SI)+/-1(字節(jié))或+/-2(字) (DI)<-(DI)+/-1(字節(jié))或+/-2(字) 指令對條件碼的影響:SF=1 減法結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 減法結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 減法結(jié)果為零 ZF=0 減法結(jié)果不為零 CF=1 二進(jìn)制減法運(yùn)算中最高有效位向高位有借位(被減數(shù)小于減數(shù),不夠減的情況) CF=0 二進(jìn)制減法運(yùn)算中最高有效為向高位無借位(被減數(shù)〉=減數(shù),夠減的情況) OF=1 兩數(shù)符號(hào)相反(正數(shù)-負(fù)數(shù),或負(fù)數(shù)-正數(shù)),而結(jié)果符號(hào)與減數(shù)相同。 OF=0 同符號(hào)數(shù)相減時(shí),或不同符號(hào)數(shù)相減,其結(jié)果符號(hào)與減數(shù)不同。 42、串掃描 SCASB / SCASW(scan string byte / word) 指令的格式:SCASB SCASW 指令的基本功能:(AL)<-(ES:DI)或(AX)<-(ES:DI) 根據(jù)掃描比較的結(jié)果設(shè)置條件碼。 (DI)<-(DI)+/-1(字節(jié))或+/-2(字) 指令對條件碼的影響:SF=1 結(jié)果為負(fù)數(shù)(符號(hào)位為1) SF=0 結(jié)果為正數(shù)(符號(hào)位為0) ZF=1 結(jié)果為零 ZF=0 結(jié)果不為零 CF=1 二進(jìn)制減法運(yùn)算中最高有效位向高位有借位(被減數(shù)小于減數(shù),不夠減的情況) CF=0 二進(jìn)制減法運(yùn)算中最高有效為向高位無借位(被減數(shù)〉=減數(shù),夠減的情況) OF=1 兩數(shù)符號(hào)相反(正數(shù)-負(fù)數(shù),或負(fù)數(shù)-正數(shù)),而結(jié)果符號(hào)與減數(shù)相同。 OF=0 同符號(hào)數(shù)相減時(shí),或不同符號(hào)數(shù)相減,其結(jié)果符號(hào)與減數(shù)不同。
三、串重復(fù)前綴
43、重復(fù)執(zhí)行串 REP 指令的匯編格式:REP (CX)=重復(fù)次數(shù)指令的基本功能:① (CX)=0時(shí),串指令執(zhí)行完畢,否則執(zhí)行② ~ ④ ② (CX)←(CX)-1③ 執(zhí)行串指令(MOVS或STOS)④ 重復(fù)執(zhí)行① 44、相等/為零時(shí)重復(fù)執(zhí)行串指令 REPE/REPZ 指令的匯編格式:REPE / REPZ (CX)=比較/掃描的次數(shù)指令的基本功能:① (CX)=0或ZF=0時(shí),結(jié)束執(zhí)行串指令,否則繼續(xù)② ~ ④ ② (CX)←(CX)-1③ 執(zhí)行串指令(CMPS或SCAS)④ 重復(fù)執(zhí)行① 45、不等/不為零時(shí)重復(fù)執(zhí)行串指令 REPNE / PEPNZ 指令的匯編格式:REPNE / PEPNZ (CX)=比較/掃描的次數(shù)指令的基本功能:① (CX)=0或ZF=1,結(jié)束執(zhí)行串指令,否則繼續(xù)② ~ ④ ② (CX)←(CX)-1③ 執(zhí)行串指令(CMPS或SCAS)④ 重復(fù)執(zhí)行①
【控制轉(zhuǎn)移指令】
一、無條件轉(zhuǎn)移指令
46、短轉(zhuǎn)移 JMP SHORT label(short jump) 指令的匯編格式:JMP SHORT label 指令的基本功能:(IP)<-當(dāng)前(IP)+8位位移量 8位位移量是匯編程序在匯編源程序時(shí),根據(jù)目標(biāo)地址和當(dāng)前IP之間的距離自動(dòng)生成的。指令對條件碼的影響:對標(biāo)志位無影響。 47、近轉(zhuǎn)移JMP NEAR PTR label(near jump) 指令的匯編格式:直接轉(zhuǎn)移 JMP label (direct jump) 寄存器間接轉(zhuǎn)移 JMP reg (register indirect jump) 存儲(chǔ)器間接轉(zhuǎn)移 JMP WORD PTR OPR (memory indirect jump) 指令的基本功能:JMP label (IP) <- OFFSET label = (IP)當(dāng)前+16位位移量 JMP reg (IP) <- (reg) JMP WORD PTR OPR (IP) <- (PA+1,PA) 指令支持的尋址方式:指令中的轉(zhuǎn)向地址可以是直接尋址方式、寄存器尋址方式、寄存器間接尋址方式和存儲(chǔ)器尋址方式。指令對條件碼的影響:對標(biāo)志位無影響。 48、遠(yuǎn)轉(zhuǎn)移 JMP FAR PTR label(for jump) 指令的匯編格式:JMP FAR PTR label 指令的基本功能:(IP)<-label的段內(nèi)偏移地址 (CS)<-label所在段的段地址指令支持的尋址方式:遠(yuǎn)轉(zhuǎn)移的目的地址可以使用除立即尋址方式外的任何尋址方式來表示。指令對條件碼的影響:對標(biāo)志位無影響。
二、條件轉(zhuǎn)移指令
指令的匯編格式及功能根據(jù)條件碼的值轉(zhuǎn)移: 49、JZ(JE) OPR ZF=1 ZF=0(運(yùn)算結(jié)果為0,ZF就置1) 50、JNZ(JNE) OPR ZF=0 51、JS OPR SF=1 SF=0(二進(jìn)制最高位是什么,SF就是什么,如最高位為1則SF=1) 52、JNS OPR SF=0 53、JO OPR OF=1 OF=1 (兩個(gè)負(fù)數(shù)相加變成正數(shù),溢出) 54、JNO OPR OF=0 55、JP OPR PF=1 PF=0 (反映結(jié)果“1”的個(gè)數(shù),奇數(shù)☞0 偶數(shù)個(gè)☞1) 56、JNP OPR PF=0 57、JC OPR CF=1CF=1(最高位有進(jìn)位或借位就置1) 58、JNC OPR CF=0 比較兩個(gè)無符號(hào)數(shù),根據(jù)比較的結(jié)果轉(zhuǎn)移 59、JB(JNAE,JC) OPR CF=1 被減數(shù)小于減數(shù)則轉(zhuǎn)移 60、JNB(JAE,JNC) OPR CF=0 被減數(shù)大于或等于減數(shù)則轉(zhuǎn)移 61、JBE(JNA) OPR CF或ZF=1 被減數(shù)小于或等于減數(shù)則轉(zhuǎn)移 62、JNBE(JA) OPR CF或ZF=0 被減數(shù)大于減數(shù)則轉(zhuǎn)移比較兩個(gè)帶符號(hào)數(shù),根據(jù)比較結(jié)果轉(zhuǎn)移 63、JL/JNGE OPR SF異或OF=1 被減數(shù)小于減數(shù)則轉(zhuǎn)移 64、JNL/JGE SF異或OF=0 被減數(shù)不小于減數(shù)則轉(zhuǎn)移 65、JLE/JNE (SF異或OF)與ZF=1 被減數(shù)不大于減數(shù)則轉(zhuǎn)移 66、JNLE/JG (SF異或OF)與ZF=0 被減數(shù)大于減數(shù)則轉(zhuǎn)移根據(jù)CX寄存器的值轉(zhuǎn)移 67、JCXZ (CX)=0 CX內(nèi)容為零則轉(zhuǎn)移指令的特殊要求:所有條件轉(zhuǎn)移指令都是短轉(zhuǎn)移指令,轉(zhuǎn)移的目標(biāo)地址必須在當(dāng)前IP地址的-128至+127字節(jié)范圍之內(nèi),因此條件轉(zhuǎn)移指令是2字節(jié)指令。
三、循環(huán)指令
68、循環(huán)LOOP(loop) 指令的匯編格式:LOOP label 指令的基本功能:① (CX)←(CX)-1 ② 若(CX)≠0,則(IP)←(IP)當(dāng)前+位移量,否則循環(huán)結(jié)束。指令的特殊要求:循環(huán)指令都是短轉(zhuǎn)移格式的指令,也就是說,位移量是用8位帶符號(hào)數(shù)來表示的,轉(zhuǎn)向地址在相對于當(dāng)前IP值的-128 ~ +127字節(jié)范圍之內(nèi)。 69、為零/相等時(shí)循環(huán) LOOPZ/LOOPE(loop while nonzero or equal) 指令的匯編格式:LOOPNZ/LOOPNE label 指令的基本功能:① (CX)←(CX)-1 ?、?若ZF=1且(CX)≠0,則(IP)←(IP)當(dāng)前+位移量,否則循環(huán)結(jié)束。指令的特殊要求:循環(huán)指令都是短轉(zhuǎn)移格式的指令,也就是說,位移量是用8位帶符號(hào)數(shù)來表示的,轉(zhuǎn)向地址在相對于當(dāng)前IP值的-128 ~ +127字節(jié)范圍之內(nèi)。 70、不為零/不相等時(shí)循環(huán) LOOPNZ/LOOPNE(loop while nonzero or not equal) 指令的匯編格式:LOOPNZ/LOOPNE label 指令的基本功能:① (CX)←(CX)-1 ?、?若ZF=0且(CX)≠0,則(IP)←(IP)當(dāng)前+位移量,否則循環(huán)結(jié)束。指令的特殊要求:循環(huán)指令都是短轉(zhuǎn)移格式的指令,也就是說,位移量是用8位帶符號(hào)數(shù)來表示的,轉(zhuǎn)向地址在相對于當(dāng)前IP值的-128 ~ +127字節(jié)范圍之內(nèi)。
四、子程序調(diào)用
71、段內(nèi)直接近調(diào)用 CALL SUBROUT 指令的基本功能:(SP)<-(SP)-2 ((SP)+1,(sp))<-(IP) (IP)<-(IP)+16位位移量段內(nèi)間接近調(diào)用 CALL DESTIN 指令的基本功能:(SP)<-(SP)-2 ((SP)+1,(SP))<-(IP) (IP)<-(EA) 72、段間直接調(diào)用 CALL FAR PTR SUBROUT 指令的基本功能:(SP)<-(SP)-2,((SP))<-(CS)當(dāng)前 (SP)<-(SP)-2,((SP))<-(IP)當(dāng)前 (IP)<-偏移地址(在指令的第2、3個(gè)字節(jié)) (CS)<-段地址(在指令的第4、5個(gè)字節(jié))
五、返回指令
73、段內(nèi)返回(近返回) RET 指令的基本功能:(IP)<-((SP)+1,(SP)) (SP)<-(SP)+2 段間返回(遠(yuǎn)返回) RET 指令的基本功能:(IP)<-((SP)),(SP)<-(SP)+2 (CS)<-((SP)),(SP)<-(SP)+2 帶立即數(shù)返回 RET N 執(zhí)行操作:① 返回地址出棧(操作同段內(nèi)或段間返回)
② 修改堆棧指針:(SP) ← (SP)+N
六、中斷及中斷返回指令
74、INT n 中斷指令(interrupt),n為中斷類型號(hào) 執(zhí)行操作:① 入棧保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS) ② 入棧保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS) (SP) ← (SP)-2,((SP)) ← (IP) ③ 轉(zhuǎn)中斷處理程序:(IP) ← (n×4) (CS) ← (n×4+2) 75、IRET 中斷返回指令(return from interrupt) 執(zhí)行操作:① 返回地址出棧:(IP) ← ((SP)),(SP) ← (SP)+2 (CS) ← ((SP)),(SP) ← (SP)+2 ?、?FLAGS出棧:(FLAGS) ← ((SP)),(SP) ← (SP)+2 76、INTO 溢出則中斷(中斷類型為4) 執(zhí)行操作:若OF=1(有溢出),則: ?、?入棧保存FLAGS:(SP) ← (SP)-2,((SP)) ← (FLAGS) ② 入棧保存返回地址:(SP) ← (SP)-2,((SP)) ← (CS) (SP) ← (SP)-2,((SP)) ← (IP) ③ 轉(zhuǎn)中斷處理程序:(IP) ← (4×4)= (10H) (CS) ← (4×4+2)= (12H
HELLO,WORLD進(jìn)階匯編程序系列
Editor:admin Time:2004-3-21 12:49 Read:9785 Score:8 Print
Writer:LLUCT
Excerpt:80x86匯編小站
Preface:
感謝網(wǎng)友lluct為本站提供原創(chuàng)......適合初學(xué)者學(xué)習(xí)哦
Content:
TITLE ***HELLO,WORLD進(jìn)階程序之選擇分支 BY LLUCT***
DATA SEGMENT ;定義數(shù)據(jù)段
MSG1 DB '***WELCOME TO MY PROGRAM BY LLUCT***','$'
;定義輸出的第一個(gè)字符串信息,字符串必須用DB定義,$為結(jié)束標(biāo)志
MSG2 DB '1:BASIC MESSAGE 2:ADVANCED MESSAGE','$'
;定義輸出的字符串信息:選擇菜單
MSG3 DB 'PLEASE CHOOSE:','$'
;定義輸出的字符串信息:選擇前綴
MSG4 DB 'HELLO,WORLD!^-^','$'
;定義輸出的字符串信息:分支1的信息
MSG5 DB 'THIS IS MY FIRST ASM_86 PROGRAM! @^-^@','$'
;定義輸出的字符串信息:分支2的信息
ERRMSG DB 'CHOOSE ERROR! -_-b','$'
;定義輸出的字符串信息:選擇錯(cuò)誤信息
DATA ENDS ;數(shù)據(jù)段結(jié)尾
CODE SEGMENT ;定義代碼段
ASSUME CS:CODE ;規(guī)定CS的內(nèi)容
ASSUME DS:DATA ;規(guī)定DS的內(nèi)容
START: MOV AX,DATA ;程序從START開始
MOV DS,AX ;DS置初值,DATA的段地址
CALL ENTER ;調(diào)用顯示回車換行子程序
LEA DX,MSG1 ;輸出第一個(gè)字符串的偏移地址
CALL DISPCHS ;調(diào)用顯示字符串子程序
CALL ENTER ;調(diào)用顯示回車換行子程序
CALL ENTER ;這個(gè)...同上啊^-^
LEA DX,MSG2 ;輸出第二個(gè)字符串的偏移地址
CALL DISPCHS ;調(diào)用顯示字符串子程序
AGAIN: CALL ENTER ;定義AGAIN標(biāo)號(hào).用于選擇錯(cuò)誤循環(huán)
LEA DX,MSG3 ;輸出第三個(gè)字符串的偏移地址
CALL DISPCHS ;調(diào)用顯示字符串子程序
MOV AH,01H ;調(diào)用1號(hào)功能:從鍵盤輸入一個(gè)字符并回顯
INT 21H ;完成輸入回顯
CMP AL,'1' ;輸入的字符和1相比較
JE BASICP ;如果相等,轉(zhuǎn)移到BASICP標(biāo)號(hào)(JE=Jump if Equal)
CMP AL,'2' ;輸入的字符和2相比較 ||
JE ADVANP ;如果相等,轉(zhuǎn)移到ADVANP標(biāo)號(hào)(JE=如果相等就轉(zhuǎn)移)
JMP ERROR ;否則就無條件轉(zhuǎn)移到ERROR標(biāo)號(hào)
EXIT: MOV AH,4CH ;4C號(hào)功能調(diào)用:終止當(dāng)前程序并返回調(diào)用程序
INT 21H ;返回DOS
BASICP: CALL ENTER ;什么,還要解釋啊.暈-_-!!!
LEA DX,MSG4 ;輸出第三個(gè)字符串的偏移地址
CALL DISPCHS ;調(diào)用顯示字符串子程序
CALL ENTER ;..........
JMP EXIT ;無條件轉(zhuǎn)移到EXIT標(biāo)號(hào)
ADVANP: CALL ENTER ;55555555
LEA DX,MSG5 ;解釋了四次,應(yīng)該懂了吧
CALL DISPCHS ;調(diào)用顯示字符串子程序
CALL ENTER ;再問就死給你看
JMP EXIT ;無條件轉(zhuǎn)移到EXIT標(biāo)號(hào)
ERROR: CALL ENTER
LEA DX,ERRMSG ;輸出選擇錯(cuò)誤信息
CALL DISPCHS ;調(diào)用顯示字符串子程序
MOV DL,07H ;輸出ASCII碼的報(bào)警(響鈴)控制符BEL(07H)
CALL DISPCH ;調(diào)用顯示單個(gè)字符子程序
CALL ENTER
JMP AGAIN
DISPCH PROC NEAR
;顯示單個(gè)字符子程序,NEAR說明子程序和主程序在同一個(gè)代碼段中(現(xiàn)無主程序調(diào)用)
MOV AH,02H ;2號(hào)功能調(diào)用:顯示器輸出字符
INT 21H ;完成輸出顯示
RET ;返回
DISPCH ENDP ;子程序結(jié)尾
ENTER PROC NEAR ;顯示回車換行子程序
MOV DL,0DH ;輸出ASCII碼的回車控制符CR(0DH)
CALL DISPCH ;調(diào)用顯示單個(gè)字符子程序
MOV DL,0AH ;輸出ASCII碼的換行控制符LF(0AH)
CALL DISPCH ;調(diào)用顯示單個(gè)字符子程序
RET ;返回
ENTER ENDP ;子程序結(jié)尾
DISPCHS PROC NEAR
;顯示字符串子程序,NEAR說明子程序和主程序在同一個(gè)代碼段中(現(xiàn)無主程序調(diào)用)
MOV AH,09H ;9號(hào)功能調(diào)用:顯示字符串
INT 21H ;完成輸出顯示
RET
DISPCHS ENDP
CODE ENDS ;代碼段結(jié)尾
END START ;結(jié)束匯編
;把以上代碼復(fù)制到記事本等文本程序中,并保存.(如helloch.asm)
;編譯:masm helloch.asm
;連接:link helloch.obj
;執(zhí)行:helloch.exe
======================================================
title ***hello,world進(jìn)階之字符串輸入輸出 by lluct***
data segment ;定義數(shù)據(jù)段
input db 100 dup(?)
;定義輸入的字符串,字符串必須用db定義,長度為100個(gè)字節(jié)
msg1 db 'Hello,','$'
;定義輸出的前綴字符串信息,字符串必須用db定義,$為結(jié)束標(biāo)志(24h)
msg2 db ',Welcome to here!','$'
;定義輸出的后綴字符串信息
headmsg db 'PLEASE INPUT YOUR NAME:','$'
;開始顯示的字符串信息
data ends ;數(shù)據(jù)段結(jié)尾
code segment ;定義代碼段
assume cs:code ;規(guī)定cs的內(nèi)容
assume ds:data ;規(guī)定ds的內(nèi)容
start: mov ax,data ;程序從start開始
mov ds,ax ;ds置初值,data的段地址
mov si,0 ;變址寄存器置初值0
call enter ;調(diào)用顯示回車換行子程序
lea dx,headmsg ;輸出開始顯示的字符串的偏移地址
call dispchs ;調(diào)用顯示字符串子程序
repeat: mov ah,01h
;定義repeat標(biāo)號(hào),用于循環(huán)輸入單個(gè)字符.調(diào)用1號(hào)功能:從鍵盤輸入一個(gè)字符并回顯
int 21h ;完成輸入回顯
cmp al,0dh ;輸入的字符和CR(回車)比較
je exit ;如果等于回車就轉(zhuǎn)移到exit
mov input[si],al ;把a(bǔ)l的值傳送到input的si地址中(好像是這樣吧)
inc si ;si加1
jmp repeat ;無條件轉(zhuǎn)移到repeat
exit: call enter
mov input[si],24h ;給輸入完成的字符串加上結(jié)束標(biāo)志($)
call enter
lea dx,msg1 ;輸出前綴字符串的偏移地址
call dispchs ;調(diào)用顯示字符串子程序
lea dx,input ;輸出剛才輸入的字符串
call dispchs
lea dx,msg2
call dispchs
call enter
mov ah,4ch ;4c號(hào)功能調(diào)用:終止當(dāng)前程序并返回調(diào)用程序
int 21h ;返回dos
enter proc near ;顯示回車換行子程序
mov dl,0dh ;輸出ascii碼的回車控制符cr(0dh)
call dispch
mov dl,0ah ;輸出ascii碼的換行控制符lf(0ah)
call dispch
ret ;返回
enter endp ;子程序結(jié)束
dispch proc near
mov ah,02h ;2號(hào)功能調(diào)用:顯示器輸出字符
int 21h ;完成輸出顯示
ret ;返回
dispch endp
dispchs proc near
mov ah,09h ;9號(hào)功能調(diào)用:顯示字符串
int 21h ;完成輸出顯示
ret ;返回
dispchs endp
code ends ;代碼段結(jié)尾
end start ;結(jié)束匯編
;把以上代碼復(fù)制到記事本等文本程序中,并保存.(如heinout.c)
;編譯:masm heinout.asm
;連接:link heinout.obj
;執(zhí)行:heinout.exe
中斷是指CPU對系統(tǒng)發(fā)生的某個(gè)事件作出的一種反應(yīng):CPU暫停正在執(zhí)行的程序,保留現(xiàn)場后自動(dòng)轉(zhuǎn)去執(zhí)行相應(yīng)的處理程序,處理完該事件后再返回?cái)帱c(diǎn)繼續(xù)執(zhí)行被"打斷"的程序
在我們所用的電腦中,所有的硬件都需要執(zhí)行中斷請求的動(dòng)作,簡單說它的作用就是用來停止其相關(guān)硬件的工作狀態(tài)。我們可以舉一個(gè)日常生活中的例子來說明,假如你正在給朋友寫信,電話鈴響了,這時(shí)你放下手中的筆去接電話,通話完畢再繼續(xù)寫信。這個(gè)例子就表現(xiàn)了中斷及其處理的過程:電話鈴聲使你暫時(shí)中止當(dāng)前的工作,而去處理更為急需處理的事情——接電話,當(dāng)把急需處理的事情處理完畢之后,再回過頭來繼續(xù)原來的事情。在這個(gè)例子中,電話鈴聲就可以稱為“中斷請求”,而你暫停寫信去接電話就叫作“中斷響應(yīng)”,那么接電話的過程就是“中斷處理”。由此我們可以看出,在計(jì)算機(jī)執(zhí)行程序的過程中,由于出現(xiàn)某個(gè)特殊情況(或稱為“事件”),使得系統(tǒng)暫時(shí)中止現(xiàn)行程序,而轉(zhuǎn)去執(zhí)行處理這一特殊事件的程序,處理完畢之后再回到原來程序的中斷點(diǎn)繼續(xù)向下執(zhí)行,而這個(gè)過程就被稱為中斷。
中斷的作用
我們可以再舉一個(gè)例子來說明中斷的作用。假設(shè)有一個(gè)朋友來拜訪你,但是由于不知何時(shí)到達(dá),你只能在門口等待,于是什么事情也干不了;但如果在門口裝一個(gè)門鈴,你就不必在門口等待而可以在家里去做其他的工作,朋友來了按門鈴?fù)ㄖ?,這時(shí)你才中斷手中的工作去開門,這就避免了不必要的等待。而計(jì)算機(jī)也一樣,例如打印文稿的操作。因?yàn)閏pu傳送數(shù)據(jù)的速度高,而打印機(jī)速度較慢,如果不采用中斷技術(shù),cpu將經(jīng)常處于等待狀態(tài),這會(huì)使得電腦的工作效率極低。而采用了中斷方式后,cpu就可以在打印的同時(shí)進(jìn)行其他的工作,而只在打印機(jī)緩沖區(qū)內(nèi)的當(dāng)前內(nèi)容打印完畢,而發(fā)出中斷請求之后才予以響應(yīng),這時(shí)才暫時(shí)中斷當(dāng)前的工作轉(zhuǎn)去執(zhí)行停止打印的操作,之后再返回執(zhí)行原來的程序。這樣就大大地提高了計(jì)算機(jī)系統(tǒng)的效率。
irq中斷
計(jì)算機(jī)中的中斷有好幾種,根據(jù)中斷信號(hào)產(chǎn)生的來源可以分為:硬件中斷和軟件中斷。硬件中斷多由外圍設(shè)備和計(jì)算機(jī)系統(tǒng)控制器發(fā)出,軟件中斷一般由軟件命令產(chǎn)生。在硬件中斷中又有“可屏蔽中斷”和“不可屏蔽中斷”之分。顧名思義,可屏蔽中斷可以由計(jì)算機(jī)根據(jù)系統(tǒng)的需要來決定是否進(jìn)行接收處理或是延后處理(即屏蔽),而不可屏蔽中斷便是直接激活相應(yīng)的中斷處理程序,它不能也不會(huì)被延誤。而irq中斷就是可屏蔽的硬件中斷,它的全稱為interrupt request 即“中斷請求”。
在電腦的系統(tǒng)中,是由一個(gè)中斷控制器8259或是8259a的芯片(現(xiàn)在此芯片大都集成到其他的芯片內(nèi))來對系統(tǒng)中每個(gè)硬件的中斷進(jìn)行控制。目前共有16組irq,去掉其中用來作橋接的一組irq,實(shí)際上只有15組irq可供硬件調(diào)用。而這些irq都有自己建議的配置。
分配irq中斷
我們?nèi)粘K玫牟僮飨到y(tǒng)對于irq的設(shè)置也不盡相同,所以在安裝新硬件的時(shí)候,系統(tǒng)往往并不能自動(dòng)檢測正確的irq來分配給所需調(diào)用的硬件,這就會(huì)造成此硬件設(shè)備或是原來的舊硬件出現(xiàn)不能正常工作的現(xiàn)象。其實(shí)這是系統(tǒng)自動(dòng)將該硬件的irq分配給了其他與此irq相同的硬件上,從而發(fā)生沖突使硬件不能正常工作。一般如果遇到這種情況,只要將新舊兩個(gè)硬件的irq配置手動(dòng)調(diào)開就可以解決了。
對于一些常用的硬件一般都有其默認(rèn)的irq數(shù)值。比如聲卡常常使用irq5或7。雖然這些配件使用其他的irq值大多數(shù)也能工作,但假如碰到特別“挑剔”的軟件或游戲等程序,例如只能識(shí)別irq值為5或7的聲卡,那么如果將它設(shè)成irq9就白費(fèi)心機(jī)了。
8.3.1 中斷的基本概念
中斷(Interrupt)是指計(jì)算機(jī)在實(shí)行期間,系統(tǒng)內(nèi)發(fā)生非尋常的或非預(yù)期的急需處理事件,使得CPU暫時(shí)中斷當(dāng)前正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行響應(yīng)的事件處理程序。待處理完畢后又返回原來中斷處繼續(xù)執(zhí)行或調(diào)度新的程序執(zhí)行的過程。
現(xiàn)代計(jì)算機(jī)系統(tǒng)一般都具有處理突發(fā)事件的能力。例如:從磁帶上讀入一組信息,當(dāng)發(fā)現(xiàn)讀入信息有錯(cuò)誤時(shí),只要讓磁帶退回重讀該組信息就可能克服錯(cuò)誤,而得到正確的信息。
這種處理突發(fā)事件的能力是由硬件和軟件協(xié)作完成的。首先由硬件的中斷裝置發(fā)現(xiàn)產(chǎn)生的事件,然后,中斷裝置中止現(xiàn)行程序的執(zhí)行,引出處理該事件的程序來處理。計(jì)算機(jī)系統(tǒng)不僅可以處理由于硬件或軟件錯(cuò)誤而產(chǎn)生的事件,而且可以處理某種預(yù)定處理偽事件。例如:外圍設(shè)備工作結(jié)束時(shí),也發(fā)出中斷請求,向系統(tǒng)報(bào)告它已完成任務(wù),系統(tǒng)根據(jù)具體情況作出相應(yīng)處理。引起中斷的事件稱為中斷源。發(fā)現(xiàn)中斷源并產(chǎn)生中斷的硬件稱中斷裝置。在不同的硬件結(jié)構(gòu)中,通常有不同的中斷源和平不同的中斷裝置,但它們有一個(gè)共性,即:當(dāng)中斷事件發(fā)生后,中斷裝置能改變處理器內(nèi)操作執(zhí)行的順序。
中斷源:引起中斷發(fā)生的事件被稱為中斷源。中斷請求:中斷源向CPU發(fā)出的請求中斷處理信號(hào)。中斷響應(yīng):CPU收到中斷請求后轉(zhuǎn)相應(yīng)的事件處理程序。禁止中斷(關(guān)中斷):CPU內(nèi)部的處理機(jī)狀態(tài)字PSW的中斷允許位已被清除,不允許CPU響應(yīng)中斷。開中斷:PSW的中斷允許位的設(shè)置。中斷屏蔽:在中斷請求產(chǎn)生之后,系統(tǒng)用軟件方式有選擇地封鎖部分中斷而允許蓁部分的中斷仍能得到響應(yīng)。
8.3.4 中斷處理過程
中斷處理過程:
(1) CPU檢查響應(yīng)中斷的條件是否滿足。CPU響應(yīng)中斷的條件是:有來自于中斷源的中斷請求、CPU允許中斷。如果中斷響應(yīng)條件不滿足,則中斷處理無法進(jìn)行?!?2) 如果CPU響應(yīng)中斷,則CPU關(guān)中斷,使其進(jìn)入不可再次響應(yīng)中斷的狀態(tài)。 (3) 保存被中斷進(jìn)程現(xiàn)場。為了在中斷處理結(jié)束后能使進(jìn)程正確地返回到中斷點(diǎn),系統(tǒng)必須保存當(dāng)前處理機(jī)狀態(tài)字PSW和程序計(jì)數(shù)器PC等的值。這些值一般保存在特定堆?;蛴布拇嫫髦??!?4) 分析中斷原因,調(diào)用中斷處理子程序。在多個(gè)中斷請求同時(shí)發(fā)生時(shí),處理優(yōu)先級最高的中斷源發(fā)出的中斷請求?!?5) 執(zhí)行中斷處理子程序。對陷阱來說,在有些系統(tǒng)中則是通過陷阱指令向當(dāng)前執(zhí)行進(jìn)程發(fā)軟中斷信號(hào)后調(diào)用對應(yīng)的處理子程序執(zhí)行?!?6) 退出中斷,恢復(fù)被中斷進(jìn)程的現(xiàn)場或調(diào)度新進(jìn)程占據(jù)處理機(jī)?!?7) 開中斷,CPU繼續(xù)執(zhí)行。
1.什么叫中斷?
簡單來說,中斷是一種使CPU中止正在執(zhí)行的程序而轉(zhuǎn)去處理特殊事件的操作。這些引起中斷的事件稱為中斷源,它們可能是來自外設(shè)的輸入輸出請求,也可能是計(jì)算機(jī)的一些異常事故或其它內(nèi)部原因。 更具體地,我們定義CPU中斷為這樣一個(gè)過程:在特定的事件(中斷源,也稱中斷請求信號(hào))觸發(fā)下引起CPU暫停正在運(yùn)行的程序(主程序),轉(zhuǎn)而先去處理一段為特定事件而編寫的處理程序(中斷處理程序),等中斷處理程序處理完成后,再回到主程序被打斷的地方繼續(xù)運(yùn)行。
2.中斷的作用
一方面,有了中斷功能,PC系統(tǒng)就可以使CPU和外設(shè)同時(shí)工作,使系統(tǒng)可以及時(shí)地響應(yīng)外部事件。而且有了中斷功能,CPU可允許多個(gè)外設(shè)同時(shí)工作。這樣就大大提高了CPU的利用率,也提高了數(shù)據(jù)輸入、輸出的速度?! ×硪环矫妫辛酥袛喙δ?,就可以使CPU及時(shí)處理各種軟硬件故障。計(jì)算機(jī)在運(yùn)行過程中,往往會(huì)出現(xiàn)事先預(yù)料不到的情況或出現(xiàn)一些故障,如電源掉電、存儲(chǔ)出錯(cuò),運(yùn)算溢出等等。計(jì)算機(jī)可以利用中斷系統(tǒng)自行處理,而不必停機(jī)或報(bào)告工作人員。
3.中斷類型
在PC機(jī)系統(tǒng)中,根據(jù)中斷源的不同,中斷常分為兩大類:硬件中斷和軟件中斷?! ∮布袛嘁卜Q為外部中斷,它又可以分為兩種: 1).可屏蔽中斷:是可以被CPU屏蔽的由中斷電路發(fā)出的中斷請求信號(hào)在CPU的INTR端引起的中斷,它常常由PC機(jī)的外設(shè)或一些接口功能產(chǎn)生,如鍵盤、打印機(jī)、串行口等。可屏蔽意味著這類型中斷可以在CPU要處理其它緊急操作時(shí),被軟件屏蔽或忽略。 2).非屏蔽中斷:是由CPU的NMI端引起的中斷,如當(dāng)系統(tǒng)出現(xiàn)掉電、內(nèi)存奇偶校驗(yàn)錯(cuò)誤等,系統(tǒng)都將使用非屏蔽中斷。非屏蔽是指CPU不能用軟件指令來禁止對這種中斷響應(yīng),也就是CPU必須響應(yīng)由NMI端送來的中斷信號(hào)。 軟件中斷,又稱為內(nèi)部中斷,是指程序中使用INT中斷指令引起的中斷。
4.CPU響應(yīng)中斷的條件
除了非屏蔽中斷外,其它中斷都可以用軟件來屏蔽或開放。系統(tǒng)只有具備如下的中斷條件,CPU才可能對中斷請求進(jìn)行響應(yīng)?! ?) 設(shè)置中斷請求觸發(fā)器 2) 設(shè)置中斷屏蔽觸發(fā)器 3) 設(shè)置中斷允許觸發(fā)器
5.CPU處理中斷過程
當(dāng)滿足了中斷的條件后,CPU就會(huì)響應(yīng)中斷,轉(zhuǎn)入中斷程序處理。具體的工作過程如下所述?! ?) 關(guān)中斷 2) 保留斷點(diǎn) 3) 保護(hù)現(xiàn)場 4) 給出中斷入口,轉(zhuǎn)入相應(yīng)的中斷服務(wù)程序 5) 恢復(fù)現(xiàn)場 6) 開中斷與返回
6.中斷沖突
雖然現(xiàn)在Windows操作系統(tǒng)從Win9X開始已經(jīng)支持即插即用功能,大大簡化了用戶的操作,但是如果不能認(rèn)出要安裝的新設(shè)備,那么自動(dòng)分配中斷時(shí)就會(huì)產(chǎn)生沖突?,F(xiàn)在新的硬件產(chǎn)品層出不窮,各種產(chǎn)品又相互兼容,功能類似,這就導(dǎo)致了操作系統(tǒng)常常不能正確檢測出新設(shè)備,中斷沖突也就不可避免了。
7.中斷控制器8259A的結(jié)構(gòu)
Intel 8259A是與8088/8086系列兼容的可編程的中斷控制器。后來的微機(jī)系統(tǒng)也沿用這種中斷機(jī)制及其功能,只是因?yàn)榧尚酒夹g(shù)的提高,不單獨(dú)以8259A芯片的形式出現(xiàn),而是集成到一個(gè)叫做"南橋芯片"或"HUB芯片"的芯片里了?! ?259A包括以下幾個(gè)部分: 1).中斷請求寄存器IRR(Interrupt Request Register):有8條外界中斷請求線IR0~I(xiàn)R7,每一條請求線有一個(gè)相應(yīng)的觸發(fā)器來保存請求信號(hào)?! ?).中斷服務(wù)寄存器ISR(IN Service Register):保存正在服務(wù)的中斷?! ?).優(yōu)先權(quán)電路:對保存在IRR中的各個(gè)中斷請求,經(jīng)過判斷確定最高的優(yōu)先權(quán),并在中斷響應(yīng)周期把它選通至中斷服務(wù)寄存器。 4).中斷屏蔽寄存器IMR(Interrupt Mask Register):寄存器的每一位,可以對IRR中的相應(yīng)的中斷源進(jìn)行屏蔽。但對于較高優(yōu)先權(quán)的輸入線實(shí)現(xiàn)屏蔽并不影響較低優(yōu)先權(quán)的輸入?! ?).?dāng)?shù)據(jù)總線緩沖器:是8259A與系統(tǒng)數(shù)據(jù)總線的接口,它是8位的雙向三態(tài)緩沖器。凡是CPU對8259A編程時(shí)的控制字,都是通過它寫入8259A的,8259A狀態(tài)信息,也是通過它讀入CPU的;在中斷響應(yīng)周期,8259A送至數(shù)據(jù)總線的CALL指令或中斷向量也是通過它傳送的。 6).讀/寫控制邏輯:CPU能通過它實(shí)現(xiàn)對8259A的讀出(狀態(tài)信號(hào))和寫入(初始化編程)?! ?).級連緩沖器:實(shí)現(xiàn)8259A芯片之間的級連,使得中斷源可由8級擴(kuò)展至64級?! ?).控制邏輯部分:對芯片內(nèi)部的工作進(jìn)行控制,使它按編程的規(guī)定工作。
8.8259A的級連 在一個(gè)系統(tǒng)中,8259A可以級連,有一個(gè)主8259A,若干個(gè)從8259A,最多可以有8個(gè)從8259A,把中斷源擴(kuò)展到64個(gè)。
非 法 傳 送 種 種
1.兩個(gè)操作數(shù)的類型不一致 –-----例如源操作數(shù)是字節(jié),而目的操作數(shù)是字;或相反
• 絕大多數(shù)雙操作數(shù)指令,除非特別說明,目的操作數(shù)與源操作數(shù)必須類型一致,否則為非法指令 MOV AL , 050AH;非法指令:050Ah為字,而AL為字節(jié)
• 寄存器有明確的字節(jié)或字類型,有寄存器參與的指令其操作數(shù)類型就是寄存器的類型
• 對于存儲(chǔ)器單元與立即數(shù)同時(shí)作為操作數(shù)的情況,必須顯式指明;
byte ptr 指示字節(jié)類型 , word ptr 指示字類型。
2.兩個(gè)操作數(shù)不能都是存儲(chǔ)器 –------傳送指令很靈活,但主存之間的直接傳送卻不允許
• 8086指令系統(tǒng)不允許兩個(gè)操作數(shù)都是存儲(chǔ)單元(除串操作指令),要實(shí)現(xiàn)這種傳送,可通過寄存器間接實(shí)現(xiàn)
mov ax , buffer1;ax←buffer1(將buffer1內(nèi)容送ax)
mov buffer2 , ax;buffer2←ax;這里buffer1和buffer2是兩個(gè)字變量、;實(shí)際表示直接尋址方式
3.段寄存器的操作有一些限制 –----段寄存器屬專用寄存器,對他們的操作能力有限
• 不允許立即數(shù)傳送給段寄存器 MOV DS,100H;非法指令:立即數(shù)不能傳送段寄存器
• 不允許直接改變CS值 MOV CS,[SI] ;不允許使用的指令
• 不允許段寄存器之間的直接數(shù)據(jù)傳送 MOV DS,ES;非法指令:不允許段寄存器間傳送
MOV BL,AX(數(shù)據(jù)長度不匹配)
MOV DS,2000H(不允許給段存儲(chǔ)器用立即數(shù)賦值)
MOV CS,AX(禁止用MOV指令給CS賦值)
MOV [AX],[2000H](禁止直接在存儲(chǔ)器間傳送)
MOV [2000H],20H(數(shù)據(jù)長度不確切,應(yīng)改為
MOV BYTE PTR [2000H],20H)
1、(1)狀態(tài)標(biāo)志:CF-進(jìn)位標(biāo)志,ZF-零標(biāo)志,SF-符號(hào)標(biāo)志,PF-奇偶標(biāo)志
OF-溢出標(biāo)志,AF-輔助進(jìn)位標(biāo)志。
(2)控制標(biāo)志:DF-方向標(biāo)志,IF-中斷允許標(biāo)志,TF-陷井標(biāo)志。
2、8086機(jī)器代碼格式一般是:
操作碼尋址方式偏移量立即數(shù)。
3、(1)源操作數(shù)為立即尋址,目的操作數(shù)為寄存器尋址。
?。ǎ玻┰床僮鲾?shù)為寄存器相對尋址,目的操作數(shù)為寄存器尋址。
?。ǎ常┰床僮鲾?shù)為寄存器尋址,目的操作數(shù)為寄存器間接尋址。
?。ǎ矗┰床僮鲾?shù)和目的操作數(shù)均為固定尋址。
4、此題要求出物理地址,物理地址的計(jì)算公式為:
段地址(段首地址)*10H+偏移地址(有效地址)
(1)源操作數(shù)為立即尋址方式,操作數(shù)地址就在本條指令中。
(2)源操作數(shù)為直接尋址方式,其物理地址為
DS*10H+100H=20100H
(3)源操作數(shù)為寄存器間接尋址,其物理地址為
SS*10H+BP=15010H
(4)源操作數(shù)為基址變址尋址,其物理地址為
DS*10H+BX+SI+VAL=201E0H
8086 有14個(gè)16位寄存器,這14個(gè)寄存器按其用途可分為(1)通用寄存器、(2)指令指針、(3)標(biāo)志寄存器和(4)段寄存器等4類。 (1)通用寄存器有8個(gè), 又可以分成2組,一組是數(shù)據(jù)寄存器(4個(gè)),另一組是指針寄存器及變址寄存器(4個(gè)). 數(shù)據(jù)寄存器分為: AH&AL=AX(accumulator):累加寄存器,常用于運(yùn)算;在乘除等指令中指定用來存放操作數(shù),另外,所有的I/O指令都使用這一寄存器與外界設(shè)備傳送數(shù)據(jù). BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):計(jì)數(shù)寄存器,常用于計(jì)數(shù);常用于保存計(jì)算值,如在移位指令,循環(huán)(loop)和串處理指令中用作隱含的計(jì)數(shù)器. DH&DL=DX(data):數(shù)據(jù)寄存器,常用于數(shù)據(jù)傳遞。他們的特點(diǎn)是,這4個(gè)16位的寄存器可以分為高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。這2組8位寄存器可以分別尋址,并單獨(dú)使用。另一組是指針寄存器和變址寄存器,包括: SP(Stack Pointer):堆棧指針,與SS配合使用,可指向目前的堆棧位置; BP(Base Pointer):基址指針寄存器,可用作SS的一個(gè)相對基址位置; SI(Source Index):源變址寄存器可用來存放相對于DS段之源變址指針; DI(Destination Index):目的變址寄存器,可用來存放相對于 ES 段之目的變址指針。這4個(gè)16位寄存器只能按16位進(jìn)行存取操作,主要用來形成操作數(shù)的地址,用于堆棧操作和變址運(yùn)算中計(jì)算操作數(shù)的有效地址。 (2) 指令指針I(yè)P(Instruction Pointer) 指令指針I(yè)P是一個(gè)16位專用寄存器,它指向當(dāng)前需要取出的指令字節(jié),當(dāng)BIU從內(nèi)存中取出一個(gè)指令字節(jié)后,IP就自動(dòng)加1,指向下一個(gè)指令字節(jié)。注意,IP指向的是指令地址的段內(nèi)地址偏移量,又稱偏移地址(Offset Address)或有效地址(EA,Effective Address)。 (3)標(biāo)志寄存器FR(Flag Register) 8086有一個(gè)18位的標(biāo)志寄存器FR,在FR中有意義的有9位,其中6位是狀態(tài)位,3位是控制位。 OF: 溢出標(biāo)志位OF用于反映有符號(hào)數(shù)加減運(yùn)算所得結(jié)果是否溢出。如果運(yùn)算結(jié)果超過當(dāng)前運(yùn)算位數(shù)所能表示的范圍,則稱為溢出,OF的值被置為1,否則,OF的值被清為0。 DF:方向標(biāo)志DF位用來決定在串操作指令執(zhí)行時(shí)有關(guān)指針寄存器發(fā)生調(diào)整的方向。 IF:中斷允許標(biāo)志IF位用來決定CPU是否響應(yīng)CPU外部的可屏蔽中斷發(fā)出的中斷請求。但不管該標(biāo)志為何值,CPU都必須響應(yīng)CPU外部的不可屏蔽中斷所發(fā)出的中斷請求,以及CPU內(nèi)部產(chǎn)生的中斷請求。具體規(guī)定如下: (1)、當(dāng)IF=1時(shí),CPU可以響應(yīng)CPU外部的可屏蔽中斷發(fā)出的中斷請求; (2)、當(dāng)IF=0時(shí),CPU不響應(yīng)CPU外部的可屏蔽中斷發(fā)出的中斷請求。 TF:跟蹤標(biāo)志TF。該標(biāo)志可用于程序調(diào)試。TF標(biāo)志沒有專門的指令來設(shè)置或清楚。(1)如果TF=1,則CPU處于單步執(zhí)行指令的工作方式,此時(shí)每執(zhí)行完一條指令,就顯示CPU內(nèi)各個(gè)寄存器的當(dāng)前值及CPU將要執(zhí)行的下一條指令。(2)如果TF=0,則處于連續(xù)工作模式。 SF:符號(hào)標(biāo)志SF用來反映運(yùn)算結(jié)果的符號(hào)位,它與運(yùn)算結(jié)果的最高位相同。在微機(jī)系統(tǒng)中,有符號(hào)數(shù)采用補(bǔ)碼表示法,所以,SF也就反映運(yùn)算結(jié)果的正負(fù)號(hào)。運(yùn)算結(jié)果為正數(shù)時(shí),SF的值為0,否則其值為1。 ZF: 零標(biāo)志ZF用來反映運(yùn)算結(jié)果是否為0。如果運(yùn)算結(jié)果為0,則其值為1,否則其值為0。在判斷運(yùn)算結(jié)果是否為0時(shí),可使用此標(biāo)志位。 AF:下列情況下,輔助進(jìn)位標(biāo)志AF的值被置為1,否則其值為0: (1)、在字操作時(shí),發(fā)生低字節(jié)向高字節(jié)進(jìn)位或借位時(shí); (2)、在字節(jié)操作時(shí),發(fā)生低4位向高4位進(jìn)位或借位時(shí)。 PF:奇偶標(biāo)志PF用于反映運(yùn)算結(jié)果中“1”的個(gè)數(shù)的奇偶性。如果“1”的個(gè)數(shù)為偶數(shù),則PF的值為1,否則其值為0。 CF:進(jìn)位標(biāo)志CF主要用來反映運(yùn)算是否產(chǎn)生進(jìn)位或借位。如果運(yùn)算結(jié)果的最高位產(chǎn)生了一個(gè)進(jìn)位或借位,那么,其值為1,否則其值為0。) 4)段寄存器(Segment Register) 為了運(yùn)用所有的內(nèi)存空間,8086設(shè)定了四個(gè)段寄存器,專門用來保存段地址: CS(Code Segment):代碼段寄存器; DS(Data Segment):數(shù)據(jù)段寄存器; SS(Stack Segment):堆棧段寄存器; ES(Extra Segment):附加段寄存器。當(dāng)一個(gè)程序要執(zhí)行時(shí),就要決定程序代碼、數(shù)據(jù)和堆棧各要用到內(nèi)存的哪些位置,通過設(shè)定段寄存器 CS,DS,SS 來指向這些起始位置。通常是將DS固定,而根據(jù)需要修改CS。所以,程序可以在可尋址空間小于64K的情況下被寫成任意大小。 所以,程序和其數(shù)據(jù)組合起來的大小,限制在DS 所指的64K內(nèi),這就是COM文件不得大于64K的原因。8086以內(nèi)存做為戰(zhàn)場,用寄存器做為軍事基地,以加速工作。
由于16位/32位CPU是微機(jī)CPU的兩個(gè)重要代表,所以,在此只介紹它們內(nèi)部寄存器的名稱及其主要功能。
1、 16位寄存器組
16位CPU所含有的寄存器有
4個(gè)數(shù)據(jù)寄存器(AX、BX、CX和DX)
2個(gè)變址和指針寄存器(SI和DI) 2個(gè)指針寄存器(SP和BP)
4個(gè)段寄存器(ES、CS、SS和DS)
1個(gè)指令指針寄存器(IP) 1個(gè)標(biāo)志寄存器(Flags)
2、 32位寄存器組
32位CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指針和標(biāo)志寄存器從16位擴(kuò)充成32位之外,還增加了2個(gè)16位的段寄存器:FS和GS。
32位CPU所含有的寄存器有
4個(gè)數(shù)據(jù)寄存器(EAX、EBX、ECX和EDX)
2個(gè)變址和指針寄存器(ESI和EDI) 2個(gè)指針寄存器(ESP和EBP)
6個(gè)段寄存器(ES、CS、SS、DS、FS和GS)
1個(gè)指令指針寄存器(EIP) 1個(gè)標(biāo)志寄存器(EFlags)
具有一個(gè)輸入端口和兩個(gè)輸出端口。
宏與子程序的區(qū)別宏和子程序都是為了簡化源程序的編寫,提高程序的可維護(hù)性,但是它們二者之間存在著以下本質(zhì)的區(qū)別: 1、在源程序中,通過書寫宏名來引用宏,而子程序是通過CALL指令來調(diào)用; 2、匯編程序?qū)晖ㄟ^宏擴(kuò)展來加入其定義體,宏引用多少次,就相應(yīng)擴(kuò)展多少次,所以,引用宏不會(huì)縮短目標(biāo)程序;而子程序代碼在目標(biāo)程序中只出現(xiàn)一次,調(diào)用子程序是執(zhí)行同一程序段,因此,目標(biāo)程序也得到相應(yīng)的簡化; 3、宏引用時(shí),參數(shù)是通過“實(shí)參”替換“形參”的方式來實(shí)現(xiàn)傳遞的,參數(shù)形式靈活多樣,而子程序調(diào)用時(shí),參數(shù)是通過寄存器、堆?;蚣s定存儲(chǔ)單元進(jìn)行傳遞的; 4、宏引用語句擴(kuò)展后,目標(biāo)程序中就不再有宏引用語句,運(yùn)行時(shí),不會(huì)有額外的時(shí)間開銷,而子程序的調(diào)用在目標(biāo)程序中仍存在,子程序的調(diào)用和返回均需要時(shí)間。總之,當(dāng)程序片段不長,速度是關(guān)鍵因素時(shí),可采用宏來簡化源程序,但當(dāng)程序片段較長,存儲(chǔ)空間是關(guān)鍵因素時(shí),可采用子程序的方法來簡化源程序和目標(biāo)程序。
DATA SEGMENT
MSG1 DB
MSG2 DW
DATA ANDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX, DATA
MOV DS, AX
MOV DX OFFSET MSG1
( MOV BX
MOV AH, 4CH
INT 21H
CODE ENDS
END START
關(guān)于assume的作用,許多人都簡單的解釋說,這是告訴編譯器哪一個(gè)段和哪一個(gè)段寄存器相關(guān)聯(lián)。舉個(gè)簡單例子來說: assumecs:code,ds:data 這是告訴編譯器cs和code關(guān)聯(lián),ds和data關(guān)聯(lián),后來又看到這樣的代碼 movax,data movds,ax 讓許多人一頭霧水,既然ds和data關(guān)聯(lián)了,怎么又要把data的值送到ds,這到底是怎么回事? 這里,先不做過多的說明,我們先看看下面這個(gè)例子:
下面的程序,把data段中的字符串拷貝到dseg段中,并且調(diào)用dos的21h中斷的9號(hào)功能來顯示 dseg段中的字符串:
;segtest.asm datasegment msgdb'Hello,howareyou?',0dh,0ah,24h dataends dsegsegment hellodb32dup(0) db0dh,0ah,24h dsegends codesegment assumecs:code,ds:dseg,es:data start: movax,dseg movds,ax;把dseg段的段地址送入ds movax,data moves,ax;把data段的段地址送入es movsi,offsetmsg;把源字符串的偏移送入si movdi,offsethello;把目標(biāo)字符串的偏移送入di cploop: moval,msg[si];(1)這里是一個(gè)寄存器相對尋址,那么這個(gè)物理地址是怎么形成的呢? cmpal,24h jzok movhello[di],al;(2)這里又是一個(gè)寄存器相對尋址,這個(gè)物理地址又是怎么形成的? incsi incdi jmpshortcploop ok: movdx,offsethello movah,9h int21h movax,4c00h int21h codeends endstart
對于(1)和(2)中兩個(gè)地址的形成我們來分析一下: 這兩個(gè)都是寄存器相對尋址,即有效地址都是一個(gè)寄存器加上一個(gè)16位的偏移量 對于(1)EA=(si)+msg的偏移地址 物理地址就是:(段寄存器)×16+EA 段寄存器有四個(gè)cs,ds,es,ss,那么編譯器怎么知道用哪一個(gè)呢?這里就顯示出了assume的作用,是assume告訴了編譯器,data段中的標(biāo)號(hào)的段地址要從es中取得,即這一句: es:data告訴了編譯器在datasegment和dataends之間的所有的標(biāo)號(hào)都要使用es作為段寄存器來尋址,于是當(dāng)編譯器看到這個(gè)msg標(biāo)號(hào)的時(shí)候,它就知道了這里物理地址的形成是用(es)×16+EA 同理,對于(2),當(dāng)編譯器看到hello這個(gè)標(biāo)號(hào)的時(shí)候,它就知道要取ds中的值作為段地址。如果沒有 assume說明哪一個(gè)段和哪一個(gè)寄存器關(guān)聯(lián),那么,編譯器就無法確定到底用哪一個(gè)段寄存器來計(jì)算物理地址。
從這里,我們也可以看出,assume的作用僅僅是告訴編譯器,我碰到一個(gè)標(biāo)號(hào),要計(jì)算它的物理地址的時(shí)候,從哪一個(gè)段寄存器里面取出段值,至于這個(gè)段寄存器的值對不對,那它就不管了,這是程序員的事情,反正它只管根據(jù)assume里面的設(shè)定來用段寄存器,所以,對于程序員來說,不僅要用assume告訴編譯器計(jì)算物理地址的時(shí)候要從哪一個(gè)段寄存器取值,而且要在指令中明確的把對應(yīng)段的段值送到設(shè)定好的段寄存器中。 用偽指令assume告訴編譯器,data段中的標(biāo)號(hào)的段地址要從es中取值,而指令 movax,data moves,ax 則把data段的段地址送入es中,這樣編譯器計(jì)算msg標(biāo)號(hào)的物理地址的時(shí)候,才能得到正確的段地址。
當(dāng)然,如果你不用assume指明哪一個(gè)段和哪一個(gè)寄存器相關(guān)聯(lián),比如我把a(bǔ)ssumecs:code,ds:dseg,es:data改為 assumecs:code這也可以,即我不把ds和dseg關(guān)聯(lián),也不把es和data關(guān)聯(lián),但是你必須在指令中明確的告訴編譯器使用哪一個(gè)段寄存器 指令moval,msg[si]必須改為moval,es:msg[si],而指令movhello[di],al也必須改為movds:hello[di],al,這樣編譯器才能知道使用哪一個(gè)段寄存器計(jì)算物理地址。如果編譯器無法確定標(biāo)號(hào)的段地址,那么程序編譯就不會(huì)通過。
總結(jié)
以上所述是小編給大家介紹的詳解匯編語言各種指令的解釋與用法,希望對大家有所幫助!
相關(guān)文章
計(jì)算機(jī)系統(tǒng)匯編語言和機(jī)器語言深入理解
這篇文章主要為大家介紹了計(jì)算機(jī)系統(tǒng)匯編語言和機(jī)器語言深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09詳解匯編語言中中括號(hào)[]作用及l(fā)ea和mov指令的區(qū)別
這篇文章主要介紹了匯編語言中中括號(hào)[]作用及l(fā)ea和mov指令的區(qū)別,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01