汇编-5
檢測位指令TEST
檢測位指令是把二個操作數進行邏輯“與”操作,并根據運算結果設置相應的標志位,但并不保存該運算結果,所以,不會改變指令中的操作數。在該指令后,通常用JE、JNE、JZ和JNZ等條件轉移指令。
指令的格式:TEST ?Reg/Mem, Reg/Mem/Imm
受影響的標志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
call XXXXXXXX
test al,al/eax,eax...
je/jne...
**************************************************************************************************
循環指令本身的執行不影響任何標志位。
1、循環指令
循環指令LOOP的一般格式:
LOOP 標號
LOOPW 標號 ;CX作為循環計數器
LOOPD 標號 ;ECX作為循環計數器
....
....
inc eax
dex ebx
cmp eax,ebx
jne/je XXXX ^
?
求1+2+…+1000之和,并把結果存入AX中。
?
方法1:因為計數器CX只能遞減,所以,可把求和式子改變為:1000+999+…+2+1。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
again: ADD AX, CX ;計算過程:1000+999+…+2+1
? ? ? ?DEC CX?
? ? ? ?LOOP again?
…?
方法2:不用循環計數器進行累加,求和式子仍為:1+2+…+999+1000。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
? ? ? ?MOV BX, 1?
again: ADD AX, BX ;計算過程:1+2+…+999+1000?
? ? ? ?INC BX?
? ? ? ?LOOP again?
…?
從程序段的效果來看:方法1要比方法2好。為什么?^_^
**************************************************************************************************
轉移指令
轉移指令是匯編語言程序員經常使用的一組指令。在高級語言中,時常有“盡量不要使用轉移語句”的勸告,但如果在匯編語言的程序中也盡量不用轉移語句,那么該程序要么無法編寫,要么沒有多少功能,所以,在匯編語言中,不但要使用轉移指令,而且還要靈活運用,因為指令系統中有大量的轉移指令。
轉移指令分無條件轉移指令和有條件轉移指令兩大類。
1、無條件轉移指令
無條件轉移指令包括:JMP、子程序的調用和返回指令、中斷的調用和返回指令等。
下面只介紹無條件轉移指令JMP
JMP指令的一般形式:
JMP ?標號/Reg/Mem
2、條件轉移指令
條件轉移指令是一組極其重要的轉移指令,它根據標志寄存器中的一個(或多個)標志位來決定是否需要轉移,這就為實現多功能程序提供了必要的手段。微機的指令系統提供了豐富的條件轉移指令來滿足各種不同的轉移需要,在編程序時,要對它們靈活運用。
條件轉移指令又分三大類:基于無符號數的條件轉移指令、基于有符號數的條件轉移指令和基于特殊算術標志位的條件轉移指令。
、無符號數的條件轉移指令
指令的助憶符
JE/JZ
ZF=1 Jump Equal or Jump Zero?
JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero?
JA/JNBE
CF=0 and ZF=0 Jump Above or Jump Not Below or Equal
?
JAE/JNB
CF=0 Jump Above or Equal or Jump Not Below?
JB/JNAE
CF=1 Jump Below or Jump Not Above or Equal
?
JBE/JNA
CF=1 or AF=1 Jump Below or Equal or Jump Not Above?
、有符號數的條件轉移指令
指令的助憶符
JE/JZ
ZF=1 Jump Equal or Jump Zero?
JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero?
JG/JNLE
ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal?
JGE/JNL
SF=OF Jump Greater or Equal or Jump Not Less?
JL/JNGE
SF≠OF Jump Less or Jump Not Greater or Equal?
JLE/JNG
ZF=1 or SF≠OF Jump Less or Equal or Jump Not Greater?
、特殊算術標志位的條件轉移指令
指令的助憶符
?檢測的轉移條件 功能描述?
JC
CF=1 Jump Carry?
JNC
CF=0 Jump Not Carry
?
JO
OF=1 Jump Overflow
?
JNO
OF=0 Jump Not Overflow
?
JP/JPE
PF=1 Jump Parity or Jump Parity Even
?
JNP/JPO
PF=0 Jump Not Parity or Jump Parity Odd?
JS
SF=1 Jump Sign (negative)
?
JNS
SF=0 Jump No Sign (positive)?
例,已知一個字節變量char,試編寫一程序段,把其所存的大寫字母變成小寫字母。
解:?
next: …?
char DB ?'F' ? ;變量說明?
…?
MOV AL, char?
CMP AL, 'A'?
JB next ? ? ? ?;注意:字符是無符號數,不要使用指令JL?
CMP AL, 'Z'?
JA next?
ADD char, 20
檢測位指令是把二個操作數進行邏輯“與”操作,并根據運算結果設置相應的標志位,但并不保存該運算結果,所以,不會改變指令中的操作數。在該指令后,通常用JE、JNE、JZ和JNZ等條件轉移指令。
指令的格式:TEST ?Reg/Mem, Reg/Mem/Imm
受影響的標志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
call XXXXXXXX
test al,al/eax,eax...
je/jne...
**************************************************************************************************
循環指令本身的執行不影響任何標志位。
1、循環指令
循環指令LOOP的一般格式:
LOOP 標號
LOOPW 標號 ;CX作為循環計數器
LOOPD 標號 ;ECX作為循環計數器
....
....
inc eax
dex ebx
cmp eax,ebx
jne/je XXXX ^
?
求1+2+…+1000之和,并把結果存入AX中。
?
方法1:因為計數器CX只能遞減,所以,可把求和式子改變為:1000+999+…+2+1。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
again: ADD AX, CX ;計算過程:1000+999+…+2+1
? ? ? ?DEC CX?
? ? ? ?LOOP again?
…?
方法2:不用循環計數器進行累加,求和式子仍為:1+2+…+999+1000。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
? ? ? ?MOV BX, 1?
again: ADD AX, BX ;計算過程:1+2+…+999+1000?
? ? ? ?INC BX?
? ? ? ?LOOP again?
…?
從程序段的效果來看:方法1要比方法2好。為什么?^_^
**************************************************************************************************
轉移指令
轉移指令是匯編語言程序員經常使用的一組指令。在高級語言中,時常有“盡量不要使用轉移語句”的勸告,但如果在匯編語言的程序中也盡量不用轉移語句,那么該程序要么無法編寫,要么沒有多少功能,所以,在匯編語言中,不但要使用轉移指令,而且還要靈活運用,因為指令系統中有大量的轉移指令。
轉移指令分無條件轉移指令和有條件轉移指令兩大類。
1、無條件轉移指令
無條件轉移指令包括:JMP、子程序的調用和返回指令、中斷的調用和返回指令等。
下面只介紹無條件轉移指令JMP
JMP指令的一般形式:
JMP ?標號/Reg/Mem
2、條件轉移指令
條件轉移指令是一組極其重要的轉移指令,它根據標志寄存器中的一個(或多個)標志位來決定是否需要轉移,這就為實現多功能程序提供了必要的手段。微機的指令系統提供了豐富的條件轉移指令來滿足各種不同的轉移需要,在編程序時,要對它們靈活運用。
條件轉移指令又分三大類:基于無符號數的條件轉移指令、基于有符號數的條件轉移指令和基于特殊算術標志位的條件轉移指令。
、無符號數的條件轉移指令
指令的助憶符
JE/JZ
ZF=1 Jump Equal or Jump Zero?
JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero?
JA/JNBE
CF=0 and ZF=0 Jump Above or Jump Not Below or Equal
?
JAE/JNB
CF=0 Jump Above or Equal or Jump Not Below?
JB/JNAE
CF=1 Jump Below or Jump Not Above or Equal
?
JBE/JNA
CF=1 or AF=1 Jump Below or Equal or Jump Not Above?
、有符號數的條件轉移指令
指令的助憶符
JE/JZ
ZF=1 Jump Equal or Jump Zero?
JNE/JNZ
ZF=0 Jump Not Equal or Jump Not Zero?
JG/JNLE
ZF=0 and SF=OF Jump Greater or Jump Not Less or Equal?
JGE/JNL
SF=OF Jump Greater or Equal or Jump Not Less?
JL/JNGE
SF≠OF Jump Less or Jump Not Greater or Equal?
JLE/JNG
ZF=1 or SF≠OF Jump Less or Equal or Jump Not Greater?
、特殊算術標志位的條件轉移指令
指令的助憶符
?檢測的轉移條件 功能描述?
JC
CF=1 Jump Carry?
JNC
CF=0 Jump Not Carry
?
JO
OF=1 Jump Overflow
?
JNO
OF=0 Jump Not Overflow
?
JP/JPE
PF=1 Jump Parity or Jump Parity Even
?
JNP/JPO
PF=0 Jump Not Parity or Jump Parity Odd?
JS
SF=1 Jump Sign (negative)
?
JNS
SF=0 Jump No Sign (positive)?
例,已知一個字節變量char,試編寫一程序段,把其所存的大寫字母變成小寫字母。
解:?
next: …?
char DB ?'F' ? ;變量說明?
…?
MOV AL, char?
CMP AL, 'A'?
JB next ? ? ? ?;注意:字符是無符號數,不要使用指令JL?
CMP AL, 'Z'?
JA next?
ADD char, 20
總結
- 上一篇: W800/W801学习记录网络部分(一)
- 下一篇: 敏捷开发与GeneXus哲学