您的位置:首页 > 其它

汇编语言——80x86指令系统(二)

2009-05-30 12:20 375 查看
位操作指令
1. 逻辑指令
一般形式:
AND dest, src ; dest = dest and src
OR dest, src ; dest = dest or src
XOR dest, src ; dest = dest xor src
NOT dest ; dest = not dest
TEST dest, src ; dest and src,执行AND操作但不存储结果到dest
语法格式:
AND reg/mem, reg/mem/imm
OR reg/mem, reg/mem/imm
XOR reg/mem, reg/mem/imm
NOT reg/mem
TEST reg/mem, reg/mem/imm
对标志位的影响:
NOT:无。
其它指令:CF = OF = 0,按一般规则影响SF和ZF。
1. 移位指令
?移位指令包括:
SHL(Shift Left):逻辑左移
SAL(Shift Arithmetic Left):算术左移
SHR (Shift Right):逻辑右移
SAR(Shift Arithmetic Right):算术右移
其中,SHL与SAL完全相同,只是同一指令的不同助记符而已。
一般形式:
SHL dest, count ; dest左移。其中,count为移位次数(下同)
SAL dest, count ; 同SHL
SHR dest, count ; dest逻辑右移
SAR dest, count ; dest算术右移
语法格式:
SHL reg/mem, 1/CL
SHL reg/mem, imm8 ; 286新增
SAL、SHR与SAR格式同SHL
功能描述:
SHL/SAL:左移。最高位移出到CF,最低位移入0。
SAR:算术右移。最低位移入CF,最高位不变。
SHR:逻辑右移。最低位移入CF,最高位移入0。
对标志位的影响:
若移位后符号位发生了变化,则OF = 1,否则OF = 0;CF为最后移入位;按一般规则影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数 > 1,则OF无定义。
【例】设AX的值为一个2字节非压缩BCD码,将其转换为1字节压缩BCD码存入AL。
mov cl, 4
shl ah, cl ; ah低4位移到高4位
and al, 0fh ; al高4位清0
or al, ah
2.循环移位
循环移位指令包括:
ROL(Rotate Left):循环左移
ROR(Rotate Right):循环右移
RCL(Rotate through Carry Left):带进位循环左移
RCR(Rotate through Carry Right):带进位循环右移
一般形式:
ROL dest, count ; dest循环左移。其中,count为移位次数(下同)
ROR dest, count ; dest循环右移
RCL dest, count ; dest带CF循环左移
RCR dest, count ; dest带CF循环右移
语法格式:
ROL reg/mem, 1/CL
ROL reg/mem, imm8 ; 286新增
ROR、RCL、RCR格式同ROL
功能描述:
ROL:循环左移。最高位移出到CF,并同时移入最低位。
RCL:带进位循环左移。最高位移出到CF,原CF移入最低位。
ROR:循环右移。最低位移出到CF,并同时移入最高位。
RCR:带进位循环右移。最低位移出到CF,原CF移入最高位。
对标志位的影响:
若移位后符号位发生了变化,则OF = 1,否则OF = 0;CF为最后移入位;不影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数 > 1,则OF无定义。
【例】将DX:AX中的32位数左移1位。
shl ax, 1
rcl dx, 1
3. 位测试指令
?位测试指令包括;
BT(Bit Test):位测试
BTS(Bit Test and Set):位测试并置位
BTR(Bit Test and Reset):位测试并复位
BTC(Bit Test and Complement):位测试并取反)
这些指令均为386新增指令。
一般形式:
BT dest, index ; CF = dest的第index位,dest不变
BTS dest, index ; CF = dest的第index位,dest的第index位 = 1
BTR dest, index ; CF = dest的第index位,dest的第index位 = 0
BTC dest, index ; CF = dest的第index位,dest的第index位取反
语法格式:
BT reg16/mem16, reg16/imm8
BT reg32/mem32, reg32/imm8
BTR、BTS、BTC格式同BT
对标志位的影响:影响CF;其余标志无定义。
【例】位测试。
bt eax, 12 ; CF = eax的第12位
bts eax, 12 ; CF = eax的第12位,eax的第12位 = 1
btr eax, 12 ; CF = eax的第12位,eax的第12位 = 0
btc eax, 12 ; CF = eax的第12位,eax的第12位取反

