? ? ? ? 計(jì)算機(jī)通過執(zhí)行指令序列來使機(jī)器得以工作鸵鸥,所以對于每一系列的計(jì)算機(jī)都有指定的一組指令集供計(jì)算機(jī)使用奠滑,這組指令集就叫做計(jì)算機(jī)的指令系統(tǒng);指令可分為操作碼和操作數(shù)兩部分妒穴,計(jì)算機(jī)執(zhí)行指令時(shí)將根據(jù)對應(yīng)的二進(jìn)制代碼識別操作碼并加以執(zhí)行操作碼對應(yīng)的操作宋税;
? ? ? ? 操作數(shù)部分比較復(fù)雜,每一條指令可根據(jù)操作數(shù)的個(gè)數(shù)分為一地址指令讼油、二地址指令和三地址指令杰赛,其中三地址指令中有兩個(gè)操作數(shù)是源操作數(shù)加以運(yùn)算后的結(jié)果存放在第三個(gè)操作數(shù)對應(yīng)的地址單元中;二地址指令是將兩個(gè)操作數(shù)運(yùn)算過后的結(jié)果存放在第一個(gè)操作數(shù)對應(yīng)的地址單元里矮台,所以這種操作將會使一位操作數(shù)損失乏屯,若以后還需用到該操作數(shù)應(yīng)加以提前保存副本;尋找操作數(shù)的方式相對的復(fù)雜一些瘦赫,以下將做重點(diǎn)介紹辰晕。
? ? ? ? 另外匯編語言是一種符號語言,用助記符表示操作碼确虱,用符號或者符號地址表示操作數(shù)含友,且每一條都與機(jī)器指令一一對應(yīng);這篇文章將從80X86的尋址方式校辩、程序占有的空間和執(zhí)行時(shí)間和80X86的指令系統(tǒng)三個(gè)方面進(jìn)行說明窘问;(以80X86講起)
一:80X86的尋址方式
? ? ? ? 有兩個(gè)方面:與數(shù)據(jù)有關(guān)的尋址方式和與轉(zhuǎn)移地址有關(guān)的尋址方式。數(shù)據(jù)尋址方式中將以MOV ? ? D宜咒,S為例惠赫,表示把源操作數(shù)S傳送到目的操作數(shù)D中;
數(shù)據(jù)尋址方式:
1荧呐、立即尋址方式
? ? ? 操作數(shù)直接存放在指令中汉形,作為指令的一部分存放在代碼段中纸镊,并且緊跟在操作碼之后;這種方式常常用來表示常數(shù)概疆,對寄存器進(jìn)行賦值逗威,源操作數(shù)的長度應(yīng)該和目的操作數(shù)的長度一致;如:
MOV ? ? ?AX岔冀,3064H
2凯旭、寄存器尋址方式
? ? ? ? 操作數(shù)在寄存器中,不需要訪問存儲器使套,所以有較高的運(yùn)算速度罐呼;如:
MOV ? ? AX,BX
若執(zhí)行前(AX)=3064H侦高,(BX)=1234H嫉柴,執(zhí)行后(AX)=(BX)=1234H
3、直接尋址方式
? ? ? 這種方式操作數(shù)的有效地址只有位移量一種成分奉呛;如:
MOV ? ? AX计螺,[2000H]
如果(DS)=3000好,執(zhí)行如圖:
另:用符號地址代替數(shù)值地址
MOV ? ? AX瞧壮,VALUE和MOV ? ? AX登馒,[VALUE]是等效的
4、寄存器間接尋址方式
? ? ? ? 操作數(shù)的有效地址只包含基址寄存器或者變趾寄存器內(nèi)容一種成分咆槽;另外陈轿,16位尋址時(shí)除BP寄存器默認(rèn)段寄存器為SS外,其它的默認(rèn)寄存器為DS秦忿;
如:MOV ? ? AX麦射,[BX]
若(DS)=2000H,(BX)=1000H小渊,則:物理地址=20000+1000=21000H法褥,結(jié)果為(AX)=50A0H;執(zhí)行如下
5酬屉、寄存器相對尋址方式
? ? ? ? 操作數(shù)的有效地址為基址寄存器或變址寄存器的內(nèi)容與指令中指定的位移量兩種成分構(gòu)成半等,即兩種成分相加即為有效地址;
如:MOV ? ? AX呐萨,COUNT[SI]
也可以表示為MOV ? ? AX杀饵,[count+si](不區(qū)分大小寫);若:(ds)=3000h,(si)=2000h,count=3000h,物理地址=30000+2000+3000=35000H谬擦,執(zhí)行結(jié)果(ax)=1234h;執(zhí)行情況如下:
6切距、基址變址尋址方式
? ? ? 操作數(shù)的有效地址有兩種成分構(gòu)成,即變址寄存器內(nèi)容和基址寄存器內(nèi)容之和惨远;
如:mov ? ? ax,[bx][di]或者寫為mov ? ? ax,[bx+di]谜悟;若(ds)=2100h,(bx)=0158h,di=10A5h话肖;物理地址=21000+0158+10A5=221FDH;執(zhí)行結(jié)果(ax)=1234H葡幸;如下:
7最筒、相對基址變址尋址方式
操作數(shù)的有效地址是一個(gè)基址寄存器與一個(gè)變址寄存器的內(nèi)容和指令中指定的位移量之和,故有三種成分構(gòu)成;
如:mov ? ? ax,array[bx][si];若(ds)=3000h,(bx)=2000h,(si)=1000h,mask=0250h;物理地址=16d*3000+2000+1000+0250=33250h;執(zhí)行如下:
與轉(zhuǎn)移地址有關(guān)的尋址方式:
1蔚叨、段內(nèi)直接尋址
? ? ? ? 轉(zhuǎn)向的有效地址為當(dāng)前IP內(nèi)容與指令中指定的8位或16位位移量之和;當(dāng)用于條件轉(zhuǎn)移時(shí)床蜘,位移量只允許8位;當(dāng)用于無條件轉(zhuǎn)移時(shí),位移量為8位時(shí)表示段內(nèi)短轉(zhuǎn)移蔑水,此時(shí)須在位移量之前加上short字符邢锯,如jmp ? ? short quest;無條件轉(zhuǎn)移位移量為16位時(shí),稱為段內(nèi)近轉(zhuǎn)移搀别,須在位移量前加操作符near ptr,如:jmp ? ? near ptr quest;其中quest為位移量符號;
2丹擎、段內(nèi)間接尋址
? ? ? ? 這種轉(zhuǎn)移轉(zhuǎn)向的有效地址是寄存器或者存儲單元里的內(nèi)容,也就是將寄存器或者存儲單元里的內(nèi)容取代以前IP寄存器里的內(nèi)容;這種段內(nèi)轉(zhuǎn)移指令不能作為條件轉(zhuǎn)移指令使用;如:
jmp ? ? bx
jmp ? ? word ptr[bp+table]
注意:這里的轉(zhuǎn)向的有效地址是指根據(jù)尋址方式得到的存儲單元或者寄存器里的內(nèi)容;
3歇父、段間直接尋址
這種轉(zhuǎn)移方式除了將指令中指定的偏移地址取代IP寄存器里的內(nèi)容外鸥鹉,還需要將指令中指定的內(nèi)容所在的段地址取代cs段里內(nèi)容,此時(shí)用far ptr操作符表示;如:
jmp ? ? far ptr nextroutint
4庶骄、段間間接轉(zhuǎn)移
? ? ? ? 用存儲器里兩個(gè)連續(xù)的字來取代cs和ip的內(nèi)容,此時(shí)存儲器里的內(nèi)容可以用除立即數(shù)以外的任意一種數(shù)據(jù)尋址方式獲得;若用此方式須在指令中加以dword ptr字符践磅,如:
jmp ? ? dword ptr[inters+bx]
二单刁、程序占有的空間和執(zhí)行時(shí)間
? ? ? ?對于一條指令來說,若為16位則一條指令的長度可達(dá)到1至7個(gè)字節(jié)府适,而對于不同的尋址方式使用操作數(shù)也需要時(shí)間這就在空間和時(shí)間上有了限制羔飞,所以編制程序時(shí)應(yīng)考慮這兩個(gè)因素使程序更加的精煉;
三、80X86的指令系統(tǒng)
? ? ? ? 此系列的指令系統(tǒng)可以分別為以下六組:數(shù)據(jù)傳送指令檐春、串處理指令逻淌、算術(shù)指令、控制轉(zhuǎn)移指令疟暖、邏輯指令和處理機(jī)控制指令卡儒,此處不對處理機(jī)控制指令作說明,有興趣者可自己查閱相關(guān)書籍;
數(shù)據(jù)傳送指令:
這種指令負(fù)責(zé)把數(shù)據(jù)俐巴、地址或者立即數(shù)傳送到寄存器或者存儲單元中骨望,有以下五類,分別作以下說明;
1欣舵、通用數(shù)據(jù)傳送指令
mov傳送指令:
格式:mov ? ? dst,src;
執(zhí)行的操作:(dst)←(src);其中擎鸠,dst為目的操作數(shù),src為原操作數(shù);
? ? ? ?在此指令中需要注意以下規(guī)則:兩個(gè)操作數(shù)不能同時(shí)為存儲單元缘圈、立即數(shù)不能作為目的操作數(shù)使用劣光、不能在兩個(gè)段寄存器間傳送信息袜蚕,立即數(shù)不能直接送至段寄存器、目的操作數(shù)不允許用cs寄存器;另外以下是允許操作類型:寄存器到寄存器绢涡、立即數(shù)到寄存器牲剃、立即數(shù)到存儲單元、存儲單元到寄存器垂寥、寄存器到存儲單元颠黎、寄存器或存儲單元到除cs段外的任何段寄存器;此指令不影響標(biāo)志位;
如 mov ? ? ax,data_seg ? ? ? mov ? ? ds,ax
push進(jìn)棧:
格式:push src
執(zhí)行操作:
16位指令(sp)←(sp)-2
? ? ? ? ? ? ? ?((sp+1),(sp))←(src)
如: ?push ax
執(zhí)行情況如下: ? ? ?
注意此操作不能用立即數(shù)方式;
pop出棧指令:
格式: ? ?格式:pop dst
執(zhí)行操作:
16位指令(dst)←((sp+1)滞项,(sp))
? ? ? ? ? ? ?(sp)←(sp)+2
如: ? pop ax
執(zhí)行如下:
注意此操作目的操作數(shù)不允許用立即數(shù)和cs段寄存器; ?
xchg交換指令:
格式:xchg opr1狭归,opr2
執(zhí)行操作:(opr1)與(opr2)內(nèi)容互換
此指令不允許使用立即數(shù)方式,不允許使用段寄存器文判,而且必須有一個(gè)操作數(shù)為寄存器过椎,不影響標(biāo)志位;如:
xchg bx戏仓,[bp+si]
2疚宇、累加器專用傳送指令
? ? ? 這組指令實(shí)現(xiàn)在I/O端口和CPU之間傳送信息,且CPU接收信息的寄存器只限于AX和AL;外部設(shè)備利用i/O端口號來收發(fā)信息赏殃,i/o端口號最多可有65536個(gè)i/o端口敷待,其中前256個(gè)端口(0~0FFH)可以直接在指令中指定,此時(shí)指令用兩個(gè)字節(jié)表示仁热,第二個(gè)字節(jié)就是要表示的端口號榜揖,這種方式稱為長格式;另外抗蠢,當(dāng)端口號>=256時(shí)举哟,只能使用短格式,必須將端口號先傳送到DX寄存器迅矛,然后將DX的內(nèi)容傳送到AX妨猩、AL或者EAX寄存器中;
? ? ? 這組指令不影響標(biāo)志位秽褒;
in輸入指令:
長格式:in al,port(字節(jié))壶硅、in ax,port(字);
執(zhí)行的操作:(al)←(port)(字節(jié))销斟、(ax)←((port+1)森瘪,(port))(字);
短格式:in al,dx(字節(jié))、in ax票堵,dx(字);
執(zhí)行的操作:(al)←((dx))(字節(jié))扼睬、(ax)←((dl+1),(dl));
長格式如:in ax,28h
短格式如:
mov dx,3FCH ? ?
in ax,dx
out輸出指令:
長格式:out port,al(字節(jié))、out port,ax(字);
執(zhí)行的操作:(port)←(al)(字節(jié))窗宇、((port+1)葱淳,(port))←(ax)(字);
短格式:out dx,al(字節(jié))戈泼、out dx,ax(字);
執(zhí)行的操作:((dx))←(al)(字節(jié))、((dl+1),(dl))←(ax);
長格式如:out 28h,al
短格式如:
mov dx,ax
out 3FCH,dx
3、地址傳送指令
LEA(load effective address)有效地址送寄存器指令
? ? 這種方式實(shí)現(xiàn)把源操作的有效地址傳送到寄存器中潜必,注意此種方式的源操作數(shù)的尋址方式只能使用出立即數(shù)和寄存器之外的存儲器尋址方式的任意一種哈打;目的操作數(shù)可使用16位的除段寄存器之外的寄存器瑰排;此指令不影響標(biāo)志位殿托;
格式:lea bx,[bx+si+0F62H]
如執(zhí)行之前(bx)=0400H,(si)=003cH
執(zhí)行后:(bx)=0400+003c+0f62=139eh
辨異:上述例子是把源操作數(shù)的有效地址送到bx中,mov bx,[bx+si+0F62H]則是把源操作數(shù)指定的存儲單元的內(nèi)容送到bx中镰官,需要計(jì)算物理地址提前;
LDS(load ds with pointer)、LES(load es with pointer)指針?biāo)图拇嫫髦噶?/b>
? ? ? 這種方式的源操作數(shù)只能用于存儲器尋址的任一種方式泳唠,且目的操作數(shù)的寄存器不能使用段寄存器狈网;該指令是把源操作數(shù)的指定的存儲單元的內(nèi)容送到目的操作數(shù)中,再把源操作數(shù)存儲單元的下一個(gè)存儲單元的內(nèi)容送到指定的存儲器中笨腥;另外這組指令不影響標(biāo)志位拓哺;以LDS指令為例,LES指令操作和LDS操作原理相同脖母,只是指定的寄存器不同士鸥;
格式:LDS REG,SRC
執(zhí)行的操作:
(REG)←(SRC),(DS)←(SRC+2)
如:LES DI,[BX]
執(zhí)行前:(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000h
執(zhí)行后:(DI)=05AEH谆级,(ES)=4000H
4础淤、標(biāo)志寄存器傳送指令
LAHF(load ah with flags)標(biāo)志送AH
格式:lahf ? ? ?
執(zhí)行的操作:(ah)←(flags的低字節(jié))
SAHF(store ah into flags)AH標(biāo)志送至flags寄存器
格式:sahf
執(zhí)行的操作:(flags的低字節(jié))←(ah)
另還有pushf/pushfd、popf/popfd此處不作介紹哨苛,注意這組指令不影響標(biāo)志位;
5币砂、類型轉(zhuǎn)換指令
CBW(convert byte to word) 字節(jié)轉(zhuǎn)換為字指令
格式:cbw
執(zhí)行的操作:將al中的內(nèi)容擴(kuò)展到ah中建峭,若(al)最高有效位為0,(ah)為0决摧;若(al)的最高有效位為1亿蒸,則(ah)為0FFH;
算術(shù)指令:
? ? ? 該指令有雙操作數(shù)和單操作數(shù)之分,雙操作數(shù)不允許目的操作數(shù)和源操作數(shù)同時(shí)為存儲器尋址方式單操作數(shù)不允許使用立即數(shù)方式掌桩;
1边锁、加法指令
ADD(add)加法:
格式:add dst,src
執(zhí)行的操作:(dst)←(dst)+(src)
此操作影響標(biāo)志位;
ADC(add with carry)帶進(jìn)位加法:
格式:adc dst,src
執(zhí)行的操作:(dst)←(dst)+(src)+cf;cf為帶進(jìn)位的值波岛;
此操作影響標(biāo)志位茅坛;
INC(increment)加1:
格式:inc opr
執(zhí)行的操作:(opr)←(opr)+1
此操作不影響標(biāo)志位;
? ? ? 上面指令提到add和adc指令影響標(biāo)志位则拷,標(biāo)志位中最主要的是of(overflow flag)溢出標(biāo)志贡蓖、cf(carry flag)進(jìn)位標(biāo)志曹鸠、zf(zero flag)零標(biāo)志、sf(sign flag)符號標(biāo)志斥铺;其中當(dāng)結(jié)果為零時(shí)zf為1彻桃,否則為0;結(jié)果為負(fù)時(shí)sf為1,否則為0晾蜘;考慮of位時(shí)須把操作數(shù)當(dāng)成有符號數(shù)看待邻眷,對于加法來講,若操作數(shù)符號相同結(jié)果的符號與之相反則of置為1剔交,否則置為0肆饶;考慮cf位時(shí)須把操作數(shù)當(dāng)成無符號數(shù)看待,最高有效位有進(jìn)位時(shí)置為1省容,否則置為0抖拴;如下例:
add dx,0F0F0H;執(zhí)行前(dx)=4652h
操作如下:0100 0110 0101 0010
? ? ? ? ? ? ? ? ? ?+1111 0000 1111 0000
=0011 0111 0100 0010(有進(jìn)位1)
看作有符號數(shù): ?則運(yùn)算前符號相反故of=0,看作無符號數(shù):有進(jìn)位故cf=1;結(jié)果符號為正故sf=0;結(jié)果不為零故zf=0;
2腥椒、減法指令
SUB(subtract)減法指令:
格式:sub dst,src
執(zhí)行的操作:(dst)←(dst)-(src);此操作影響標(biāo)志位阿宅;
SBB(subtract with borrow)帶借位減法:
格式:sub dst,src
執(zhí)行的操作:(dst)←(dst)-(src)-cf;此操作影響標(biāo)志位;
DEC(decrement)減1指令:
格式:dec opr
執(zhí)行的操作:(opr)←(opr)-1;此操作不影響cf標(biāo)志位笼蛛;
CMP(compare)比較指令:
格式:cmp opr1,opr2
執(zhí)行的操作:(opr1)-(opr2);此操作影響條件標(biāo)志位洒放;
? ? ? 現(xiàn)在來說說減法對標(biāo)志位的影響;對于zf和sf的設(shè)置同加法指令相同滨砍,這里不再贅述往湿;設(shè)置of位時(shí),把操作數(shù)看作有符號數(shù)惋戏,若被減數(shù)與減數(shù)的符號相反結(jié)果與減數(shù)的符號相同的話則of位置為1领追,否則置為1;設(shè)置cf位時(shí)响逢,把操作數(shù)看作無符號數(shù)绒窑,若被減數(shù)<減數(shù)則cf置為1,否則置為0舔亭;如下例:
sub [si+14H],0136H;
指令執(zhí)行之前(ds)=3000H,(si)=0040h,(30054h)=4336h;
如下:0100 0011 0011 0110
? ? ? ? ? ?-0000 0001 0011 0110
? ? ? ? ? =0100 0010 0000 0000
? ? ?作如下判斷:結(jié)果不為零則zf位為0些膨,結(jié)果為正則sf置為0,當(dāng)成無符號數(shù)看待被減數(shù)>減數(shù)則cf置為0钦铺,當(dāng)成有符號數(shù)看待订雾,被減數(shù)與減數(shù)的符號相同,故of置為0矛洞;
3洼哎、乘法指令
指令中的源操作數(shù)的尋址方式可以是初立即數(shù)以外的任意一種方式;目的操作數(shù)為累加器;
MUL(unsigned multiple):無符號數(shù)乘法
格式:mul src
執(zhí)行的操作:源操作數(shù)為8位則相乘得到的16位存放到AX谱净,AH存放高位字節(jié)窑邦,AL存放低位字節(jié);源操作數(shù)為16位時(shí)壕探,結(jié)果存放到DX和AX中冈钦,DX存放高位,AX存放低位李请;此操作影響of位和cf位其它條件標(biāo)志位沒有定義瞧筛;
iMUL(signed multiple):有符號數(shù)乘法
格式:imul src
執(zhí)行的操作:和有符號數(shù)相同,不過此操作必須是帶符號數(shù)导盅;
? ? ? 乘法對標(biāo)志位的影響如下:對于無符號數(shù)來講较幌,若乘積的高一半為零則cf=of=0,否則為1;對于有符號數(shù)來講白翻,若乘積的高一半是低一半的字節(jié)的符號擴(kuò)展乍炉,則cf=of=0,否則為1;如下例:
mul bl;指令執(zhí)行前(al)=0B4H滤馍,(bl)=11H;
執(zhí)行的結(jié)果為:0000 1011 1111 0100
結(jié)果的前一半不全為零岛琼,故cf=of=1;
4、除法指令
指令中的源操作數(shù)的尋址方式可以是初立即數(shù)以外的任意一種方式巢株;目的操作數(shù)為累加器槐瑞;
DIV(unsigned divided)無符號數(shù)除法指令:
格式:div src
執(zhí)行的操作:若除數(shù)為8位,則被除數(shù)為16位且保存在ax中阁苞,相除得到的結(jié)果的8位商保存在al中困檩,得到的8位余數(shù)保存在ah中;若除數(shù)為16位那槽,則被除數(shù)為32位悼沿,高位保存在DX寄存器中,低位保存在AX中骚灸,相除得到的結(jié)果的16位商保存在ax中糟趾,得到的16位的余數(shù)保存在dx中;此指令對所有的條件碼均無定義逢唤;
IDIV(signed divided)帶符號數(shù)除法指令:
格式:idiv src
執(zhí)行的操作:和div相同,但要求操作數(shù)必須為帶符號數(shù)涤浇,商和余數(shù)也都是帶符號數(shù)鳖藕,且余數(shù)的符號和被除數(shù)相同;對所有的條件碼均無定義只锭;
邏輯指令:
1著恩、邏輯運(yùn)算指令
AND(and)邏輯與指令
格式:and dst,src
執(zhí)行的操作為(dst)←(dst)∧(src);
OR(or)邏輯或指令
格式:or dst,src
執(zhí)行的操作為(dst)←(dst)∨(src);
XOR(exclusive or)邏輯或指令
格式:xor dst,src
執(zhí)行的操作為(dst)←(dst)?(src);
TEST(test)測試指令
格式:test opr1,opr2
執(zhí)行的操作:(opr1)∩(opr2)喉誊;結(jié)果不保存邀摆,為了置條件碼;
以上指令中伍茄,not指令不影響標(biāo)志位栋盹,且操作符不能為立即數(shù);其余指令兩個(gè)操作數(shù)的尋址方式不能同時(shí)為存儲器尋址敷矫,且執(zhí)行后使of和cf置為0例获,af無定義,其余位根據(jù)結(jié)果設(shè)置曹仗;上面的指令對于處理操作數(shù)相應(yīng)位比較有用榨汤,如要求屏蔽操作數(shù)的某些位只需利用add指令將源操作數(shù)相應(yīng)位置為0,其余位置為1即可怎茫;要求將操作數(shù)的某些位置為1收壕,則使用or指令令源操作數(shù)的相應(yīng)位置為1,其余位置為0即可轨蛤;要求測試某些位是否為1蜜宪,利用test指令將相應(yīng)位置為1,其余位置為零俱萍,若結(jié)果cf=of=0端壳,zf=1,sf=0則測試的位不為1;要求對目的操作數(shù)的某些位取反枪蘑,則需用xor指令將源操作數(shù)的相應(yīng)位置為1即可损谦;
2、移位指令
? ? ?以下指令的opr部分可以用除立即數(shù)以外的任意一種尋址方式岳颇,當(dāng)移位次數(shù)為1時(shí)可用立即數(shù)1代替cnt符號照捡,當(dāng)移位次數(shù)超過1時(shí),最好把需要移動的位數(shù)送到CL中然后將CL代替CNT符號即可话侧;
SHL(shift logical left)邏輯左移
格式:shl opr,cnt
執(zhí)行的操作如圖:
SAL(shift arithmetic left)算術(shù)左移
格式:sal opr,cnt
執(zhí)行操作和邏輯左移相同栗精;
SHR(shift right)邏輯右移
格式:shr opr,cnt
執(zhí)行操作如圖:
SAR(shift arithmetic right)算術(shù)右移
格式:sar opr,cnt
執(zhí)行操作如圖:
ROL(rotat left)循環(huán)左移
格式:rol opr,cnt
執(zhí)行操作如下:
ROR(rotat right)循環(huán)右移
格式:ror opr,cnt
執(zhí)行操作如圖:
RCL(rotat left through carry)帶進(jìn)位循環(huán)左移
格式:rcl opr,cnt
執(zhí)行操作如圖:
RCR(rotat right through carry)帶進(jìn)位循環(huán)右移
格式:RCR opr,cnt
執(zhí)行操作如下:
上述指令對于cf位的影響如圖,當(dāng)cnt為1時(shí)瞻鹏,of條件標(biāo)志有定義悲立,否則有定義,移位過后當(dāng)最高有效位發(fā)生變化時(shí)of位置為1新博,否則置為0薪夕;另外上述指令對于AF位無定義:
串處理指令:
這一系列指令根據(jù)組合使用可分為兩組,以下做詳細(xì)說明赫悄;
(一)原献、與rep指令組合使用的有movs,stos,lods,ins和outs指令
REP(repeat)重復(fù)指令
格式:rep string primitive
執(zhí)行的操作:string primitive是指movs.stos.lods.ins指令馏慨,當(dāng)要執(zhí)行重復(fù)操作時(shí),需要先將重復(fù)次數(shù)送入cx寄存器中姑隅;執(zhí)行一次重復(fù)指令cx內(nèi)容減1写隶,直到cx內(nèi)容為0停止執(zhí)行;
MOVS(move string)串傳送指令
指令:movs dst,src
執(zhí)行的操作:((di))←((si))
指令movsb(字節(jié)) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
執(zhí)行的操作:((di))+/-1←((si))+/-1
指令:movsw(字) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
執(zhí)行的操作:((di))+/-2←((si))+/-2
? ? ? 說明:此指令的功能是將SI寄存器指向的單元中的內(nèi)容傳送到DI指向的單元中讲仰,可順序存儲(DF=0慕趴,用cld指令設(shè)置),也可倒序存儲(DF=1,用sed指令設(shè)置)叮盘,使用此指令之前還需要將源串的偏移地址(倒序存儲采用串的末地址)移到SI寄存器中秩贰,另外源串的段地址(倒序存儲采用串的末地址)必須要送至數(shù)據(jù)段寄存器中也可使用段跨越前綴指定段寄存器;另外還需處理的是目的串的首地址(倒序存儲采用串的末地址)送至DI寄存器中柔吼,目的串的段地址送至附加段中毒费;該指令不影響條件碼;
LODS(load from string)從串取指令
指令:lods(字節(jié))
執(zhí)行的操作:(al)←((si))
指令:lodsw(字)
執(zhí)行的操作:(ax)=(al),(ah)←((si)愈魏,(si+1))
操作說明:此指令的功能是將si指向的單元中的內(nèi)容傳送到AX或AL寄存器觅玻,可順序存(DF=0,用cld指令設(shè)置)培漏,也可倒序存(DF=1,用sed指令設(shè)置)溪厘,使用此指令之前還需要將源串的首地址(倒序存儲采用串的末地址)送至sI寄存器中,目的串的段地址送至數(shù)據(jù)段中牌柄,允許使用段跨越來修改源段的段寄存器畸悬;該指令不影響條件碼;該指令一般不經(jīng)常和rep指令連用珊佣;
INS(input from port to string)串輸入指令
指令:insb(字節(jié))
執(zhí)行的操作:((di))+/-1←((dx))
指令:insw(字)
執(zhí)行的操作:((di))+/-2←((dx))
說明:把端口號內(nèi)的內(nèi)容存到指定的串單元中蹋宦;
OUTS(output string to port)串輸入指令
指令:outsb(字節(jié))
執(zhí)行的操作:((dx))←((si))+/-1
指令:outsw(字)
執(zhí)行的操作:((dx))←((si))+/-2
說明:把源串里的內(nèi)容送至端口號內(nèi);
(二)與REPZ/REPE(repeat while equal/zero)和REPNE/REPNZ(repeat while not equal/zero)連用的CMPS(compare string)和SCAS(scan string) ? ? ?
REPZ/REPE當(dāng)相等/為零時(shí)重復(fù)串操作
格式:repz/repe string primitive
string primitive可為cmps或scas指令
執(zhí)行的操作:退出條件為zf=0(比較結(jié)果不為零即不相等此時(shí)cf標(biāo)志位為0)或者cx循環(huán)次數(shù)為零咒锻,其余的操作和rep執(zhí)行情況相同冷冗;
REPNZ/REPNE當(dāng)相等/為零時(shí)重復(fù)串操作
格式:repnz/repne string primitive
string primitive可為cmps或scas指令
執(zhí)行的操作:退出條件為zf=1(比較結(jié)果為零即量比較數(shù)相等此時(shí)cf標(biāo)志位為0)或者cx循環(huán)次數(shù)為零,其余的操作和rep執(zhí)行情況相同惑艇;
CMPS串比較指令
指令:cmpsb(字節(jié))
執(zhí)行的操作:將目的串和源串的相應(yīng)字節(jié)相減蒿辙,但不保存結(jié)果,只根據(jù)結(jié)果設(shè)置標(biāo)志位滨巴;其余情況和movb相同思灌;
指令:cmpsw(字)
執(zhí)行的操作:將目的串和源串的相應(yīng)字相減,但不保存結(jié)果恭取,只根據(jù)結(jié)果設(shè)置標(biāo)志位泰偿;其余情況和movb相同;
SCAS串掃描指令
指令:scasb(字節(jié))
執(zhí)行的操作:將AL寄存器里的內(nèi)容和附加段目的串的字節(jié)相比較秽荤,但不保存結(jié)果甜奄,只根據(jù)結(jié)果設(shè)置標(biāo)志位,其余情況和movs指令相同窃款;
指令:scasw(字)
執(zhí)行的操作:將AX寄存器里的內(nèi)容和附加段目的串的字相比較课兄,但不保存結(jié)果,只根據(jù)結(jié)果設(shè)置標(biāo)志位晨继,其余情況和movs指令相同烟阐;
控制轉(zhuǎn)移指令:
這部分內(nèi)容主要由無條件轉(zhuǎn)移指令、條件轉(zhuǎn)移指令紊扬、循環(huán)指令和子程序構(gòu)成蜒茄,其余在這里不作介紹;另外無條件轉(zhuǎn)移指令在8086的尋址方式里已經(jīng)介紹過餐屎,此處也不再贅述檀葛;
1、條件轉(zhuǎn)移指令
這部分指令的opr部分使用了相對尋址方式腹缩,只能使用段內(nèi)的短轉(zhuǎn)移和近轉(zhuǎn)移屿聋,若要進(jìn)行段間的轉(zhuǎn)移則要使用jmp指令;該部分指令不影響條件碼藏鹊,只根據(jù)一次運(yùn)算的結(jié)果設(shè)置的條件判斷是否需要進(jìn)行跳轉(zhuǎn)润讥;條件轉(zhuǎn)移指令可分為三類如下:
(1)根據(jù)單個(gè)條件標(biāo)志的設(shè)置情況判斷是否轉(zhuǎn)移;
JZ/JE(jump if zero/equal)結(jié)果為零或者相等則進(jìn)行轉(zhuǎn)移
格式:jz\je opr
測試條件:zf=1
JNZ/JNE(jump if not zero/equal)結(jié)果不為零或者不相等則進(jìn)行轉(zhuǎn)移
格式:jnz\jne opr
測試條件:zf=0
JS(jump if sign)結(jié)果為負(fù)轉(zhuǎn)移指令
格式:js opr
測試條件:sf=1
JNS(jump if not sign)結(jié)果不為負(fù)則進(jìn)行轉(zhuǎn)移
格式:jns opr
測試條件:sf=0
JO(jump if overflow)溢出則轉(zhuǎn)移
格式:jo opr
測試條件:of=1
JNO(jump if not overflow)溢出則轉(zhuǎn)移
格式:jno opr
測試條件:of=0
JB/JNAE/JC(jump if below,or not above or equal,or carry)低于盘寡,不高于或者進(jìn)位為1轉(zhuǎn)移指令
格式:jb/jnae/jc opr
測試條件:cf=1
JNB/JAE/JNC(jump if not below,or above or equal,or not carry)不低于楚殿,或者高于或者進(jìn)位為零轉(zhuǎn)移指令
格式:jnb/jae/jnc opr
測試條件:cf=0
2、比較兩個(gè)無符號數(shù)竿痰,根據(jù)比較結(jié)果判斷是否轉(zhuǎn)移(高低用below或者above表示)
JB/JNAE/JC脆粥、JNB/JAE/jNC指令和上述情況相同;
JBE/JNA(jump if below or equal,or not above)比較結(jié)果為<=時(shí)轉(zhuǎn)移
格式:jbe/jna opr
測試條件:cf∪zf=1
JNBE/JA(jump if not below or equal,or above)比較結(jié)果為>時(shí)轉(zhuǎn)移
格式:jnbe/ja opr
測試條件:cf∪zf=0
3菇曲、比較兩個(gè)有符號數(shù)冠绢,高低用greater和less表示
JL/JNGE(jump if less,or not greater equal)比較結(jié)果為<時(shí)轉(zhuǎn)移指令
格式:jl/jnge opr
測試條件:sf?of=1
JNL/JGE(jump if not less,or greater or equal)比較結(jié)果為>=時(shí)轉(zhuǎn)移指令
格式:jnl/jge opr
測試條件:sf?of=0
JLE/JNG(jump if less or equal,or not greater)比較結(jié)果為<=時(shí)轉(zhuǎn)移指令
格式:jle/jng opr
測試條件:sf?of∪zf=1
JNLE/JG(jump if not less equal,or greater)比較結(jié)果為>時(shí)轉(zhuǎn)移指令
格式:jnle/jg opr
測試條件:sf?of∪zf=0
2、循環(huán)指令
循環(huán)指令和串操作的重復(fù)指令相差不大常潮,只是循環(huán)的可能是一段程序而不是只針對字符操作弟胀,循環(huán)的比較結(jié)果也循序標(biāo)志位,另外循環(huán)操作次數(shù)也需要提前存入cx寄存器中喊式,循環(huán)指令的opr部分則是使用8位位移量與當(dāng)前ip寄存器內(nèi)容相加孵户,即相當(dāng)于段內(nèi)直接短轉(zhuǎn)移;該指令不影響條件碼指令如下:
LOOP(loop)循環(huán)指令
格式:loop opr
測試條件:cx≠0
LOOPZ/LOOPE(loop if zf=0)當(dāng)結(jié)果為零即判斷結(jié)果相等則執(zhí)行循環(huán)
格式:loopz/loope opr
測試條件:cx≠0或者zf=1
LOOPNZ/LOOPNE(loop if zf=0)當(dāng)結(jié)果為零即判斷結(jié)果相等則執(zhí)行循環(huán)
格式:loopnz/loopne opr
測試條件:cx≠0或者zf=0
3岔留、子程序指令
? ? ? 和高級語言相同的是匯編語言也提供了可以編寫具有特定功能的程序夏哭,稱為子程序;子程序由主程序通過CALL指令調(diào)用献联,在子程序的末尾設(shè)置RET指令用來當(dāng)子程序執(zhí)行完之后返回主程序竖配;子程序可以和主程序設(shè)置在同一段中何址,也可以設(shè)置在不同段中,故CALL和RET指令就有不同的操作類型进胯,這部分指令可以類比跳轉(zhuǎn)指令來看待用爪,只是多了一部分的在堆棧中保存主程序的返回地址,這部分指令不影響條件碼胁镐;以下分別來說明:
(1)偎血、CALL調(diào)用指令
段內(nèi)直接近調(diào)用
格式:CALL DST
執(zhí)行的操作:push(IP)
? ? ? ? ? ? ? ? ? ? (IP)←(IP)+位移量
說明:指令中的DST即是指子程序中的第一條指令的地址;操作的第一步是將當(dāng)前主程序的IP內(nèi)容(當(dāng)前主程序調(diào)用程序的下一條指令的地址)放置在棧中盯漂,第二步是將當(dāng)前(IP)內(nèi)容加上需要調(diào)用程序和當(dāng)前程序之間的位移量放置到(IP)中颇玷;
段內(nèi)間接近調(diào)用
格式:CALL DST
執(zhí)行的操作:push(IP)
? ? ? ? ? ? ? ? ? ?(IP)←(EA)
說明:指令中的DST可以使用初立即數(shù)之外的任意一種尋址方式;操作的第一步是將當(dāng)前主程序的IP內(nèi)容(當(dāng)前主程序調(diào)用程序的下一條指令的地址)放置在棧中就缆,第二步是將按尋址方式尋找到的存儲單元中的有效地址放置到(IP)中帖渠;
段間直接遠(yuǎn)調(diào)用
格式:CALL DST
執(zhí)行的操作:push(CS) ? ? ? ? ? ?;主程序所在的段地址
? ? ? ? ? ? ? ? ? ? ?push(IP) ? ? ? ? ? ? 竭宰;返回主程序的有效地址
? ? ? ?(IP)←(EA)阿弃;按DST的尋址方式尋找到的存儲單元內(nèi)的內(nèi)容作為子程序的有效地址
? ? ? ?(CS)←(EA+2);按DST的尋址方式尋找到的存儲單元的下一單元內(nèi)的內(nèi)容作為子程序的有效地址
(2)羞延、返回指令
返回指令是將主程序存入棧中的內(nèi)容返回到IP和CS寄存器中渣淳,以便繼續(xù)執(zhí)行主程序的后續(xù)指令;如下
段內(nèi)近返回
格式:RET 執(zhí)行的操作伴箩,(IP)←POP()出棧操作
段內(nèi)帶立即數(shù)近返回
格式:RET EXP
執(zhí)行的操作:第一步執(zhí)行(IP)←POP()入愧,第二步根據(jù)EXP表達(dá)式計(jì)算出的位移量修改棧頂指針,即(CS)←(CS)+位移量
段間近返回
格式:RET 執(zhí)行的操作嗤谚,依次執(zhí)行(IP)←POP()出棧操作和(CS)←POP()出棧操作
段間帶立即數(shù)近返回
格式:RET EXP
執(zhí)行的操作:第一步執(zhí)行(IP)←POP()和(CS)←POP()棺蛛,第二步根據(jù)EXP表達(dá)式計(jì)算出的位移量修改棧頂指針,即(CS)←(CS)+位移量