1. 匯編中LOOP的用法全解
loop通常用作循環處理,語法格式:loop標識。
cou執行loop指令需要兩步:
1、(cx)=(cs)-1;
2、cx不為0的時候轉到標號出執行,把IP改為標號的偏移地址,為0的時候執行loop下一條指令;
cx一般放循環次數;
格式框架如下:
movcx,循環次數
標號:循環執行的代碼
loop標號
(1)o字循環命令擴展閱讀
匯編中LOOP的使用
例:
assumecs:code
codesegment
movax,10
movcx,3
A:addax,ax
loopA
movax,4c00h
int21h
codeends
end
addax,ax位置在IP=0006的地址上,執行loopA時看到換成loop0006說明標識「A」編譯成addax,ax的地址,這時候要執行我前面說的loop執行的兩個步驟,
(cx)=(cx)-1=3-1=2cx為2不為0轉到ip=0006執行循環
如果有很多次循環,如1000次,這樣單步運行就很煩,這時候可以用g+偏移地址命令直接運行到你想要的指令處或者運行到loop處用p命令直接運行到循環的下一條指令處
2. 按鍵精靈循環命令是什麼
常用的有:
1.For N(就是次數或者判斷語句)
2.Do(無限循環,也可以加上條件)
3.While true(這個是條件循環)
4.Rem kaishi(跳轉循環)
3. bat 如何循環一段命令 goto或for都行
讓bat腳本循環執行有以下兩種方法:
第一、可以直接加個%0,即執行本身,實現循環。
第二、用goto命令,去到要重復的開頭,如果要限制次數,可以先set 一個值,循環一次減1,條件命令到0退出,實現循環。
(3)o字循環命令擴展閱讀:
goto語句一般格式如下:
goto 語句標號; 其中語句標號是按標識符規定書寫的符號, 放在某一語句行的前面,標號後加冒號(:)。語句標號起標識語句的作用,與goto 語句配合使用。
如: label: i++;
loop: while(x<7);
goto loop;
goto語句的語義是改變程序流向, 轉去執行語句標號所標識的語句。goto語句通常與條件語句配合使用。可用來實現條件轉移, 構成循環,跳出循環體等功能。
4. dos下循環命令怎麼寫
我貼個For的吧,那就是DOS的循環~
------------------------------------------
批處理 教程 轉貼 for詳細
for命令應用
以前常覺得DOS的命令行功能太弱,無法象UNIX一樣可以用命令行完成非常復雜的操作。實際上,當MS從WIN2K開始將命令行增強後,已經借鑒了相當多UNIX的優點,雖然還無法做到象UNIX那麼靈活,但已可完成絕大多數的任務,比如用&&和||連接兩個(或更多)命令,由前一個的返回值來決定下一個是否執行,等等。而在這些增強中,最明顯的,就是FOR命令。
舉個例子,用適當的參數,可用FOR命令將 date /t 的輸出 從 "Sat 07/13/2002" 變成你想要的格式,比如, "2002-07-13":
c:>for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b
2002-07-13
該例將在(3)中詳細說明。
0. 基本應用
簡單說,FOR是個循環,可以用你指定的循環范圍生成一系列命令。最簡單的例子,就是人工指定循環范圍,然後對每個值執行指定的命令。例如,想快速報告每個硬碟分區的剩餘空間:
for %a in (c: d: e: f do @dir %a | find "bytes free"
將輸出:
8 Dir(s) 1,361,334,272 bytes free
15 Dir(s) 8,505,581,568 bytes free
12 Dir(s) 12,975,149,056 bytes free
7 Dir(s) 11,658,854,400 bytes free
用它可以使一些不支持通配符的命令對一系列文件進行操作。在WIN9X中,TYPE命令(顯示文件內容)是不支持*.txt這種格式的(WIN2K開始TYPE已支持通配)。遇到類似情況就可以用FOR:
for %a in (*.txt) do type %a
這些還不是FOR最強大的功能。我認為它最強大的功能,表現在以下這些高級應用:
1. 可以用 /r 參數遍歷整個目錄樹
2. 可以用 /f 參數將文本文件內容作為循環范圍
3. 可以用 /f 參數將某一命令執行結果作為循環范圍
4. 可以用 %~ 操作符將文件名分離成文件名、擴展名、盤符等獨立部分
現分別舉例說明如下:
1. 用 /r 遍歷目錄樹
當用 *.* 或 *.txt 等文件名通配符作為 for /r 的循環范圍時,可以對當前目錄下所有文件(包括子目錄裡面的文件)進行操作。舉個例子,你想在當前目錄的所有txt文件(包括子目錄)內容中查找"bluebear"字樣,但由於find本身不能遍歷子目錄,所以我們用for:
for /r . %a in (*.txt) do @find "bluebear" %a
find 前面的 @ 只是讓輸出結果不包括 find 命令本身。這是DOS很早就有的功能。和FOR無關。
當用 . 作為循環范圍時,for 只將子目錄的結構(目錄名)作為循環范圍,而不包括裡面的文件。有點象 TREE 命令,不過側重點不同。TREE 的重點是用很漂亮易讀的格式輸出,而FOR的輸出適合一些自動任務,例如,我們都知道用CVS管理的項目中,每個子目錄下都會有一個CVS目錄,有時在軟體發行時我們想把這些CVS目錄全部去掉:
for /r . %a in (.) do @if exist %aCVS rd /s /q %aCVS
先用 if exist 判斷一下,是因為 for 只是機械的對每個目錄進行列舉,如果有些目錄下面沒有CVS也會被執行到。用 if exist 判斷一下比較安全。
這種刪除命令威力太大,請小心使用。最好是在真正執行以上的刪除命令前,將 rd /s /q 換成 @echo 先列出要刪出的目錄,確認無誤後再換回rd /s /q:
for /r . %a in (.) do @if exist %aCVS @echo %aCVS
可能目錄中會多出一層 ".",比如 c:projrelease.CVS ,但不會影響命令的執行效果。
2. 將某一文件內容或命令執行結果作為循環范圍:
假如你有一個文件 todel.txt,裡面是所有要刪除的文件列表,現在你想將裡面列出的每個文件都刪掉。假設這個文件是每個文件名佔一行,象這樣:
c:tempa1.txt
c:tempa2.txt
c:tempsubdirb3.txt
c:tempsubdirb4.txt
那麼可以用FOR來完成:
for /f %a in (todel.txt) do del %a
這個命令還可以更強大。比如你的 todel.txt 並不是象上面例子那麼干凈,而是由DIR直接生成,有一些沒用的信息,比如這樣:
Volume in drive D is DATA
Volume Serial Number is C47C-9908
Directory of D:tmp
09/26/2001 12:50 PM 18,426 alg0925.txt
12/02/2001 04:29 AM 795 bsample.txt
04/11/2002 04:18 AM 2,043 invitation.txt
4 File(s) 25,651 bytes
0 Dir(s) 4,060,700,672 bytes free
for 仍然可以解出其中的文件名並進行操作:
for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a DEL %a
當然,上面這個命令是在進行刪除,如果你只是想看看哪些文件將被操作,把DEL換成echo:
for /f "skip=5 tokens=5" %a in (todel.txt) do @if exist %a echo %a
你將看到:
alg0925.txt
bsample.txt
invitation.txt
skip=5 表示跳過前5行(就是DIR輸出的頭部信息),tokens=5表示將每行的第5列作為循環值放入%a,正好是文件名。在這里我加了一個文件存在判斷,是因為最後一行的"free"剛好也是第5列,目前還想不出好的辦法來濾掉最後兩行,所以檢查一下可保萬無一失。
3. 可以用 /f 參數將某一命令執行結果作為循環范圍
非常有用的功能。比如,我們想知道目前的環境變數有哪些名字(我們只要名字,不要值)。可是SET命令的輸出是「名字=值」的格式,現在可以用FOR來只取得名字部分:
FOR /F "delims==" %i IN ('set') DO @echo %i
將看到:
ALLUSERSPROFILE
APPDATA
CLASSPATH
CommonProgramFiles
COMPUTERNAME
ComSpec
dircmd
HOMEDRIVE
......
這里是將set命令執行的結果拿來作為循環范圍。delims==表示用=作為分隔符,由於FOR /F默認是用每行第一個TOKEN,所以可以分離出變數名。如果是想僅列出值:
FOR /F "delims== tokens=2" %i IN ('set') DO @echo %i
tokens=2和前例相同,表示將第二列(由=作為分隔符)作為循環值。
再來個更有用的例子:
我們知道 date /t (/t表示不要詢問用戶輸入)的輸出是象這樣的:
Sat 07/13/2002
現在我想分離出日期部分,也就是13:
for /f "tokens=3 delims=/ " %a in ('date /t') do @echo %a
實際上把 tokens後面換成1,2,3或4,你將分別得到Sat, 07, 13和2002。注意delims=/後面還有個空格,表示/和空格都是分隔符。由於這個空格delims必須是/f選項的最後一項。
再靈活一點,象本文開頭提到的,將日期用2002-07-13的格式輸出:
for /f "tokens=2,3,4 delims=/ " %a in ('date /t') do @echo %c-%a-%b
當tokens後跟多個值時,將分別映射到%a, %b, %c等。實際上跟你指定的變數有關,如果你指定的是 %i, 它們就會用%i, %j, %k等。
靈活應用這一點,幾乎沒有做不了的事。
4. 可以用 %~ 操作符將文件名分離成文件名、擴展名、盤符等獨立部分
這個比較簡單,就是說將循環變數的值自動分離成只要文件名,只要擴展名,或只要盤符等等。
例:要將 c:mp3下所有mp3的歌名列出,如果用一般的 dir /b/s 或 for /r ,將會是這樣:
g:mp3Archived5-18-01-A游鴻明-下沙游鴻明-01 下沙.mp3
g:mp3Archived5-18-01-A游鴻明-下沙游鴻明-02 21個人.mp3
......
g:mp3Archived5-18-01-A王菲-寓言王菲-阿修羅.mp3
g:mp3Archived5-18-01-A王菲-寓言王菲-彼岸花.mp3
g:mp3Archived5-18-01-A王菲-寓言王菲-不愛我的我不愛.mp3
......
如果我只要歌名(不要路徑和".mp3"):
游鴻明-01 下沙
游鴻明-02 21個人
......
王菲-阿修羅
王菲-彼岸花
王菲-不愛我的我不愛
......
那麼可以用FOR命令:
for /r g:mp3 %a in (*.mp3) do @echo %~na
凡是 %~ 開頭的操作符,都是文件名的分離操作。具體請看 for /? 幫助。
本文舉的例子有些可能沒有實際用處,或可用其它辦法完成。僅用於體現FOR可以不藉助其它工具,僅用DOS命令組合,就可完成相當靈活的任務。
from: http://www.myfaq.com.cn/2005September/2005-09-13/199429.html
5. DOS命令的循環執行
可以通過goto或%0實現循環. 1:通過goto循環: 在代碼最開始的一行加入 :start 然後在代碼的最後一行加入 goto start ,就可以實現循環. 2:通過%0循環: 在代碼的最後一行加入 %0 ,就可以實現無限循環. 注:最開始和最後的一行都是獨立的一行.以上兩種方法都可以實現無限循環.
6. 批處理執行循環命令
1、批處理的變數是兩個%,如%%a
2、do後面的命令行最好用英文的括弧括起來,如
for /f "tokens=1 delims=," %%a in (ou.txt) do ( dsadd ou ou=%%a,dc=guan,dc=com)
pause這運行下我這行命令,看有什麼錯誤提示沒?
7. 按鍵精靈怎樣讓一個命令循環
1、首先肯定是要用按鍵精靈打開寫好的按鍵精靈腳本。
8. 8086、8088匯編指令大全
8086/8088指令系統
一、數據傳送指令
1.通用數據傳送指令
MOV(Move)傳送
PUSH(Push onto the stack)進棧
POP(Pop from the stack)出棧
XCHG(Exchange)交換
.MOV 指令
格式為: MOV DST,SRC
執行的操作:(DST)<-(SRC)
.PUSH 進棧指令
格式為:PUSH SRC
執行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(SRC)
.POP 出棧指令
格式為:POP DST
執行的操作:(DST)<-((SP+1),(SP))
(SP)<-(SP)+2
.XCHG 交換指令
格式為:XCHG OPR1,OPR2
執行的操作:(OPR1)<-->(OPR2)
2.累加器專用傳送指令
IN(Input) 輸入
OUT(Output) 輸出
XLAT(Translate) 換碼
這組指令只限於使用累加器AX 或AL 傳送信息.
.IN 輸入指令
長格式為: IN AL,PORT(位元組)
IN AX,PORT(字)
執行的操作: (AL)<-(PORT)(位元組)
(AX)<-(PORT+1,PORT)(字)
短格式為: IN AL,DX(位元組)
IN AX,DX(字)
執行的操作: AL<-((DX))(位元組)
AX<-((DX)+1,DX)(字)
.OUT 輸出指令
長格式為: OUT PORT,AL(位元組)
OUT PORT,AX(字)
執行的操作: (PORT)<-(AL)(位元組)
(PORT+1,PORT)<-(AX)(字)
短格式為: OUT DX,AL(位元組)
OUT DX,AX(字)
執行的操作: ((DX))<-(AL)(位元組)
((DX)+1,(DX))<-AX(字)
在IBM-PC 機里,外部設備最多可有65536個I/O 埠,埠(即外設的埠地址)為
0000~FFFFH.其中前256個埠(0~FFH)可以直接在指令中指定,這就是長格式中的PORT,此
時機器指令用二個位元組表示,第二個位元組就是埠號.所以用長格式時可以在指定中直接指定
埠號,但只限於前256個埠.當埠號>=256時,只能使用短格式,此時,必須先把埠號放到
DX 寄存器中(埠號可以從0000到0FFFFH),然後再用IN 或OUT 指令來傳送信息.
.XLAT 換碼指令
格式為: XLAT OPR
或: XLAT
執行的操作:(AL)<-((BX)+(AL))
3.有效地址送寄存器指令
LEA(Load effective address)有效地址送寄存器
LDS(Load DS with Pointer)指針送寄存器和DS
LES(Load ES with Pointer)指針送寄存器和ES
.LEA 有效地址送寄存器
格式為: LEA REG,SRC
執行的操作:(REG)<-SRC
指令把源操作數的有效地址送到指定的寄存器中.
.LDS 指針送寄存器和DS 指令
格式為: LDS REG,SRC
執行的操作:(REG)<-(SRC)
(DS)<-(SRC+2)
把源操作數指定的4個相繼位元組送到由指令指定的寄存器及DS 寄存器中.該指令常指定
SI 寄存器.
.LES 指針送寄存器和ES 指令
格式為: LES REG,SRC
執行的操作: (REG)<-(SRC)
(ES)<-(SRC+2)
把源操作數指定的4個相繼位元組送到由指令指定的寄存器及ES 寄存器中.該指令常指定
DI 寄存器.
4.標志寄存器傳送指令
LAHF(Load AH with flags)標志送AH
SAHF(store AH into flags)AH 送標志寄存器
PUSHF(push the flags) 標志進棧
POPF(pop the flags) 標志出棧
.LAHF 標志送AH
格式為: LAHF
執行的操作:(AH)<-(PWS 的低位元組)
.SAHF AH 送標志寄存器
格式為: SAHF
執行的操作:(PWS 的低位元組)<-(AH)
.PUSHF 標志進棧
格式為: PUSHF
執行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
.POPF 標志出棧
格式為: POPF
執行的操作:(PWS)<-((SP)+1,(SP))
(SP)<-(SP+2)
二、算術指令
1.加法指令
ADD(add)加法
ADC(add with carry)帶進位加法
INC(increment)加1
.ADD 加法指令
格式: ADD DST,SRC
執行的操作:(DST)<-(SRC)+(DST)
.ADC 帶進位加法指令
格式: ADC DST,SRC
執行的操作:(DST)<-(SRC)+(DST)+CF
.ADD 加1指令
格式: INC OPR
執行的操作:(OPR)<-(OPR)+1
2.減法指令
SUB(subtract)減法
SBB(subtract with borrow)帶借位減法
DEC(Decrement)減1
NEG(Negate)求補
CMP(Compare)比較
.SUB 減法指令
格式: SUB DST,SRC
執行的操作:(DST)<-(DST)-(SRC)
.SBB 帶借位減法指令
格式: SBB DST,SRC
執行的操作:(DST)<-(DST)-(SRC)-CF
.DEC 減1指令
格式: DEC OPR
執行的操作:(OPR)<-(OPR)-1
.NEG 求補指令
格式: NEG OPR
執行的操作:(OPR)<- -(OPR)
.CMP 比較指令
格式: CMP OPR1,OPR2
執行的操作:(OPR1)-(OPR2)
該指令與SUB 指令一樣執行減法操作,但不保存結果,只是根據結果設置條件標志西半
球.
3.乘法指令
MUL(Unsigned Multiple)無符號數乘法
IMUL(Signed Multiple)帶符號數乘法
.MUL 無符號數乘法指令
格式: MUL SRC
執行的操作:
位元組操作數:(AX)<-(AL)*(SRC)
字操作數:(DX,AX)<-(AX)*(SRC)
.IMUL 帶符號數乘法指令
格式: IMUL SRC
執行的操作:與MUL 相同,但必須是帶符號數,而MUL 是無符號數.
4.除法指令
DIV(Unsigned divide)無符號數除法
IDIV(Signed divide)帶符號數除法
CBW(Convert byte to word)位元組轉換為字
CWD(Contert word to double word)字轉換為雙字
.DIV 無符號數除法指令
格式: DIV SRC
執行的操作:
位元組操作:(AL)<-(AX)/(SRC)的商
(AH)<-(AX)/(SRC)的余數
字操作: (AX)<-(DX,AX)/(SRC)的商
(AX)<-(DX,AX)/(SRC)的余數
.IDIV 帶符號數除法指令
格式: DIV SRC
執行的操作:與DIV 相同,但操作數必須是帶符號數,商和余數也均為帶符號數,且余數的符號
與被除數的符號相同.
.CBW 位元組轉換為字指令
格式: CBW
執行的操作:AL 的內容符號擴展到AH.即如果(AL)的最高有效位為0,則(AH)=00;如(AL)的最
高有效位為1,則(AH)=0FFH
.CWD 字轉換為雙字指令
格式: CWD
執行的操作:AX 的內容符號擴展到DX.即如(AX) 的最高有效位為0, 則(DX)=0;否則
(DX)=0FFFFH.
這兩條指令都不影響條件碼.
三、邏輯指令
1.邏輯運算指令
AND(and) 邏輯與
OR(or) 邏輯或
NOT(not) 邏輯非
XOR(exclusive or)異或
TEST(test) 測試
.AND 邏輯與指令
格式: AND DST,SRC
執行的操作:(DST)<-(DST)^(SRC)
.OR 邏輯或指令
格式: OR DST,SRC
執行的操作:(DST)<-(DST)V(SRC)
.NOT 邏輯非指令
格式: NOT OPR
執行的操作:(OPR)<-(OPR)
.XOR 異或指令
格式: XOR DST,SRC
執行的操作:(DST)<-(DST)V(SRC)
.TEST 測試指令
格式: TEST OPR1,OPR2
執行的操作:(DST)^(SRC)
兩個操作數相與的結果不保存,只根據其特徵置條件碼
2.移位指令
SHL(shift logical left) 邏輯左移
SAL(shift arithmetic left) 算術左移
SHR(shift logical right) 邏輯右移
SAR(shift arithmetic right) 算術右移
ROL(Rotate left) 循環左移
ROR(Rotate right) 循環右移
RCL(Rotate left through carry) 帶進位循環左移
RCR(Rotate right through carry) 帶進位循環右移
格式: SHL OPR,CNT(其餘的類似)
其中OPR 可以是除立即數以外的任何定址方式.移位次數由CNT 決定,CNT 可以是1或CL.
循環移位指令可以改變操作數中所有位的位置;移位指令則常常用來做乘以2除以2操作.
其中算術移位指令適用於帶符號數運算,SAL 用來乘2,SAR 用來除以2;而邏輯移位指令則用
來無符號數運算,SHL 用來乘2,SHR 用來除以2.
四、串處理指令
1.與REP 相配合工作的MOVS,STOS 和LODS 指令
.REP 重復串操作直到(CX)=0為上
格式: REP string primitive
其中String Primitive 可為MOVS,LODS 或STOS 指令
執行的操作:
1)如(CX)=0則退出REP,否則往下執行.
2)(CX)<-(CX)-1
3)執行其中的串操作
4)重復1)~3)
.MOVS 串傳送指令
格式:可有三種
MOVS DST,SRC
MOVSB(位元組)
MOVSW(字)
其中第二、三種格式明確地註明是傳送位元組或字,第一種格式則應在操作數中表明是字還是
位元組操作,例如:
MOVS ES:BYTE PTR[DI],DS:[SI]
執行的操作:
1)((DI))<-((SI))
2)位元組操作:
(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1
當方向標志DF=0時用+,當方向標志DF=1時用-
3)字操作:
(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2
當方向標志DF=0時用+,當方向標志DF=1時用-
該指令不影響條件碼.
.CLD(Clear direction flag)該指令使DF=0,在執行串操作指令時可使地址自動增量;
.STD(Set direction flag)該指令使DF=1,在執行串操作指令時可使地址自動減量.
.STOS 存入串指令
格式: STOS DST
STOSB(位元組)
STOSW(字)
執行的操作:
位元組操作:((DI))<-(AL),(DI)<-(DI)+-1
字操作: ((DI))<-(AX),(DI)<-(DI)+-2
該指令把AL 或AX 的內容存入由(DI)指定的附加段的某單元中,並根據DF 的值及數據類型
修改DI 的內容,當它與REP 聯用時,可把AL 或AX 的內容存入一個長度為(CX)的緩沖區中.
.LODS 從串取指令
格式: LODS SRC
LODSB
LODSW
執行的操作:
位元組操作:(AL)<-((SI)),(SI)<-(SI)+-1
字操作: (AX)<-((SI)),(SI)<-(SI)+-2
該指令把由(SI)指定的數據段中某單元的內容送到AL 或AX 中,並根據方向標志及數據類型
修改SI 的內容.指令允許使用段跨越前綴來指定非數據段的存儲區.該指令也不影響條件碼.
一般說來,該指令不和REP 聯用.有時緩沖區中的一串字元需要逐次取出來測試時,可使
用本指令.
2.與REPE/REPZ 和REPNZ/REPNE 聯合工作的CMPS 和SCAS 指令
.REPE/REPZ 當相等/為零時重復串操作
格式: REPE(或REPZ) String Primitive
其中String Primitive 可為CMPS 或SCAS 指令.
執行的操作:
1)如(CX)=0或ZF=0(即某次比較的結果兩個操作數不等)時退出,否則往下執行
2)(CX)<-(CX)-1
3)執行其後的串指令
4)重復1)~3)
.REPNE/REPNZ 當不相等/不為零時重復串操作
格式: REPNE(或REPNZ) String Primitive
其中String Primitive 可為CMPS 或SCAS 指令
執行的操作:
除退出條件(CX=0)或ZF=1外,其他操作與REPE 完全相同.
.CMPS 串比較指令
格式: CMP SRC,DST
CMPSB
CMPSW
執行的操作:
1)((SI))-((DI))
2)位元組操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1
字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2
指令把由(SI)指向的數據段中的一個字(或位元組)與由(DI)指向的附加段中的一個字(或位元組)
相減,但不保存結果,只根據結果設置條件碼,指令的其它特性和MOVS 指令的規定相同.
.SCAS 串掃描指令
格式: SCAS DST
SCASB
SCASW
執行的操作:
位元組操作:(AL)-((DI)),(DI)<-(DI)+-1
字操作: (AL)-((DI)),(DI)<-(DI)+-2
該指令把AL(或AX)的內容與由(DI)指定的在附加段中的一個位元組(或字)進行比較,並不保存
結果,只根據結果置條件碼.指令的其他特性和MOVS 的規定相同.
五、控制轉移指令
1.無條件轉移指令
.JMP(jmp) 跳轉指令
1)段內直接短轉移
格式:JMP SHORT OPR
執行的操作:(IP)<-(IP)+8位位移量
2)段內直接近轉移
格式:JMP NEAR PTR OPR
執行的操作:(IP)<-(IP)+16位位移量
3)段內間接轉移
格式:JMP WORD PTR OPR
執行的操作:(IP)<-(EA)
4)段間直接(遠)轉移
格式:JMP FAR PTR OPR
執行的操作:(IP)<-OPR 的段內偏移地址
(CS)<-OPR 所在段的段地址
5)段間間接轉移
格式:JMP DWORD PTR OPR
執行的操作:(IP)<-(EA)
(CS)<-(EA+2)
2.條件轉移指令
1)根據單個條件標志的設置情況轉移
.JZ(或JE)(Jump if zero,or equal) 結果為零(或相等)則轉移
格式:JE(或JZ) OPR
測試條件:ZF=1
.JNZ(或JNE)(Jump if not zero,or not equal) 結果不為零(或不相等)則轉移
格式:JNZ(或JNE) OPR
測試條件:ZF=0
.JS(Jump if sign) 結果為負則轉移
格式: JS OPR
測試條件:SF=1
.JNS(Jump if not sign) 結果為正則轉移
格式:JNS OPR
測試條件:SF=0
.JO(Jump if overflow) 溢出則轉移
格式: JO OPR
測試條件:OF=1
.JNO(Jump if not overflow) 不溢出則轉移
格式: JNO OPR
測試條件:OF=0
.JP(或JPE)(Jump if parity,or parity even) 奇偶位為1則轉移
格式: JP OPR
測試條件:PF=1
.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位為0則轉移
格式: JNP(或JPO) OPR
測試條件:PF=0
.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低於,或者不高於或等於,或進位
位為1則轉移
格式:JB(或JNAE,JC) OPR
測試條件:CF=1
.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低於,或者高於或者等於,
或進位位為0則轉移
格式:JNB(或JAE,JNC) OPR
測試條件:CF=0
2)比較兩個無符號數,並根據比較的結果轉移
.JB(或JNAE,JC)
格式:同上
.JNB(或JAE,JNC)
格式:同上
.JBE(或JNA)(Jump if below or equal,or not above) 低於或等於,或不高於則轉移
格式:JBE(或JNA) OPR
測試條件:CFVZF=1
.JNBE(或JA)(Jump if not below or equal,or above) 不低於或等於,或者高於則轉移
格式:JNBE(或JA) OPR
測試條件:CFVZF=0
3)比較兩個帶符號數,並根據比較的結果轉移
.JL(或LNGE)(Jump if less,or not greater or equal) 小於,或者不大於或者等於則轉移
格式:JL(或JNGE) OPR
測試條件:SFVOF=1
.JNL(或JGE)(Jump if not less,or greater or equal)不小於,或者大於或者等於則轉移
格式:JNL(或JGE) OPR
測試條件:SFVOF=0
.JLE(或JNG)(Jump if less or equal,or not greater) 小於或等於,或者不大於則轉移
格式:JLE(或JNG) OPR
測試條件:(SFVOF)VZF=1
.JNLE(或JG)(Jump if not less or equal,or greater) 不小於或等於,或者大於則轉移
格式:JNLE(或JG) OPR
測試條件:(SFVOF)VZF=0
4)測試CX 的值為0則轉移指令
.JCXZ(Jump if CX register is zero) CX 寄存器的內容為零則轉移
格式:JCXZ OPR
測試條件:(CX)=0
注:條件轉移全為8位短跳!
3.循環指令
.LOOP 循環指令
格式: LOOP OPR
測試條件:(CX)<>0
.LOOPZ/LOOPE 當為零或相等時循環指令
格式: LOOPZ(或LOOPE) OPR
測試條件:(CX)<>0且ZF=1
.LOOPNZ/LOOPNE 當不為零或不相等時循環指令
格式: LOOPNZ(或LOOPNE) OPR
測試條件:(CX)<>0且ZF=0
這三條指令的步驟是:
1)(CX)<-(CX)-1
2)檢查是否滿足測試條件,如滿足則(IP)<-(IP)+D8的符號擴充.
4.子程序
.CALL 調用指令
.RET 返回指令
5.中斷
.INT 指令
格式: INT TYPE
或INT
執行的操作:(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(TYPE*4)
(CS)<-(TYPE*4+2)
.INTO 若溢出則中斷
執行的操作:若OF=1則:
(SP)<-(SP)-2
((SP)+1,(SP))<-(PSW)
(SP)<-(SP)-2
((SP)+1,(SP))<-(CS)
(SP)<-(SP)-2
((SP)+1,(SP))<-(IP)
(IP)<-(10H)
(CS)<-(12H)
.IRET 從中斷返回指令
格式: IRET
執行的操作:(IP)<-((SP)+1,(SP))
(SP)<-(SP)+2
(CS)<-((SP)+1,(SP))
(SP)<-(SP)+2
(PSW)<-((SP)+1,(SP))
(SP)<-(SP)+2
六、處理機控制指令
1.標志處理指令
.CLC 進位位置0指令(Clear carry)CF<-0
.CMC 進位位求反指令(Complement carry)CF<-CF
.STC 進位位置1指令(Set carry)CF<-1
.CLD 方向標志置0指令(Clear direction)DF<-0
.STD 方向標志置1指令(Set direction)DF<-1
.CLI 中斷標志置0指令(Clear interrupt)IF<-0
.STI 中斷標志置1指令(Set interrupt)IF<-0
2.其他處理機控制指令
NOP(No Opreation) 無操作
HLT(Halt) 停機
WAIT(Wait) 等待
ESC(Escape) 換碼
LOCK(Lock) 封鎖
這些指令可以控制處理機狀態.這們都不影響條件碼.
.NOP 無操作指令
該指令不執行任何操作,其機器碼佔有一個位元組,在調試程序時往往用這條指令佔有一定
的存儲單元,以便在正式運行時用其他指令取代.
.HLT 停機指令
該指令可使機器暫停工作,使處理機處於停機狀態以便等待一次外部中斷到來,中斷結束
後可繼續執行下面的程序.
.WAIT 等待指令
該指令使處理機處於空轉狀態,它也可以用來等待外部中斷的發生,但中斷結束後仍返回
WAIT 指令繼續德行.
.ESC 換碼指令
格式ESC mem
其中mem 指出一個存儲單元,ESC 指令把該存儲單元的內容送到數據匯流排去.當然ESC 指令
不允許使用立即數和寄存器定址方式.這條指令在使用協處理機(Coprocessor)執行某些操作
時,可從存儲器指得指令或操作數.協處理機(如8087)則是為了提高速度而可以選配的硬體.
.LOCK 封鎖指令
該指令是一種前綴,它可與其他指令聯合,用來維持匯流排的鎖存信號直到與其聯合的指令
執行完為止.當CPU 與其他處理機協同工作時,該指令可避免破壞有用信息.
9. 按鍵精靈循環命令
1、首先要打開按鍵精靈已經編輯好,要執行的程序,如下圖。