控制转移指令
语法格式:
JMP label ; 若label与该指令位于同一代码段:IP = label的偏移地址;
; 若label与该指令不在同一代码段:CS:IP = label的分段地址
JMP reg16/mem16 ; IP = reg16 / [mem16]
JMP mem32 ; CS = [mem32+2],IP = [mem32]
功能描述:
JMP label ; 段内/段间直接转移
; 目标地址:标号label处
JMP reg16/mem16 ; 段内间接转移
; 目标地址:同一代码段,偏移地址 = reg16 / [mem16]
JMP mem32 ; 段间间接转移
; 目标地址:段地址= mem32高字,偏移地址= mem32低字
对标志位的影响:无。
2. 条件转移指令
?为简化描述,用Jcc表示所有条件转移指令的助记符。
一般形式:
Jcc label ; 若条件成立,则IP = label的偏移地址。其中,label是标号
功能描述:若条件成立,则转移到目标地址label;否则,CPU忽略该条件转移,继续执行下一条指令。
对标志位的影响:无。
Jcc指令包括下列3类:
(1)测试单个标志位的Jcc指令。
(2)用于带符号数比较的Jcc指令。常用在CMP指令之后,以判断带符号数的大小。
(3)用于无符号数比较的Jcc指令。常用在CMP指令之后,以判断无符号数的大小。
3. JCXZ/JECXZ(Jump if CX/ECX is Zero)
?语法格式:
JCXZ label ; 若CX = 0,则转移到label
JECXZ label ; 若ECX = 0,则转移到label;386新增
对标志位的影响:无
说明:
label相对位移量必须在-128 ~ 127之间,所有80x86 CPU都一样。
4. 循环指令
循环指令包括:
LOOP
LOOPE/LOOPZ(Loop while Equal/Zero)
LOOPNE/LOOPNZ(Loop while Not Equal/Not Zero)
LOOPZ与LOOPE、LOOPNZ与LOOPNE完全等价,只是同一指令的不同助记符。
语法格式:
LOOP label ; CX = CX – 1,若CX<>0,则转移到label
LOOPZ/LOOPE label ; CX = CX – 1,若CX<>0且ZF=1,则转移到label
LOOPNZ/LOOPNE label ; CX = CX – 1,若CX<>0且ZF=0,则转移到label
对标志位的影响:无。
5. 中断指令INT
本章只简单引入软件中断调用指令INT。详细介绍参见第8章。
语法格式:
INT n ; 调用中断n的中断服务程序。n 为中断号,取值0 ~ 255。
对标志位的影响:不影响CF、OF、SF、ZF。
MS DOS使用中断号21H作为系统调用,为程序员提供了上百种系统服务功能,对这些功能的调用步骤如下:
(1)由AH给出功能号。
(2)根据相应功能的要求,设置入口参数。
(3)INT 21H。
(4)分析和使用出口参数。
其中,最常用的是功能号4CH,用来实现程序退出、并返回DOS。使用方法如下:
mov ah, 4ch
int 21h
标志处理指令
标志处理指令包括CLC(Clear Carry Flag,CF清0)、STC(Set Carry Flag,CF置1)、CMC(Complement Carry Flag,CF取反)、CLD(Clear Direction Flag,DF清0)、STD(Set Direction Flag,DF置1)、CLI(Clear Interrupt Flag,关中断)和STI(Set Interrupt Flag,开中断)。
语法格式:
CLC ; CF = 0
STC ; CF = 1
CMC ; CF = NOT CF
CLD ; DF = 0
STD ; DF = 1
CLI ; IF = 0
STI ; IF = 1
对标志位的影响:只影响指定标志。
注意,在程序中应慎重使用CLI指令,错误的使用会导致系统无法正常工作。

处理器控制指令
1.NOP(No Operation):无操作
语法格式:
NOP
功能描述:NOP指令不做任何事情,只占用1个字节,耗费1个指令执行周期。
说明:
程序员经常使用NOP作为占位符(Place Holder),以预留内存空间。当然,可以使用其它指令实现类似功能,如XCHG AX, AX 指令。事实上,NOP与XCHG AX, AX 的机器码完全一样,都是90H。
对标志位的影响:无。
?2.HLT(Halt):暂停
语法格式:
HLT
功能描述:
使CPU进入暂停状态,这时CPU不执行任何操作,直到系统复位或发生外部中断为止。中断使CPU继续执行HLT后的下一条指令。
说明:
HLT不能用来终止程序。通常,应用程序不使用该指令。
对标志位的影响:无。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: