汇编-5
檢測(cè)位指令TEST
檢測(cè)位指令是把二個(gè)操作數(shù)進(jìn)行邏輯“與”操作,并根據(jù)運(yùn)算結(jié)果設(shè)置相應(yīng)的標(biāo)志位,但并不保存該運(yùn)算結(jié)果,所以,不會(huì)改變指令中的操作數(shù)。在該指令后,通常用JE、JNE、JZ和JNZ等條件轉(zhuǎn)移指令。
指令的格式:TEST ?Reg/Mem, Reg/Mem/Imm
受影響的標(biāo)志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
call XXXXXXXX
test al,al/eax,eax...
je/jne...
**************************************************************************************************
循環(huán)指令本身的執(zhí)行不影響任何標(biāo)志位。
1、循環(huán)指令
循環(huán)指令LOOP的一般格式:
LOOP 標(biāo)號(hào)
LOOPW 標(biāo)號(hào) ;CX作為循環(huán)計(jì)數(shù)器
LOOPD 標(biāo)號(hào) ;ECX作為循環(huán)計(jì)數(shù)器
....
....
inc eax
dex ebx
cmp eax,ebx
jne/je XXXX ^
?
求1+2+…+1000之和,并把結(jié)果存入AX中。
?
方法1:因?yàn)橛?jì)數(shù)器CX只能遞減,所以,可把求和式子改變?yōu)?#xff1a;1000+999+…+2+1。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
again: ADD AX, CX ;計(jì)算過程:1000+999+…+2+1
? ? ? ?DEC CX?
? ? ? ?LOOP again?
…?
方法2:不用循環(huán)計(jì)數(shù)器進(jìn)行累加,求和式子仍為:1+2+…+999+1000。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
? ? ? ?MOV BX, 1?
again: ADD AX, BX ;計(jì)算過程:1+2+…+999+1000?
? ? ? ?INC BX?
? ? ? ?LOOP again?
…?
從程序段的效果來看:方法1要比方法2好。為什么?^_^
**************************************************************************************************
轉(zhuǎn)移指令
轉(zhuǎn)移指令是匯編語言程序員經(jīng)常使用的一組指令。在高級(jí)語言中,時(shí)常有“盡量不要使用轉(zhuǎn)移語句”的勸告,但如果在匯編語言的程序中也盡量不用轉(zhuǎn)移語句,那么該程序要么無法編寫,要么沒有多少功能,所以,在匯編語言中,不但要使用轉(zhuǎn)移指令,而且還要靈活運(yùn)用,因?yàn)橹噶钕到y(tǒng)中有大量的轉(zhuǎn)移指令。
轉(zhuǎn)移指令分無條件轉(zhuǎn)移指令和有條件轉(zhuǎn)移指令兩大類。
1、無條件轉(zhuǎn)移指令
無條件轉(zhuǎn)移指令包括:JMP、子程序的調(diào)用和返回指令、中斷的調(diào)用和返回指令等。
下面只介紹無條件轉(zhuǎn)移指令JMP
JMP指令的一般形式:
JMP ?標(biāo)號(hào)/Reg/Mem
2、條件轉(zhuǎn)移指令
條件轉(zhuǎn)移指令是一組極其重要的轉(zhuǎn)移指令,它根據(jù)標(biāo)志寄存器中的一個(gè)(或多個(gè))標(biāo)志位來決定是否需要轉(zhuǎn)移,這就為實(shí)現(xiàn)多功能程序提供了必要的手段。微機(jī)的指令系統(tǒng)提供了豐富的條件轉(zhuǎn)移指令來滿足各種不同的轉(zhuǎn)移需要,在編程序時(shí),要對(duì)它們靈活運(yùn)用。
條件轉(zhuǎn)移指令又分三大類:基于無符號(hào)數(shù)的條件轉(zhuǎn)移指令、基于有符號(hào)數(shù)的條件轉(zhuǎn)移指令和基于特殊算術(shù)標(biāo)志位的條件轉(zhuǎn)移指令。
、無符號(hào)數(shù)的條件轉(zhuǎn)移指令
指令的助憶符
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?
、有符號(hào)數(shù)的條件轉(zhuǎn)移指令
指令的助憶符
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?
、特殊算術(shù)標(biāo)志位的條件轉(zhuǎn)移指令
指令的助憶符
?檢測(cè)的轉(zhuǎn)移條件 功能描述?
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)?
例,已知一個(gè)字節(jié)變量char,試編寫一程序段,把其所存的大寫字母變成小寫字母。
解:?
next: …?
char DB ?'F' ? ;變量說明?
…?
MOV AL, char?
CMP AL, 'A'?
JB next ? ? ? ?;注意:字符是無符號(hào)數(shù),不要使用指令JL?
CMP AL, 'Z'?
JA next?
ADD char, 20
檢測(cè)位指令是把二個(gè)操作數(shù)進(jìn)行邏輯“與”操作,并根據(jù)運(yùn)算結(jié)果設(shè)置相應(yīng)的標(biāo)志位,但并不保存該運(yùn)算結(jié)果,所以,不會(huì)改變指令中的操作數(shù)。在該指令后,通常用JE、JNE、JZ和JNZ等條件轉(zhuǎn)移指令。
指令的格式:TEST ?Reg/Mem, Reg/Mem/Imm
受影響的標(biāo)志位:CF(0)、OF(0)、PF、SF和ZF(AF無定義)
call XXXXXXXX
test al,al/eax,eax...
je/jne...
**************************************************************************************************
循環(huán)指令本身的執(zhí)行不影響任何標(biāo)志位。
1、循環(huán)指令
循環(huán)指令LOOP的一般格式:
LOOP 標(biāo)號(hào)
LOOPW 標(biāo)號(hào) ;CX作為循環(huán)計(jì)數(shù)器
LOOPD 標(biāo)號(hào) ;ECX作為循環(huán)計(jì)數(shù)器
....
....
inc eax
dex ebx
cmp eax,ebx
jne/je XXXX ^
?
求1+2+…+1000之和,并把結(jié)果存入AX中。
?
方法1:因?yàn)橛?jì)數(shù)器CX只能遞減,所以,可把求和式子改變?yōu)?#xff1a;1000+999+…+2+1。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
again: ADD AX, CX ;計(jì)算過程:1000+999+…+2+1
? ? ? ?DEC CX?
? ? ? ?LOOP again?
…?
方法2:不用循環(huán)計(jì)數(shù)器進(jìn)行累加,求和式子仍為:1+2+…+999+1000。?
?…?
? ? ? ?XOR AX, AX?
? ? ? ?MOV CX, 1000D?
? ? ? ?MOV BX, 1?
again: ADD AX, BX ;計(jì)算過程:1+2+…+999+1000?
? ? ? ?INC BX?
? ? ? ?LOOP again?
…?
從程序段的效果來看:方法1要比方法2好。為什么?^_^
**************************************************************************************************
轉(zhuǎn)移指令
轉(zhuǎn)移指令是匯編語言程序員經(jīng)常使用的一組指令。在高級(jí)語言中,時(shí)常有“盡量不要使用轉(zhuǎn)移語句”的勸告,但如果在匯編語言的程序中也盡量不用轉(zhuǎn)移語句,那么該程序要么無法編寫,要么沒有多少功能,所以,在匯編語言中,不但要使用轉(zhuǎn)移指令,而且還要靈活運(yùn)用,因?yàn)橹噶钕到y(tǒng)中有大量的轉(zhuǎn)移指令。
轉(zhuǎn)移指令分無條件轉(zhuǎn)移指令和有條件轉(zhuǎn)移指令兩大類。
1、無條件轉(zhuǎn)移指令
無條件轉(zhuǎn)移指令包括:JMP、子程序的調(diào)用和返回指令、中斷的調(diào)用和返回指令等。
下面只介紹無條件轉(zhuǎn)移指令JMP
JMP指令的一般形式:
JMP ?標(biāo)號(hào)/Reg/Mem
2、條件轉(zhuǎn)移指令
條件轉(zhuǎn)移指令是一組極其重要的轉(zhuǎn)移指令,它根據(jù)標(biāo)志寄存器中的一個(gè)(或多個(gè))標(biāo)志位來決定是否需要轉(zhuǎn)移,這就為實(shí)現(xiàn)多功能程序提供了必要的手段。微機(jī)的指令系統(tǒng)提供了豐富的條件轉(zhuǎn)移指令來滿足各種不同的轉(zhuǎn)移需要,在編程序時(shí),要對(duì)它們靈活運(yùn)用。
條件轉(zhuǎn)移指令又分三大類:基于無符號(hào)數(shù)的條件轉(zhuǎn)移指令、基于有符號(hào)數(shù)的條件轉(zhuǎn)移指令和基于特殊算術(shù)標(biāo)志位的條件轉(zhuǎn)移指令。
、無符號(hào)數(shù)的條件轉(zhuǎn)移指令
指令的助憶符
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?
、有符號(hào)數(shù)的條件轉(zhuǎn)移指令
指令的助憶符
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?
、特殊算術(shù)標(biāo)志位的條件轉(zhuǎn)移指令
指令的助憶符
?檢測(cè)的轉(zhuǎn)移條件 功能描述?
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)?
例,已知一個(gè)字節(jié)變量char,試編寫一程序段,把其所存的大寫字母變成小寫字母。
解:?
next: …?
char DB ?'F' ? ;變量說明?
…?
MOV AL, char?
CMP AL, 'A'?
JB next ? ? ? ?;注意:字符是無符號(hào)數(shù),不要使用指令JL?
CMP AL, 'Z'?
JA next?
ADD char, 20
總結(jié)
- 上一篇: W800/W801学习记录网络部分(一)
- 下一篇: 敏捷开发与GeneXus哲学