1) 逻辑运算
a) AND
b) OR
c) NOT
a) 不允许使用立即数
d) XOR 异或
e) TEST 做与运算,但是不保存结果,只根据结果设置条件码
f) 除了NOT不允许使用立即数,其他的四种,只有源操作数可以是立即数,至少有一个操作数必须在寄存器中,另一个操作数可以使用任意寻址方式
2.2.1.8
2) 位测试并修改指令
a) BT 位测试
i. BT DST, SRC 将目的操作数中,由源操作数指定位的值,送CF
b) BTS 位测试并置1
i. 将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值+1
c) BTR 位测试并置0
i. 将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值置为0
d) BTC 位测试并变反
i. 将目的操作数中,由源操作数指定位的值,送CF,并且将目的操作数该位置的值变反
e) SRC,可以使用,立即数或者寄存器方式,直接指明是第几位,也可以用任意一字寄存器或双字寄存器的内容给出同一个值
f) 目的操作数可以是用除了立即数之外的任意一种寻址方式
g) 因为目的操作数的字长最大为32位,所以位位置的范围是0~31
3) 位扫描指令
a) BSF 正向位扫描
i. 从0位置开始,左←右
ii. 目的是检索第一个为1 的位置,并且记录,如果遇到第一个为1 的位,则将ZF置0,并把位置装入目的存储器中;如果源操作数为0àZF= 1,此时目的存储器无定义
iii. 源操作数可以使用除立即数意外的任意一种寻址方式,目的操作数必须用字或双字寄存器
b) BSR 反向位扫描
i. 自左à右扫描
ii. 其他与BSF一致
4) 移位指令
a) SHL 逻辑左移
i. SHL OPR,CNT
ii. CNT大于1时,移位次数存放在CL中,直接用CL代替CNT,当=1 时,直接写1
b) SHR
c) SAL 算术左移
i. 与SHL一致
d) SAR
i. SAR OPR,CNT
ii. CNT大于1时,移位次数存放在CL中,直接用CL代替CNT,当=1 时,直接写1
iii. 最高位右移,补其本身,本身是0,补0,是1,补1
e) ROL 循环左移
f) ROR
g) RCL 带进位左移
h) RCR
i) SHLD 双精度左移
j) SHRD
1) MOVS
2) CMPS
3) SCAS 串扫描
4) LODS 从串取
5) STOS 存入串
6) INS 串输入
7) OUTS 串输出
8) 串处理的指令处理存放在存储器中的数据串
9) 配合以上指令使用的前缀有:
a) REP
b) REPE/REPN
c) REPNE/REPXZ
10) 与REP相配合工作的MOVS,STOS,LODS,INS,OUTS
a) REP str
i. 重复str操作,知道CX计数器中的值为0
b) MOVS
i. MOVSB
ii. MOVSW
iii. MOVSD
iv. 目的操作数必须存储在ES,源操作数必须存储在DS,源串允许使用段超越前缀
v. 源串首地址存放在SI,目的串首地址存放在DI,串长度存放在CX计数器中
vi. CLDàDF=0,地址自动增量;STDàDF=1,地址自动减量
vii. 执行MOVS的准备工作 P77
1. 源串首地址存放在SI,目的串首地址存放在DI
2. 串长度存放在CX计数器中
3. 建立方向标志
c) STOS 存入串指令
i. STOS
ii. STOSB
iii. STOSW
iv. STOSD
v. 将存放在AL\AX\EAX的内容存入由目的寄存器(DI)指向的附加段的某个单元
vi. 根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)
vii. 与REP联用时,将内容的长度存放在计数器中
viii. 初始化某一缓冲区时很有作用
ix. 其他的特点和MOVS一致
d) LODS 从串取指令
i. 从源变址寄存器(SI)所指向的数据段中某单元取出内容,存放在AX\AL\EAX中
ii. 根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)
iii. 其他特点和STOS一致
e) INS 串输入指令
i. INS
ii. INSB
iii. INSW
iv. INSD
v. 将端口号在DX中的I/O空间的内容传送到附加段中的目的变址寄存器(DI)所指向的存储单元中
vi. 根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)
vii. 其他特点和STOS一致
viii. I/O端口处理的速度必须与REP INS一致
f) OUTS 串输出指令
i. OUTS
ii. OUTSB
iii. OUTSW
iv. OUTSD
v. 把由源变址寄存器(SI)所指向的存储器中的内容传送到端口号在DX中的I/O端口中去
vi. 根据DF的值以及数据类型,修改目的寄存器的内容(存储的是地址)
vii. 其他特点和STOS一致
viii. I/O端口处理的速度必须与REP OUTS一致
11) 与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS
a) CMPS
i. SI所指向的数据段(DS)中的内容与DI所指向的附加段(ES)中的一个字节、字或者双字相减,不保存结果,根据结果设置条件码
ii. 其他的特性与MOVS一致
b) SCAS
i. SACS
ii. SACSB
iii. SACSW
iv. SACSD
v. 将AX\AL\EAX中的内容与DI所指向的附加段中的一个字节、字或者双字比较,不保存结果,根据结果设置条件码
vi. 其他的特性与MOVS一致
不允许使用“立即数寻址”的有:
1) 段内间接寻址
2) 段间间接寻址
3) PUSH,POP操作
4) XCHG
5) LEA
6) 乘法运算,源操作数的寻址
7) 除法运算,源操作数的寻址
8) 位测试并修改指令
9) NOT不允许使用立即数
10) BSF/BSR
11) SHL/SHR
条件标志位
1) 最主要的是CF,ZF,SF,OF四位
2) CF,是根据最高有效位是否有向高位的进位设置的,有进位CF=1,否则CF=0
a) 可以用来表示无符号数的溢出,CF = 1 ,溢出,否则不溢出
3) OF,根据操作书的符号以及其变化情况来设置。
a) 加法,当两个符号相同相加时,<0 则溢出,符号不同相加,不会出现溢出
b) 减法,当两个符号不相同相减时,> 0 则溢出,符号相同相减,不会溢出
各个指令对标志位的影响
指令集 |
指令名 |
CF |
ZF |
AF |
OF |
SF |
PF |
备注 |
||||
通用数据传送指令 |
MOV |
- |
- |
- |
- |
- |
- |
无影响 |
||||
MOVSX |
- |
- |
- |
- |
- |
- |
无影响 |
|||||
MOVZX |
- |
- |
- |
- |
- |
- |
无影响 |
|||||
PUSH/POP |
- |
- |
- |
- |
- |
- |
无影响 |
|||||
PUSHA/POPA |
- |
- |
- |
- |
- |
- |
无影响 |
|||||
累加器专用传送指令 |
IN/OUT |
- |
- |
- |
- |
- |
- |
无影响 |
||||
XLAT |
- |
- |
- |
- |
- |
- |
无影响 |
|||||
地址传送指令 |
LEA等 |
- |
- |
- |
- |
- |
- |
无影响 |
||||
标志寄存器指令 |
LAHF/PUSHF/PUSHFD |
- |
- |
- |
- |
- |
- |
无影响 |
||||
SAHF/POPF/POPFD |
由装入的值确定标志位的值 |
影响 |
||||||||||
类型转换指令 |
CBD/CWD/CDQ/BSW |
- |
- |
- |
- |
- |
- |
无影响 |
||||
加法指令 |
ADD/ADC/XADD |
1 |
1 |
- |
1 |
1 |
- |
影响 |
||||
INC |
- |
|
|
|
|
|
|
|||||
减法指令 |
SUB/SBB/NEG/CMP CMPXCHG/CMPXHCG8B |
1 |
1 |
- |
1 |
1 |
- |
影响 |
||||
DEC |
- |
|
|
|
|
|
|
|||||
逻辑运算指令 |
NOT |
- |
- |
- |
- |
- |
- |
无影响 |
||||
AND/OR/XOR/TEST |
1 |
根据结果 |
- |
根据结果 |
|
|||||||
位测试指令 |
BT/BTS/BTR/BTC |
1 |
- |
- |
- |
- |
- |
影响 |
||||
位扫描指令 |
BSF/BSR |
- |
1 |
- |
- |
- |
- |
影响 |
||||
移位指令 |
SHL/SHR/SAL/SAR
|
根据各指令规定设置 |
根据移位后的结果设置 |
|
最高位移位后有变化,OF=1 |
根据移位后的结果设置 |
根据移位后的结果设置 |
|
||||
ROL/ROR/RCL/RCR/SHLD/ SHRD |
1 |
- |
- |
1 |
- |
- |
影响 |
|||||
串处理指令 |
MOVS/STOS/LODS/INS/OUTS/ SCAS |
- |
- |
- |
- |
- |
- |
无影响 |
||||
|
|
|
|
|
|
|
|
|
注意点:
1) 双操作数指令不允许两个操作数都使用存储器,所以必须有一个操作数是寄存器
2) 不允许用MOV 指令在两个存储单元之间直接传送数据,也不允许两个段寄存器之间直接传送信息
3) 几种传送信息的方式: