![匯編語言課件:a03b-80x86的指令系統(tǒng)_第1頁](http://file4.renrendoc.com/view/3ce34f3614c18fcb0e9563bbcafaa177/3ce34f3614c18fcb0e9563bbcafaa1771.gif)
![匯編語言課件:a03b-80x86的指令系統(tǒng)_第2頁](http://file4.renrendoc.com/view/3ce34f3614c18fcb0e9563bbcafaa177/3ce34f3614c18fcb0e9563bbcafaa1772.gif)
![匯編語言課件:a03b-80x86的指令系統(tǒng)_第3頁](http://file4.renrendoc.com/view/3ce34f3614c18fcb0e9563bbcafaa177/3ce34f3614c18fcb0e9563bbcafaa1773.gif)
![匯編語言課件:a03b-80x86的指令系統(tǒng)_第4頁](http://file4.renrendoc.com/view/3ce34f3614c18fcb0e9563bbcafaa177/3ce34f3614c18fcb0e9563bbcafaa1774.gif)
![匯編語言課件:a03b-80x86的指令系統(tǒng)_第5頁](http://file4.renrendoc.com/view/3ce34f3614c18fcb0e9563bbcafaa177/3ce34f3614c18fcb0e9563bbcafaa1775.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1第三章80x86的指令系統(tǒng)和尋址方式80x86的指令系統(tǒng)23.380x86的指令系統(tǒng)80x86的指令系統(tǒng)可以分為以下6組:數(shù)據(jù)傳送指令算術(shù)指令邏輯指令串處理指令控制轉(zhuǎn)移指令處理機控制指令33.380x86的指令系統(tǒng)要有效準確的運用指令,需要熟悉系統(tǒng)對每一條指令的要求和約束。對指令要掌握以下內(nèi)容:指令操作數(shù)的尋址方式指令對標志位的影響,標志位對指令的影響指令的執(zhí)行時間,對可完成同樣功能的指令,要選用執(zhí)行時間短的指令43.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令:負責(zé)把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲單元中通用數(shù)據(jù)傳送:MOVPUSHPOP累加器專用傳送(輸入輸出):INOUTXLAT地址傳送:LEALDSLES標志寄存器傳送:LAHFSAHFPUSHFPOPF類型轉(zhuǎn)換指令:CBW
CWD53.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令通用數(shù)據(jù)傳送指令MOV傳送指令格式:MOVReg/MemReg/Mem/ImmReg:Register寄存器Mem:Memory存儲器Imm:Immediate立即數(shù)功能:把源操作數(shù)(第二操作數(shù))的值傳給目的操作數(shù)(第一操作數(shù))指令執(zhí)行后:目的操作數(shù)值被改變,源操作數(shù)值則不變63.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令在匯編語言中,主要數(shù)據(jù)傳送方式如下圖所示:段寄存器CS、DS、SS、ES通用寄存器8位或者16位存儲器立即數(shù)8位或者16位73.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令對MOV指令有如下規(guī)定:兩個操作數(shù)的類型必須相同,要同為8位或者16位。如MOVBL,AX是錯誤的兩個操作數(shù)不能同時為段寄存器。如MOVES,DS是錯誤的代碼段寄存器不能是目的操作數(shù),但可作為源操作數(shù)。如:指令MOVCS,AX是錯誤的,但是MOVAX,CS則是正確的83.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令立即數(shù)不能直接傳給段寄存器。如:MOVDS100H則是錯誤的正確的:MOVAX,100HMOVDS,AX立即數(shù)不能直接作為目的操作數(shù)指令指針I(yè)P不能作為MOV指令的操作數(shù)兩個操作數(shù)不能直接為存儲單元。如MOVVARA,VARB是錯誤的93.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令示例:MOVAL,’E’MOVBX,OFFSETTABLE將TABLE的偏移地址而不是內(nèi)容送到BX寄存器OFFSET是屬性操作符,表示應(yīng)把其后跟著的符號地址的值(不是內(nèi)容)作為操作數(shù)MOVAS,Y[BP][SI]103.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令堆棧:先進后出用途:寄存器在用作多種用途的時候,堆??梢苑奖愕淖鳛槠渑R時保存區(qū)域,在寄存器使用完畢后可恢復(fù)其原始值CALL指令執(zhí)行的時候,CPU用堆棧保存當(dāng)前過程的返回地址調(diào)用過程的時候可以通過堆棧傳遞輸入值過程內(nèi)的局部變量在堆棧上創(chuàng)建,過程結(jié)束的時候被丟棄兩大類操作:進棧操作、出棧操作113.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令PUSH進棧指令指令格式:PUSHReg/Mem一字進棧,系統(tǒng)自動完成兩步操作:(SP)(SP)-2;堆棧指針減2((SP)+1,(SP))(SRC);將數(shù)據(jù)壓入堆棧例:PUSHAX123.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令2816A7SS=5000HSS→50000堆棧段525005250152502SP=2500HSP→3125AX(1)執(zhí)行前283116A7SS=5000HSS→50000堆棧段525005250152502SP=24FEHSP→253125AX524FF524FE(2)執(zhí)行后133.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令POP出棧指令指令格式:POPReg/Mem彈出一個字,系統(tǒng)自動完成兩步操作操作數(shù)(SP)SPSP+2功能:將棧頂內(nèi)容彈出送至某一寄存器,段寄存器(CS除外)或存儲器,堆棧指針加2例:POPBX143.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令(1)執(zhí)行前(2)執(zhí)行后486B9A28SS→50000堆棧段510015100251003SP=1000HSP→75C1BX51000486B9A28SS→50000堆棧段510015100251003SP=1002HSP→486BBX51000153.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令I(lǐng)N輸入指令I(lǐng)N指令用于從指定的外設(shè)寄存器取信息送入累加器基本作用:從端口讀入一個字節(jié)或者字如果某輸入設(shè)備的端口地址在0~255,則在IN指令中直接給出,其采用長格式:INAL,PORT;字節(jié)INAX,PORT;字執(zhí)行的操作:(AL)(PORT)(字節(jié))(AX)(PORT)(字)163.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令否則,將端口地址先存入寄存器DX中,然后在指令中用DX給出其端口地址,其采用短格式:IN AL,DX ;(字節(jié))IN AX,DX ;(字)執(zhí)行的操作(AL)((DX)) (字節(jié))(AX)((DX+1),(DX)) (字)173.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令例:INAL,60H;從端口60H讀一個字節(jié)到AL中INAX,20H;把端口20H,21H按“高高低低”組成一個字讀入AX中MOVDX,2F8H INAL,DX ;從端口2F8H讀一個字節(jié)到AL中
INAX,DX ;把端口2F8H,2F9H按“高高低低”組成一個字讀入AX中183.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令OUT輸出指令用來將累加器的內(nèi)容送入指定的外部設(shè)備基本作用:把寄存器AL,AX的內(nèi)容輸出的到指定端口如果輸出設(shè)備的端口地址在0~255內(nèi),可以用OUT指令直接給出,采用長格式:OUT PORT,AL ;(字節(jié))OUT PORT,AX ;(字)執(zhí)行的操作:(PORT)(AL)(PORT+1,PORT)(AX)193.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令否則,將該端口地址存入DX寄存器中,然后在OUT指令中用DX給出端口地址,采用短格式:OUT DX,AL ;(字節(jié))OUT DX,AX ;(字)執(zhí)行的操作:((DX))(AL)((DX)+1,(DX))(AX)203.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令例OUT61H,AL ;把AL中的內(nèi)容輸出到端口61H中OUT20H,AX ;把AX中的內(nèi)容輸出到端口20H,21H中MOVDX,3C0HOUTDX,AL ;把AL中的內(nèi)容輸出到3C0H中
OUTDX,AX ;把AX中的內(nèi)容輸出到3C01H、3C1H中213.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令XLAT換碼指令兩個隱含的操作數(shù):BX和AL格式:XLATOPR或XLAT執(zhí)行的操作:(AL)((BX)+(AL))功能:把BX值作為內(nèi)存字節(jié)數(shù)組的首地址、下標為AL的數(shù)組元素的值傳給ALXLATOPR:OPR為表格首地址,僅僅為了增強程序的可讀性,實際首地址以BX為準223.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令例MOV BX,offsettable;(BX)=0040HMOV AL,3XLAT執(zhí)行指令后:(AL)=33HBX:首地址AL:下標32H31H33HDS=F000HDS→數(shù)據(jù)段F0040F0041
(AL)=3table30H
(BX)→F0042F0043233.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令地址傳送指令取有效地址指令LEA功能:將一個內(nèi)存變量的有效地址送給指定的寄存器指令格式:LEA Reg,Mem該指令通常用來對指針或變址寄存器BX、DI或SI置初值之用243.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令取段寄存器指令:功能:將內(nèi)存單元的一個“低字”傳送給指令中指定的16位寄存器,把隨后的一個“高字”傳送給相應(yīng)的段寄存器(DS或者ES)指令格式:LDS/LES Reg/Mem例LEA BX,[BX+SI+0F62H]LDS SI,[10H]LES DI,[BX]253.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令MOVBX,TABLE;(BX)=0040HMOVBX,OFFSETTABLE;(BX)=1000HLEABX,TABLE;(BX)=1000HLDSBX,TABLE;(BX)=0040H;(DS)=3000HLESBX,TABLE;(BX)=0040H;(ES)=3000H40H00H00H30HTABLE3000H:1000H→263.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令標志寄存器傳送指令標志送AH指令:LAHF執(zhí)行的操作:(AH)(FLAGS的低字節(jié))AH送標志寄存器指令:SAHF執(zhí)行的操作:(FLAGS的低字節(jié))(AH)標志進棧指令:PUSHF執(zhí)行的操作:(SP)(SP)-2
(SP)+1,(SP))(FLAGS)標志出棧指令:POPF執(zhí)行操作:(FLAGS)((SP)+1,(SP))(SP)(SP)+2273.380x86的指令系統(tǒng)
3.3.1數(shù)據(jù)傳送指令類型轉(zhuǎn)換指令CBW ALAX執(zhí)行的操作:若(AL)的最高有效位為0則AH=00H若(AL)的最高有效位為1則AH=FFHCWDAX
(DX,AX)執(zhí)行操作:若(AX)的最高有效位為0,則(DX)=0000H若(AX)的最高有效位為1,則(DX)=FFFFH例:(AX)=0BA45HCBW;(AX)=0045HCWD;
(DX)=0FFFFH(AX)=0BA45H283.380x86的指令系統(tǒng)
3.3.2算術(shù)指令算術(shù)指令是反映CPU能力的一組指令,也是編程時常常使用的指令包括:加、減、乘、除及其相關(guān)的輔助指令算術(shù)指令的操作數(shù)可以是8位/16位當(dāng)存儲單元是該指令的操作數(shù)時,該指令的尋址方式可以時任意一種存儲單元尋址方式293.380x86的指令系統(tǒng)
3.3.2算術(shù)指令加法指令A(yù)DD、ADC、INC減法指令:SUB、SBB、DEC、NEG、CMP乘法指令MUL、IMUL除法指令DIV、IDIV十進制調(diào)整指令:DAA、DAS、AAA、AAS、AAM、AAD303.380x86的指令系統(tǒng)
3.3.2算術(shù)指令加法指令加法指令:ADD DST,SRC功能:將目的操作數(shù)與源操作數(shù)相加,結(jié)果存入目的地址,源地址內(nèi)容不變。執(zhí)行的操作:(DST)(DST)+(SRC)帶進位的加法:ADC DST,SRC功能:將目的操作數(shù)與源操作數(shù)相加再加低位進位,結(jié)果送目的地址執(zhí)行的操作:(DST)(DST)+(SRC)+CF313.380x86的指令系統(tǒng)
3.3.2算術(shù)指令加1指令:INC OPR功能:將目的操作數(shù)加1,結(jié)果送目的地址執(zhí)行的操作:(OPR)(OPR)+1注:除INC指令不影響CF標志位外,均對條件標志位有影響323.380x86的指令系統(tǒng)
3.3.2算術(shù)指令標志寄存器FLAGS介紹指令執(zhí)行跟標志有很大關(guān)系標志分為兩類:狀態(tài)標志:用來記錄程序運行結(jié)果的狀態(tài)信息,許多指令的執(zhí)行都將相應(yīng)的設(shè)置它。它們分別是:
CFZFSFPFOFAF控制標志:可由程序根據(jù)需要用指令設(shè)置,用于控制處理器執(zhí)行指令的方式。它們分別是:
DFIFTF1514131211109876543210OF
DF
IF
TF
SF
ZF
AF
PFCF333.380x86的指令系統(tǒng)
3.3.2算術(shù)指令進位標志CF(CarryFlag)當(dāng)運行結(jié)果的最高有效位有進位(加法)或借位(減法)時,進位標志置1,即CF=1;否則CF=0例如:3AH+7CH=B6H,沒有進位:CF=0AAH+7CH=(1)26H,有進位:CF=1343.380x86的指令系統(tǒng)
3.3.2算術(shù)指令零標志ZF(ZeroFlag)若運行結(jié)果為0,則ZF=1,否則ZF=0例如:3AH+7CH=B6H,結(jié)果不是零:ZF=086H+7CH=(1)00H,結(jié)果是零:ZF=1注意:ZF為1表示的結(jié)果是0。353.380x86的指令系統(tǒng)
3.3.2算術(shù)指令符號標志SF(SignFlag)運行結(jié)果最高位為1,則SF=1,否則SF=0例如:3AH+7CH=B6H,最高位D7=1:SF=186H+7CH=(1)00H,最高位D7=0:SF=0注意:有符號數(shù)據(jù)利用最高有效位表示數(shù)據(jù)的符號。所以,最高有效位就是符號標志的狀態(tài)363.380x86的指令系統(tǒng)
3.3.2算術(shù)指令奇偶標志PF(ParityFlag)當(dāng)運行結(jié)果最低字節(jié)的“1”的個數(shù)為零或者偶數(shù)時,PF=1,否則,PF=0例如:3AH+7CH=B6H=10110110B,結(jié)果中有5個1,是奇數(shù):PF=0注意:PF標志僅僅反映最低8位中“1”的個數(shù)是偶或者奇,即使是進行16位字操作。373.380x86的指令系統(tǒng)
3.3.2算術(shù)指令輔助進位標志運算時D3(低半字節(jié))有進位或者借位時,AF=1;否則AF=0例如:3AH+7CH=B6H,D3有進位:AF=1注意:這個標志主要由處理器內(nèi)部使用,用于十進制算術(shù)運算指令中,用戶一般不必關(guān)心383.380x86的指令系統(tǒng)
3.3.2算術(shù)指令溢出標志OF(OverflowFlag)若算術(shù)運算的結(jié)果有溢出則OF=1,否則OF=0加法操作:兩個操作數(shù)的符號相同,而結(jié)果的符號與之相反時OF=1,否則OF=0例:3AH+7CH=B6H,產(chǎn)生溢出:OF=1AAH+7CH=(1)26H,沒有溢出:OF=039舉例:n=8bit帶符號數(shù)(-128~127),無符號數(shù)(0~255)
00000100+0000101100001111帶:(+4)+(+11)=+15OF=0無:4+11=15CF=0帶符號數(shù)和無符號數(shù)都不溢出00001001+0111110010000101
帶:(+9)+(+124)=-133OF=1
無:9+124=133CF=0帶符號數(shù)溢出無符號數(shù)溢出00000111+11111011100000010帶:(+7)+(-5)=+2OF=0無:7+251=258CF=1帶符號數(shù)和無符號數(shù)都溢出10000111+11110101101111100帶:(-121)+(-11)=+134OF=1無:135+245=124CF=1↑↑CF位表示無符號數(shù)相加的溢出。OF位表示帶符號數(shù)相加的溢出。403.380x86的指令系統(tǒng)
3.3.2算術(shù)指令例1:加1指令I(lǐng)NCBX;(BX)+1→BX例2:雙字加法運算,設(shè)目的操作數(shù)存放在DX和AX寄存器中,其中DX放高位字,源操作數(shù)存放在BX和CX寄存器中,其中BX放高位字,指令執(zhí)行前:(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H。
ADD AX,CX ;(AX)=0D389H,CF=1ADC DX,BX ;(DX)=0008H,CF=0413.380x86的指令系統(tǒng)
3.3.2算術(shù)指令減法指令減法指令:SUB DST,SRC功能:目的操作數(shù)減去源操作數(shù),結(jié)果存于目的地址,源地址的內(nèi)容不變執(zhí)行的操作:(DST)(DST)-(SRC)帶借位的減法指令目的操作數(shù)減源操作數(shù)再減地位借位CF,結(jié)果送目的地址執(zhí)行的操作:(DST)(DST)-(SRC)-CF減1指令:DECOPR功能:將目的操作數(shù)減1,結(jié)果送目的地址執(zhí)行的操作:(OPR)(OPR)-1423.380x86的指令系統(tǒng)
3.3.2算術(shù)指令減法對條件標志位的影響:
1:被減數(shù)的最高有效位有向高位的借位CF=0:否則
1:兩個操作數(shù)符號相反,而結(jié)果與減數(shù)相同OF=0:否則CF表示無符號數(shù)減法的溢出OF表示有符號數(shù)減法的溢出433.380x86的指令系統(tǒng)
3.3.2算術(shù)指令求補指令NEGOPR將目的操作數(shù)每一位求反(包括符號位)后加1,結(jié)果送目的地址執(zhí)行操作:(OPR)-(OPR)比較指令CMPOPR1,OPR2功能:目的操作數(shù)減源操作數(shù),結(jié)果只影響標志位,不送入目的地址執(zhí)行操作:(OPR1)-(OPR2)注意:除DEC指令不影響CF標志位外,均對條件標志位有影響443.380x86的指令系統(tǒng)
3.3.2算術(shù)指令【例1】求補運算
MOV DX,6780HNEG DX ;(DX)=9880H【例2】比較AL的內(nèi)容數(shù)值大小。
CMP AL,50;(AL)-50JB Bellow;(AL)<50,轉(zhuǎn)到Bellow處執(zhí)行
SUB AL,50;(AL)>=50,(AL)-50→ALINC AH ;(AH)+1→AHBellow: …
0000H-)6780HCF1→9880H453.380x86的指令系統(tǒng)
3.3.2算術(shù)指令乘法指令無符號數(shù)乘法指令:MULSRC帶符號數(shù)乘法指令:IMULSRC功能:若是字節(jié)數(shù)據(jù)相乘,(AL)與SRC相乘得到的字數(shù)據(jù)存入AX之中若是字數(shù)據(jù)相乘,則(AX)與SRC相乘得到的雙字數(shù)據(jù),高字存入DX,低字存入AX執(zhí)行的操作字節(jié)操作數(shù):(AX)(AL)*SRC字操作:(DX,AX)(AX)*SRC注意:IMUL指令除計算對象是帶符號的二進制數(shù)外,其他都與MUL一樣,但是計算結(jié)果可能不同463.380x86的指令系統(tǒng)
3.3.2算術(shù)指令乘法指令對OF和CF的影響:MUL指令:若乘積的高一半(AH或DX)為0,則OF=CF=0;否則OF=CF=1。(用來檢查字節(jié)相乘的結(jié)果是字節(jié)還是字,字相乘的結(jié)果是字還是雙字)IMUL指令:若乘積的高一半是低一半的符號擴展,則OF=CF=0,否則均為1乘法對其他標志位沒有定義指令執(zhí)行后這些標志位是任意的、不可預(yù)測的(就是誰也不知道是0還是1)對標志位沒有影響則是指指令的執(zhí)行不改變標志位的狀態(tài)473.380x86的指令系統(tǒng)
3.3.2算術(shù)指令例:無符號乘法:MOVAL,0B4H;AL=B4H=180MOVBL,11H;BL=11H=17MULBL;AX=OBF4H=3060,;OF=CF=1;
AX高8位不為0有符號乘法:MOVAL,0B4H;AL=B4H=-76MOVBL,11H;BL=11H=17IMULBL;AX=FAF4H=-1292,;OF=CF=1;AX高8位含有效數(shù)字483.380x86的指令系統(tǒng)
3.3.2算術(shù)指令除法指令無符號數(shù)除法指令:DIVSRC帶符號數(shù)除法指令:IDIVSRC執(zhí)行的操作:字節(jié)操作
(AL)(AX)/(SRC)的商
(AH)(AX)/(SRC)的余數(shù)字操作
(AX)(DX,AX)/(SRC)的商
(DX)(DX,AX)/(SRC)的余數(shù)注意:除法指令DIV和IDIV雖然對標志位的影響沒有定義,但可產(chǎn)生溢出493.380x86的指令系統(tǒng)
3.3.2算術(shù)指令例:無符號除法:MOVAX,0400H;AX=400H=1024MOVBL,0B4H;BL=B4H=180DIVBL;商AL=05H=5;余數(shù)AH=7CH=124有符號除法:MOVAX,0400H;AX=400H=1024MOVBL,0B4H;BL=B4H=-76IDIVBL;商AL=F3H=-13;余數(shù)AH=24H=36注:帶符號除法的余數(shù)符號和被除數(shù)符號相同。503.380x86的指令系統(tǒng)
3.3.2算術(shù)指令當(dāng)被除數(shù)遠大于除數(shù)時,所得的商就有可能超出它所能表達的范圍。如果存放商的寄存器AL/AX不能表達,便產(chǎn)生溢出,8086CPU中就產(chǎn)生編號為0的內(nèi)部中斷——除法錯中斷。說明:對DIV指令,除數(shù)為0,或者在字節(jié)除時商超過8位,或者在字除時商超過16位,則發(fā)生除法溢出。對IDIV指令,除數(shù)為0,或者在字節(jié)除時商不在-128~127范圍內(nèi),或者在字除時商不在-32768~32767范圍內(nèi),則發(fā)生除法溢出。513.380x86的指令系統(tǒng)
3.3.2算術(shù)指令十進制調(diào)整指令BCD碼(8421碼):用二進制編碼的十進制數(shù),又稱二-十進制數(shù)壓縮BCD碼:用4位二進制數(shù)表示1位十進制數(shù)
例:(59)10=(01011001)BCD非壓縮BCD碼:用8位二進制數(shù)表示1位十進制數(shù)
例:(59)10=(0000010100001001)BCD523.380x86的指令系統(tǒng)
3.3.2算術(shù)指令問題的提出:19000110012700100001+110=00100111+08+00001000(00100111)BCDAF=112000100103500110101+23+00100011(00110101)BCD533.380x86的指令系統(tǒng)
3.3.2算術(shù)指令十進制調(diào)整指令壓縮的BCD碼調(diào)整指令
DAA加法的十進制調(diào)整指令
DAS減法的十進制調(diào)整指令非壓縮的BCD碼調(diào)整指令
AAA加法的ASCII碼調(diào)整指令
AAS減法的ASCII碼調(diào)整指令
AAM乘法的ASCII碼調(diào)整指令
AAD除法的ASCII碼調(diào)整指令543.380x86的指令系統(tǒng)
3.3.2算術(shù)指令加法的十進制調(diào)整指令語句格式:DAA如果AL寄存器中低4位大于9或者輔助進位AF=1,則AL=AL+6且AF=1如果AL>0A0H或CF=1,則AL=AL+60H且CF=1。同時SF、ZF、PF均有影響【例】壓縮BCD碼的加法運算。MOVAL,68H;(AL)=68H,表示壓縮BCD碼68MOVBL,28H;(BL)=28H,表示壓縮BCD碼28ADDAL,BL;二進制加法:(AL)=68H+28H=90HDAA ;十進制調(diào)整:(AL)=96H
;實現(xiàn)壓縮BCD碼加法:68+28=96
注:使用DAA或DAS指令前,應(yīng)先執(zhí)行以AL為目的操作數(shù)的加法或減法指令。553.380x86的指令系統(tǒng)
3.3.2算術(shù)指令減法的十進制調(diào)整指令語句格式:DAS具體實現(xiàn):如果AF=1或者AL寄存器中低四位大于9,則AL=AL-6且AF=1如果AL>=0A0H或CF=1,則AL=AL-60H且CF=1。同時SF、ZF、PF均受影響。【例】壓縮BCD碼的減法運算。MOVAL,60H;(AL)=60H,表示壓縮BCD碼60MOVBL,28H;(BL)=28H,表示壓縮BCD碼28SUBAL,BL;二進制減法:(AL)=60H-28H=38HDAS;十進制調(diào)整:(AL)=32H
;實現(xiàn)壓縮BCD碼減法:60-28=32011000000010100000111000563.380x86的指令系統(tǒng)
3.3.3邏輯指令邏輯指令包括邏輯運算指令和移位操作指令兩大類邏輯運算指令包括:邏輯與(AND)、邏輯或(OR)、邏輯非(NOT)和異或(XOR)移位操作指令包括:算術(shù)移位、邏輯移位、雙精度移位、循環(huán)移位和帶進位的循環(huán)移位573.380x86的指令系統(tǒng)
3.3.3邏輯指令邏輯運算指令邏輯與指令:ANDDST,SRC功能:將源操作數(shù)的每位二進位與目的操作數(shù)中相應(yīng)二進制位進行邏輯“與”操作,操作結(jié)果存入目的操作數(shù)中執(zhí)行操作:(DST)(DST)^(SRC)用途:該指令用于清除目的操作數(shù)中與源操作數(shù)中置0位對應(yīng)的位例:已知(BH)=67H,要求把其第0、1、5位置0
解:構(gòu)造一個立即數(shù),其第0、1、5位為0,其余位為1,該立即數(shù)為0DCH或11011100B然后用指令“ANDBH,0DCH”來實現(xiàn)此功能583.380x86的指令系統(tǒng)
3.3.3邏輯指令邏輯或指令:ORDST,SRC功能:把源操作的每個二進制位與目的操作數(shù)的對應(yīng)二進制位進行“或”操作,結(jié)果存入目的操作數(shù)中執(zhí)行的操作:(DST)(DST)V(SRC)用途:用于設(shè)置目的操作數(shù)中與源操作數(shù)置1位的對應(yīng)位【例】已知(BL)=46H,要求把其的第1、3、4和6位置為1。解:構(gòu)造一個立即數(shù),使其第1、3、4和6位的值為1,其它位的值為0,該立即數(shù)即為:5AH或01011010B,然后用指令“
ORBL,5AH
"來實現(xiàn)此功能593.380x86的指令系統(tǒng)
3.3.3邏輯指令邏輯非指令:NOTOPR功能:將目的操作數(shù)逐位取反后存入目的操作數(shù)執(zhí)行操作:(OPR)
(OPR)【例】邏輯非運算。
MOV AX,878AH ;(AX)=878AHNOT AX,;(AX)=7875H
603.380x86的指令系統(tǒng)
3.3.3邏輯指令異或指令XORDST,SRC功能:把源操作數(shù)中每位二進制位跟目的操作數(shù)相應(yīng)的二進制位進行“異或”操作,結(jié)果存入目的操作數(shù)中執(zhí)行的操作:(DST)(DST)(SRC)【例】已知(AH)=46H,要求把其的第0、2、5和7位的二進制值變反。解:構(gòu)造一個立即數(shù),使其第0、2、5和7位的值為1,其它位的值為0,該立即數(shù)即為:0A5H或10100101B,然后再用指令
“XOR
AH,0A5H”來實現(xiàn)此功能。613.380x86的指令系統(tǒng)
3.3.3邏輯指令測試指令TESTOPR1,OPR2把兩個操作數(shù)進行邏輯“與”操作,并根據(jù)運算結(jié)果設(shè)置相應(yīng)的標志位,但并不保存運算結(jié)果。因此不會改變指令中的操作數(shù)執(zhí)行的操作:(OPR1)^(OPR2)【例】測試AX中的第12位是否為0,不為0則轉(zhuǎn)L。
TESTAX,1000HJNEL
…L:…
…623.380x86的指令系統(tǒng)
3.3.3邏輯指令移位指令移位指令包括:算術(shù)移位指令、邏輯移位指令和循環(huán)移位指令,分別進行左移和右移操作統(tǒng)一的格式:[標號:]操作符OPR1[標號:]操作符OPRCL功能:將目的操作的所有位按照操作符規(guī)定的方式移動1位或者按寄存器CL規(guī)定的次數(shù)(0~255)移動,結(jié)果送入目的地址。目的操作數(shù)是8位(或16位)的寄存器數(shù)據(jù)或存儲器數(shù)據(jù)。633.380x86的指令系統(tǒng)
3.3.3邏輯指令算術(shù)移位指令有:算術(shù)左移SAL和算術(shù)右移SAR,指令格式為SAL/SAROPR,CL/Imm受影響的標志位:CF、OF、PF、ZF和SF(AF無定義)功能:算術(shù)左移SAL把目的操作數(shù)的低位向高位移,空出的低位補0算術(shù)右移SAR把目的操作數(shù)的高位向低位移,空出的高位用最高位(符號位)填補算術(shù)移位指令常用于帶符號數(shù)*2或/2CFOPR0CFOPR算術(shù)左移算術(shù)左移643.380x86的指令系統(tǒng)
3.3.3邏輯指令邏輯左移SHL和邏輯右移SHR它們的指令格式如下:SHL/SHR
OPR,CL/Imm受影響的標志位:CF、OF、PF、SF和ZF(AF無定義)。邏輯左移/右移指令只有它們的移位方向不同,移位后空出的位都補0邏輯移位指令常用于無符號數(shù)*2或/2CFOPR0CFOPR0邏輯左移邏輯右移653.380x86的指令系統(tǒng)
3.3.3邏輯指令循環(huán)移位指令有:循環(huán)左移ROL和循環(huán)右移ROR指令的格式:ROL/ROR
OPR,CL/Imm受影響的標志位:CF和OF循環(huán)左移/右移指令只是移位方向不同,它們移出的位不僅要進入CF,而且還要填補空出的位。CFOPRCFOPR循環(huán)左移循環(huán)右移663.380x86的指令系統(tǒng)
3.3.3邏輯指令帶進位的循環(huán)移位指令有:帶進位的循環(huán)左移RCL和帶進位的循環(huán)右移RCR指令的格式:RCL/RCR
OPR,CL/Imm受影響的標志位:CF和OF帶進位的循環(huán)左移/右移指令只有移位的方向不同,它們都用原CF的值填補空出的位,移出的位再進入CFCFOPRCFOPR帶進位循環(huán)左移帶進位循環(huán)右移673.380x86的指令系統(tǒng)
3.3.3邏輯指令例:移位指令可實現(xiàn)乘法功能
MOVSI,AXSHLSI,1 ;SI←2×AXADDSI,AX;SI←3×AXMOVDX,BXMOVCL,03HSHLDX,CL ;DX←8×BXSUBDX,BX;DX←7×BXADDDX,SI ;DX←7×BX+3×AX注:(1)邏輯左移一位相當(dāng)于無符號數(shù)乘以2,(2)邏輯右移一位相當(dāng)于無符號數(shù)除以2。681100000162/-94CF1算術(shù)右移:011000011-47邏輯左移:111000000CF=1(324>255)邏輯右移:01100000181循環(huán)左移:110000011循環(huán)右移:011000001110000010帶進位循環(huán)左移:110000001設(shè)移位之前CF=0111000000帶進位循環(huán)右移:11000001設(shè)移位之前CF=00100000011691100000162/-94CF1算術(shù)左移:111000000CF=1,OF=1;(-188<-128)算術(shù)右移:011000011-47邏輯左移:111000000CF=1(324>255)邏輯右移:01100000181循環(huán)左移:110000011循環(huán)右移:011000001110000010帶進位循環(huán)左移:110000001設(shè)移位之前CF=0111000000帶進位循環(huán)右移:11000001設(shè)移位之前CF=00100000011703.380x86的指令系統(tǒng)
3.3.4串處理指令操作指令的實質(zhì)是對一片連續(xù)存儲單元進行處理,這片存儲單元是由隱含指針DS:SI或ES:DI來指定的。字符串操作指令可對內(nèi)存單元按字節(jié)或字進行處理,并能根據(jù)操作對象的字節(jié)數(shù)使變址寄存器SI(和DI)增減1或2。具體規(guī)定如下:當(dāng)DF=0時,變址寄存器SI(和DI)增加1或2;當(dāng)DF=1時,變址寄存器SI(和DI)減少1或2。在后面各指令中,有關(guān)變址寄存器都按上述規(guī)定進行增減,不再一一說明。713.380x86的指令系統(tǒng)
3.3.4串處理指令與REP配合工作的MOVS/STOS/LODS的指令重復(fù)前綴指令REP重復(fù)前綴指令是重復(fù)其后的字符串操作指令,重復(fù)的次數(shù)由CX來決定。一般格式為:
REP
MOVS/STOS/LODS
重復(fù)前綴指令的執(zhí)行步驟如下:判斷:CX=0;如果CX=0,則結(jié)束重復(fù)操作,執(zhí)行程序中的下一條指令否則,CX=CX-1(不影響有關(guān)標志位),并執(zhí)行其后的字符串操作指令,在該指令執(zhí)行完后,再轉(zhuǎn)到步驟1。723.380x86的指令系統(tǒng)
3.3.4串處理指令字符串傳送指令功能:將以SI為指針的源串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)傳送至以DI為指針的目的地址中去,并自動修改指針,使之指向下一個字節(jié)(或字)存儲單元(DS:[SI])ES:[DI]當(dāng)DF=0時,(SI)和(DI)增量
當(dāng)DF=1時,(SI)和(DI)減量指令的格式:
MOVSDST,SRC(需在操作數(shù)中表明數(shù)據(jù)格式)
MOVSB(字節(jié))
MOVSW(字)注字節(jié)操作:(SI)←(SI)±1,(DI)←(DI)±1字操作:(SI)←(SI)±2,(DI)←(DI)±2
733.380x86的指令系統(tǒng)
3.3.4串處理指令REPMOVS:將數(shù)據(jù)段中的整串?dāng)?shù)據(jù)傳送到附加段中。源串(數(shù)據(jù)段)→目的串(附加段)執(zhí)行REPMOVS之前,應(yīng)先做好:源串首地址(末地址)→SI目的串首地址(末地址)→DI串長度→CX建立方向標志
CLD使DF=0,STD使DF=1)~~~~DS→DS:SI→ES→ES:DI→743.380x86的指令系統(tǒng)
3.3.4串處理指令【例】MOVSI,0050HMOVDI,0100HMOVCX,5CLDREPMOVSB‘B’‘A’‘C’‘D’~~~~DS→2000H:0050H→ES→3000H:0100H→‘E’20000H30000H753.380x86的指令系統(tǒng)
3.3.4串處理指令置字符串?dāng)?shù)據(jù)指令功能:將AL或AX中的內(nèi)容送入到ES:DI所指的目的串的字節(jié)(或字)存儲單元中即:字節(jié)操作:(AL)→[DI],字操作:(AX)→[DI]。修改指針DI,使之指向串中的下一個元素。當(dāng)DF=0時,(DI)增量)。當(dāng)DF=1時,(DI)減量。指令的格式:STOS
DSTSTOSB(字節(jié))STOSW(字)ES→ES:DI→AL或AX763.380x86的指令系統(tǒng)
3.3.4串處理指令【例】MOVDI,0050HMOVAL,‘$’MOVCX,5CLDREPSTOSB00000000ES→1000H:0050H→‘$’10000HAL0000‘$’‘$’‘$’‘$’ES→1000H:0050H→‘$’10000HAL‘$’00773.380x86的指令系統(tǒng)
3.3.4串處理指令取字符串?dāng)?shù)據(jù)指令功能:將SI所指的源串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)取出來送入AL(或AX)中即:字節(jié)操作:([SI])→AL,字操作:([SI])→AX。修改指針SI,使它指向串中的下一個元素。當(dāng)DF=0時,(SI)增量。當(dāng)DF=1時,(SI)減量。指令的格式:
LODS
SRC(需在操作數(shù)中表明數(shù)據(jù)格式)
LODSB(字節(jié))
LODSW(字)DS→DS:SI→AL或AX783.380x86的指令系統(tǒng)
3.3.4串處理指令串輸入指令功能:將由DX寄存器指定的I/O端口中的字、字節(jié)傳送到附加段中的目的串中,并根據(jù)DF和數(shù)據(jù)類型來改變目的變址寄存器的方向內(nèi)容指令格式:INSB ;字節(jié)串輸入:ES:[DI]←((DX)),;DI←DI±1INSW
;字串串輸入:ES:[DI]←((DX)),;DI←DI±2793.380x86的指令系統(tǒng)
3.3.4串處理指令串輸出指令OUTS功能:將由源串中的字、字節(jié)傳送到在DX寄存器指定的I/O端口中,并根據(jù)DF和數(shù)據(jù)類型來改變源變址寄存器的方向內(nèi)容。指令格式:
OUTSB;字節(jié)串輸出:((DX))←DS:[SI]
;SI←SI±1OUTSW;字串串輸出:((DX))←DS:[SI]
;SI←SI±2803.380x86的指令系統(tǒng)
3.3.4串處理指令與REPZ(REPNZ)配合工作的CMPS和SCAS指令相等重復(fù)前綴指令REPE/REPZ一般格式為
REPE/REPZCMPS/SCAS執(zhí)行步驟:判斷條件:CX≠0且ZF=1;如果條件不成立,則結(jié)束重復(fù)操作,執(zhí)行程序中的下一條指令;否則,CX=CX-1(不影響有關(guān)標志位),并執(zhí)行其后的字符串操作指令,在該指令執(zhí)行完后,再轉(zhuǎn)到步驟(1)。813.380x86的指令系統(tǒng)
3.3.4串處理指令不等重復(fù)前綴指令REPNE/REPNZ
一般格式為:
REPNE/REPNZ
CMPS/SCAS執(zhí)行步驟如下:判斷條件:CX≠0且ZF=0;如果條件不成立,則結(jié)束重復(fù)操作,執(zhí)行程序中的下一條指令;否則,CX=CX-1(不影響有關(guān)標志位),并執(zhí)行其后的字符串操作指令,在該指令執(zhí)行完后,再轉(zhuǎn)到步驟(1)。823.380x86的指令系統(tǒng)
3.3.4串處理指令串比較指令CMPS語句格式:①CMPSB——字節(jié)串比較②CMPSW——字串比較功能:將SI所指的源串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)與DI所指的目的串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)相減,并根據(jù)相減的結(jié)果設(shè)置標志,但結(jié)果并不保存。即:①([SI])-([DI])。②修改串指針,使之指向串中的下一個元素。當(dāng)DF=0時,(SI)和(DI)增量。當(dāng)DF=1時,(SI)和(DI)減量。~~~~DS→DS:SI→ES→ES:DI→減法833.380x86的指令系統(tǒng)
3.3.4串處理指令【例】比較兩個字符串,找出它們不相匹的位置。
MOVSI,1500HMOVDI,0200HMOVCX,17CLDREPECMPSB‘E’‘P’‘R’‘S’~~~~‘P’DS→2000H:1500H→ES→‘E’‘O’3000H:0200H→‘S’……20000H30000H843.380x86的指令系統(tǒng)
3.3.4串處理指令串搜索指令SCAS語句格式:①SCASB——字節(jié)串搜索②SCASW——字串搜索功能:AL(字節(jié))或AX(字)中的內(nèi)容與DI所指的目的串中的一個字節(jié)(或字)存儲單元中的數(shù)據(jù)相減,根據(jù)相減結(jié)果設(shè)置標志位,結(jié)果不保存即:①字節(jié)操作:(AL)-([DI]),字操作:(AX)-([DI])。②修改指針使之指向串中的下一個元素。當(dāng)DF=0時,(DI)增量。當(dāng)DF=1時,(DI)減量。ES→ES:DI→AL或AX853.380x86的指令系統(tǒng)
3.3.4串處理指令【例】從一個字符串中找出一個指定字符。
MOVDI,0100HMOVAL,‘R’MOVCX,10HCLDREPNZSCASB‘E’‘P’‘R’‘S’ES→3000H:0100H→‘R’30000HAL‘T’…863.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令控制轉(zhuǎn)移指令轉(zhuǎn)移指令是匯編語言程序員經(jīng)常要使用到的一組指令。在高級語言中時常有“盡量不要使用轉(zhuǎn)移指令”的勸告,但是,在匯編語言中,如果不使用轉(zhuǎn)移指令,那么程序要么無法編寫,要么沒有什么功能。所以,在匯編語言中,不但要使用轉(zhuǎn)移指令,還要靈活運用。轉(zhuǎn)移指令分為無條件轉(zhuǎn)移指令和有條件轉(zhuǎn)移指令兩大類:無條件轉(zhuǎn)移指令包括:JMP、子程序調(diào)用和返回、中斷的調(diào)用和返回指令條件轉(zhuǎn)移指令又分為3類:基于無符號數(shù)的條件轉(zhuǎn)移指令、基于有符號數(shù)的條件轉(zhuǎn)移指令和基于特殊算術(shù)標志位的條件轉(zhuǎn)移指令873.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令無條件轉(zhuǎn)移指令段內(nèi)直接短轉(zhuǎn)移:JMPSHORTOPR執(zhí)行的操作:(IP)(IP)+8位的位移量段內(nèi)直接近轉(zhuǎn)移:JMPNEARPTROPR執(zhí)行的操作:(IP)(IP)+16位位移量段內(nèi)間接轉(zhuǎn)移:JMPWORDPTROPR執(zhí)行的操作:(IP)(EA)段間直接遠轉(zhuǎn)移:JMPFARPTROPR執(zhí)行的操作:(IP)OPR的段內(nèi)偏移地址
(CS)OPR所在段的段地址段間間接轉(zhuǎn)移執(zhí)行的操作:(IP)(EA)
(CS)(EA+2)883.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令段內(nèi)直接短轉(zhuǎn)移:JMPSHORTOPR執(zhí)行操作:(IP)←(IP)+8位位移量段內(nèi)直接近轉(zhuǎn)移:JMPNEARPTROPR執(zhí)行操作:(IP)←(IP)+16位位移量位移量是緊接著JMP指令后的那條指令的偏移地址,到目標指令的偏移地址的地址位移。當(dāng)向地址增大方向轉(zhuǎn)移時,位移量為正;向地址減小方向轉(zhuǎn)移時,位移量為負。例如:
……
JMPAGAIN;轉(zhuǎn)移到AGAIN處繼續(xù)執(zhí)行
……AGAIN: DECCX;標號AGAIN的指令
……893.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令段內(nèi)間接轉(zhuǎn)移:JMPWORDPTROPR執(zhí)行操作:(IP)←(EA)將一個寄存器或主存字單元內(nèi)容送入IP寄存器,作為新的指令指針,但不修改CS寄存器的內(nèi)容。JMPAX;IP←AXJMPWORDPTR[2000H] ;IP←[2000H]903.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令段間直接遠轉(zhuǎn)移:JMPFARPTROPR執(zhí)行的操作:(IP)OPR的段內(nèi)偏移地址
(CS)OPR所在段的段地址將標號所在段的段地址作為新的CS值,將標號在該段內(nèi)的偏移地址作為新的IP值;這樣程序跳到新的代碼段執(zhí)行段間間接轉(zhuǎn)移:JMPDWORDPRTOPR執(zhí)行的操作:(IP)(EA)
(CS)(EA+2)用一個存儲單元表示要跳轉(zhuǎn)的目標地址。這個目標地址存放在主存中連續(xù)的字單元中的,低位字送IP寄存器,高位字送CS寄存器91CODESEGMENT……JMPSHORT
NEXT……NEXT:MOVAX,BX……CODEENDS
段內(nèi)短轉(zhuǎn)移CODESEGMENT……JMPNEARPTR
PROGA……PROGA:MOVAX,BX……CODEENDS
段內(nèi)近轉(zhuǎn)移CODE1SEGMENT……JMPFARPTR
NEXT……CODE1ENDS……CODE2SEGMENT……
NEXT:MOVAL,3……CODE2ENDS
段間遠轉(zhuǎn)移923.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令條件轉(zhuǎn)移指令條件轉(zhuǎn)移指令是一組及其重要的指令,它根據(jù)標志寄存器中一個(或者多個)標志位來確定是否需要轉(zhuǎn)移,這就為實現(xiàn)多功能程序提供了必要的手段。微機的指令系統(tǒng)提供了豐富的轉(zhuǎn)移指令來滿足不同需求,在編程時應(yīng)予以靈活應(yīng)用
JXXLABEL;條件滿足:轉(zhuǎn)移,(IP)(IP)+位移量
;條件不滿足,順序執(zhí)行指定的條件XX成立,指令裝到標號LABEL所指向的指令取執(zhí)行,條件不成立,程序?qū)㈨樞驁?zhí)行下一條指令操作數(shù)LABEL采用短轉(zhuǎn)移,成為相對尋址方式JXX不影響標志位,但要利用標志位。根據(jù)利用的標志位的不同,分為以下幾類:933.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令根據(jù)單個條件標志的設(shè)置情況轉(zhuǎn)移:指令的助憶符檢測的轉(zhuǎn)移條件功能描述JZ/JEZF=1JumpEqualorJumpZeroJNZ/JNEZF=0JumpNotEqualorJumpNotZeroJSSF=1JumpSign(negative)JNSSF=0JumpNoSign(positive)JOOF=1JumpOverflowJNOOF=0JumpNotOverflowJPPF=1JumpParityorJumpParityEvenJNPPF=0JumpNotParityorJumpParityOddJB/JNAECF=1JumpBeloworJumpNotAboveorEqualJNB/JAECF=0JumpAboveorEqualorJumpNotBelow943.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令無符號數(shù)的條件轉(zhuǎn)移指令的助憶符檢測的轉(zhuǎn)移條件功能描述JB/JNAECF=1JumpBeloworJumpNotAboveorEqualJNB/JAECF=0JumpNotBeloworJumpAboveorEqualJBE/JNACF∨ZF=1JumpBeloworEqualorJumpNotAboveJNBE/JACF^ZF=0JumpNotBeloworEqualor
JumpAbove953.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令有符號數(shù)的條件轉(zhuǎn)移指令的助憶符檢測的轉(zhuǎn)移條件功能描述JL/JNGESF
OF=1JumpLessorJumpNotGreaterorEqualJNL/JGESF
OF=0JumpGreaterorEqualorJumpNotLessJLE/JNGZF=1orSF≠OFJumpLessorEqualorJumpNotGreaterJG/JNLEZF=0andSF=OFJumpGreaterorJumpNotLessorEqual963.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令測試CX值為0的轉(zhuǎn)移條件轉(zhuǎn)移指令還有一條特殊指令,因為CX經(jīng)常被用作計數(shù)器,JCXZ經(jīng)常被用來判定計數(shù)器是否為0指令格式:
JCXZLABEL;CX=0,發(fā)生轉(zhuǎn)移,(IP)(IP)+位移量
;CX≠0,順序執(zhí)行例:
MOVCX,100AGAIN:JCXZNEXT;判斷傳送次數(shù),為0退出循環(huán)
MOVSB DECCX ;傳送次數(shù)減1 JMPAGAINNEXT:...
973.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令例:如果X>50,轉(zhuǎn)到TOO_HIGH;否則|X-Y|→RESULT,如果溢出轉(zhuǎn)到OVERFLOW。
MOVAX,XCMPAX,50JGTOO_HIGHSUBAX,YJOOVERFLOWJNSNONNEGNEGAXNONNEG:MOVRESULT,AXTOO_HIGH:……OVERFLOW:……983.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令循環(huán)指令循環(huán)指令LOOP指令格式:LOOP短標號執(zhí)行過程:如果CX≠0,轉(zhuǎn)向“標號”所指向的指令,否則,終止循環(huán),執(zhí)行該指令的下一條指令說明:使用LOOP可以代替以下兩條指令:DECCXJNE短標號CX←循環(huán)次數(shù)循環(huán)體CX←CX-1CX=0?YN993.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令相等/為0循環(huán)指令LOOPE/LOOPZ語句格式:LOOPE/LOOPZ短標號執(zhí)行過程:(CX)=(CX)-1(不改變?nèi)魏螛酥疚唬┤绻鸆X≠0且ZF=1,則執(zhí)行循環(huán)體的第一條指令,否則執(zhí)行該循環(huán)語句的下一條指令CX←循環(huán)次數(shù)循環(huán)體CX←CX-1CX<>0且ZF=1?NoYes1003.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令不相等/不為零循環(huán)指令LOOPNE/LOOPNZ語句格式:
LOOPNE/LOOPNZ短標號執(zhí)行過程:(CX)=(CX)-1(不改變?nèi)魏螛酥疚唬┤绻鸆X≠0且ZF=0,則程序轉(zhuǎn)到循環(huán)體的第一條指令,否則,程序?qū)?zhí)行該循環(huán)指令下面的指令。CX←循環(huán)次數(shù)循環(huán)體CX←CX-1CX<>0且ZF=0?NoYes1013.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令例:記錄字符串中的空格數(shù)到RESULT單元
MOVCX,COUNT ;設(shè)置循環(huán)次數(shù)
MOVSI,OFFSETSTRING XORBX,BX ;BX清0,用于記錄空格數(shù)
MOVAL,20H;空格的ASC碼為20HAGAIN:CMPAL,ES:[SI] JNZ NEXT;ZF=0,非空格,轉(zhuǎn)移
INC BX ;ZF=1,是空格,個數(shù)加1NEXT:INCSI LOOPAGAIN ;字符個數(shù)減1,不為0繼續(xù)循環(huán)
MOVRESULT,BX;保存結(jié)果1023.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令子程序子程序是完成特定功能的一段程序。如果某程序段在源程序內(nèi)反復(fù)出現(xiàn),就可把該程序段定義為子程序。這樣可以縮短源程序長度、節(jié)省目標程序的存儲空間,也可提高程序的可維護性和共享性當(dāng)主程序(調(diào)用程序)需要執(zhí)行這個功能時,采用CALL調(diào)用指令轉(zhuǎn)移到該子程序的起始處執(zhí)行;當(dāng)運行完子程序功能后,采用RET返回指令回到主程序繼續(xù)執(zhí)行1033.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令CALLlabel………label:proc…RET主程序子程序…1043.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令子程序調(diào)用指令CALL類似JMP指令,CALL指令分為4中類型:
CALLlabel;段內(nèi)調(diào)用、直接尋址(段內(nèi)直接調(diào)用)
CALLr16/m16;段內(nèi)調(diào)用、間接尋址(段內(nèi)間接調(diào)用)
CALLfarptrlabel;段間調(diào)用、直接尋址(段間直接調(diào)用)
CALLdwordptrmem ;段間調(diào)用、間接尋址(段間間接調(diào)用)但不同于JMP指令,CALL指令需要保存返回地址:段內(nèi)調(diào)用——入棧偏移地址IP:
SP←SP-2,SS:SP←IP
段間調(diào)用——入棧偏移地址IP和段地址CS:
SP←SP-2,SS:SP←IP;
SP←SP-2,SS:SP←CS。1053.380x86的指令系統(tǒng)
3.3.5控制轉(zhuǎn)移指令段內(nèi)直接調(diào)用格式:CALLDST執(zhí)行步驟:將子程序的返回地址壓入堆棧,以便子程序返回使用
即:(SP)(SP)-2;(SP+1,SP)(IP)轉(zhuǎn)移到子程序的入口地址去繼續(xù)
執(zhí)行子程序指令中的DST在匯編
格式指令作用子程序入口地址的
符號地址(標號)。在機器語言
中,它是一個16位的偏移量。
即:(IP)←IP+D16注:段內(nèi)調(diào)用只改變IP,
不改變CS的值。SS→堆棧段SP-1→SP→IP高位字節(jié)IPIP低位字節(jié)SP-2→①②③④1063.380x86
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)六年級口算題卡
- 小學(xué)六年級800道數(shù)學(xué)口算題
- 2025年沈陽貨運從業(yè)資格試題及答案詳解
- 2025年太原貨車從業(yè)資格證答題技巧
- 監(jiān)控錄像管理協(xié)議書(2篇)
- 2024-2025學(xué)年高中地理課時分層作業(yè)13噪聲污染及其防治含解析湘教版選修6
- 2024-2025學(xué)年八年級數(shù)學(xué)上冊第十一章三角形11.2與三角形有關(guān)的角作業(yè)設(shè)計新版新人教版
- 人事行政助理年終工作總結(jié)
- 公司辦公室工作總結(jié)
- 人力資源部年度個人工作計劃
- 某縣城區(qū)地下綜合管廊建設(shè)工程項目可行性實施報告
- 《架空輸電線路導(dǎo)線舞動風(fēng)偏故障告警系統(tǒng)技術(shù)導(dǎo)則》
- 2024年計算機二級WPS考試題庫
- JJF(京) 92-2022 激光標線儀校準規(guī)范
- 普惠金融政策解讀
- 2024年疾控中心支部工作計劃范本
- 廣東省廣州黃埔區(qū)2023-2024學(xué)年八年級上學(xué)期期末數(shù)學(xué)試卷(含答案)
- 法理學(xué)課件馬工程
- 《無菌檢查培訓(xùn)》課件
- 2024-2030年中國香菇行業(yè)銷售狀況及供需前景預(yù)測報告
- 高中英語必背3500單詞表(完整版)
評論
0/150
提交評論