第 4章 数据操作
4.1 传送指令
4.2 算术运算
4.3 BCD码算术运算
4.4 位运算指令
4.1 传送指令
实现数据、地址、标志的传送
通用数据传送指令
数据交换指令
取地址指令
4.1.1 通用数据传送指令
1,MOV指令
格式,MOV DST,SRC
功能,DST代表目标操作数,SRC代表源操作数,DST和 SRC的数据类型应该一致 。
MOV指令中操作数的类型:
( 1) 常数,也叫立即数
( 2) 通用寄存器
( 3) 内存操作数
( 4) 段寄存器举例:
MOV dVar,20; ① 立即数 -> 内存操作数
MOV EAX,20 ; ② 立即数 -> 通用寄存器
MOV EDI,ESI; ③ 通用寄存器 ->通用寄存器
MOV EDI,[EBX+4]; ④ 内存操作数 -> 通用寄存器
MOV [EAX+4],EBX; ④ 通用寄存器 -> 内存操作数举例 (续):
MOV BX,CS; ⑤ 段寄存器 -> 通用寄存器
MOVDS,AX; ⑤ 通用寄存器 -> 段寄存器
MOVWORD PTR [EAX],DS ; ⑥ 段寄存器 ->
内存操作数
MOVFS,WORD PTR DS:[0080H]; ⑥ 内存操作数 -> 段寄存器
MOV指令限制
不能直接在两个内存操作数之间传送
立即数不能直接送段寄存器
立即数不能作为目标操作数
两个段寄存器之间不能直接传送
CS段寄存器不能作为目标操作数
2,MOVZX指令
格式,MOVZX DST,SRC
功能:将 SRC传送给 DST
高位不足的部分用 0填充
SRC不能是立即数
DST是 16位操作数时,SRC必须是 8位操作数。
SRC作为 DST的低 8位,DST的高 8位设为 0。
DST是 32位操作数时,SRC可以是 8位或 16位操作数。
SRC作为 DST的低 8位或低 16位,DST的高 24位或高 16位为 0。
3,MOVSX指令
格式,MOVSX DST,SRC
功能:将 SRC传送给 DST,高位不足的部分用 SRC的符号位(最高位)填充。
SRC不能是立即数。
DST是 16位操作数时,SRC必须 8位操作数 。
SRC作为 DST的低 8位,DST的高 8位设为全 0或全 1,与 SRC的最高位相同 。
DST是 32位操作数时,SRC可以 8位或 16位操作数 。
SRC作为 DST的低 8位或低 16位,DST的高 24位或高 16位为 SRC的最高位 。
4.1.2 数据交换指令
1,XCHG指令格式,XCHG OPRD1,OPRD2
功能:将 OPRD1和 OPRD2中的内容相互交换
两个操作数中有一个是通用寄存器,另一个可以是寄存器或内存操作数;
两个操作数 中不能有立即数,也不能同时为内存操作数 。
举例:
MOV AX,0382H ; AH=03H,AL=82H
XCHG AH,AL ; 交换后,AH=82H,AL=03H
MOV EAX,3 ; EAX=00000003H
MOV dVar,0 ; dVar=00000000H
XCHG dVar,EAX; 交换后,EAX=00000000H,dVar=00000003H
2,BSWAP指令格式,BSWAP OPRD
功能,OPRD必须是 32位寄存器,将 OPRD中的最高 1字节和最低 1字节互换;中间的 2
字节互换 。
举例,MOV EAX,7F860382H ; EAX=7F860382H
BSWAP EAX ; 互换后,EAX=8203867FH
4.1.3 取地址指令
1,LEA指令格式,LEA DST,SRC
功能:把 SRC的有效地址传送给 DST
SRC必须是一个内存操作数;
DST必须是一个寄存器举例 将 dVar的有效地址 0040400AH送给 EAX。
LEA EAX,DVAR
2,LDS指令格式,LDS DST,SRC
功能:从 SRC中取出 6个字节,前面 4个字节的内容作为双字送给 DST,后面两个字节作为一个字送给 DS。
DST是一个 32位寄存器
通常 SRC定义为 FWORD类型。
3,LES,LFS,LGS指令
这 3条指令用法和功能与 LDS指令相同 。
区别:后面两个字节内容
LDS要装入 DS;
LES要装入 ES;
LFS要装入 FS;
LGS要装入 GS。
4.2 算术运算
4.2.1 加法指令
4.2.2 减法指令
4.2.3 符号位扩展指令
4.2.4 乘法指令
4.2.5 除法指令
4.2.1 加法指令
1,ADD指令格式,ADD DST,SRC
功能,( DST) + ( SRC) → DST
限制:
SRC可以是立即数,内存操作数或寄存器 。
DST可以是内存操作数或寄存器,不能是立即数 。
DST和 SRC不能够同时采用内存操作数 。
溢出问题
ADD指令通过标志位来检查是否有溢出
CF=1,两个无符号数相加,最高位有进位,结果产生溢出
OF=1,两个正数相加,结果却得到一个负数;或者两个负数相加,结果却得到一个正数 。
加法指令(续)
2.INC指令格式,INC DST
功能,DST ← DST + 1
INC指令可用于对计数器和地址指针进行加
1的操作加法指令(续)
3,ADC指令格式,ADC DST,SRC
功能,DST ← DST + SRC + CF
ADC指令执行完毕后,CF,OF的设置和 ADD
指令的情况相同,结果溢出与否要看 CF,
OF标志 。
4.2.2 减法指令
1,SUB指令格式,SUB DST,SRC
功能,DST ← DST–SRC
SUB通过标志位来检查是否有溢出
CF=1:表示无符号数减法发生溢出,被减数小于减数 。
OF=1:正数减去负数,结果却得到负数;或者负数减去正数,结果却得到正数 。
减法指令(续)
2,DEC指令格式,DEC DST
功能,DST ← DST?1
DEC指令可用于对计数器和地址指针进行减 1的操作减法指令(续)
3,SBB指令格式,SBB DST,SRC
功能,DST ← DST?SRC?CF
常用于多位数的减法
结果有无溢出取决于 SBB指令执行后的 CF与 OF
减法指令(续)
4,NEG指令格式,NEG DST
功能,DST ← 0?DST
将操作数按位求反后加 1
减法指令(续)
5,CMP指令格式,CMP SRC1,SRC2
功能:比较两个操作数的大小,设置相应的标志位 CF,OF,SF,ZF,AF,PF等
CMP指令中,SRC1不能是立即数
CMP指令后面,常常跟着条件跳转指令
4.2.3 符号位扩展指令
1,CBW指令格式,CBW
功能:将 AL中的符号位扩展至 AH
AL中符号位为 1时,AH为 0FFH;
AL中符号位为 0时,AH为 00H。
符号位扩展指令(续)
2,CWDE指令格式,CWDE
功能:将 16位有符号数 AX扩展为 32位有符号数 EAX
AX中符号位为 1时,EAX的高 16位为 0FFFFH;
AX中符号位为 0时,EAX的高 16位为 0000H。
符号位扩展指令(续)
3,CWD指令格式,CWD
功能:将 16位有符号数 AX扩展为 32位有符号数 DX:AX,DX作为高 16位,AX为低 16位
AX中符号位为 1时,DX为 0FFFFH;
AX中符号位为 0时,DX为 0000H。
符号位扩展指令(续)
4,CDQ指令格式,CDQ
功能:将 32位有符号数 EAX扩展为 64位有符号数 EDX:EAX,EDX作为高 32位,EAX作为低 32位 。
EAX中符号位为 1时,EDX为 0FFFFFFFFH;
EAX中符号位为 0时,EDX为 00000000H。
4.2.4 乘法指令
1,MUL指令格式,MUL SRC
功能:进行无符号数的乘法操作
SRC为 8位时,AX← AL?SRC。
SRC为 16位时,DX:AX← AX?SRC。 DX存放结果的高 16位 。
SRC为 32位时,EDX:EAX←EAX?SRC。 EDX存放结果的高 32位 。
乘法指令(续)
2,IMUL指令格式 1,IMUL SRC
格式 2,IMUL DST,SRC
格式 3,IMUL DST,SRC1,SRC2
功能:进行有符号数的乘法操作乘法指令(续)
格式 1,IMUL SRC
SRC 作 为 一 个 乘 数,另 一 个 乘 数 在
AL/AX/EAX中
SRC为 8位时,AX←AL?SRC。
SRC为 16位时,DX:AX?AX?SRC。 DX存放结果的高 16位 。
SRC为 32位时,EDX:EAX?EAX?SRC。 EDX存放结果的高 32位 。
乘法指令(续)
格式 2,IMUL DST,SRC
SRC可以是 8位 /16位 /32位的寄存器 /内存操作数 /立即数;
DST是 16位 /32位的寄存器;
操作结果为,DST←DST?SRC。
乘法指令(续)
格式 3,IMUL DST,SRC1,SRC2
SRC1可以是 16位 /32位的寄存器 /内存操作数;
SRC2是 8位 /16位 /32位的立即数;
操作结果为,DST←SRC1?SRC2 。
4.2.5 除法指令
1,DIV指令格式,DIV SRC
功能:进行无符号数的除法操作
SRC作为一个除数,不能为立即数被除数在 AX,DX:AX,EDX:EAX中除法指令(续)
除法操作的位数取决于 SRC的位数
SRC为 8位时,AX?SRC?AL余 AH
SRC为 16位时,DX:AX?SRC?AX余 AX
SRC为 32位时,EDX:EAX?SRC?EAX余 EDX
除法指令(续)
2,IDIV指令格式,IDIV SRC
功能:进行有符号数的除法操作用法和 DIV指令相同
4.3 BCD码算术运算
在压缩 BCD码中,用 4个二进制位表示一个十进制位;
在非压缩 BCD码中,用 8个二进制位表示一个十进制位,最高 4位为 0000。
4.3.1 压缩 BCD码调整指令
1,DAA指令格式,DAA
功能:将 AL调整为一个压缩 BCD格式的数字压缩 BCD码调整指令(续)
2,DAS指令格式,DAS
功能:将 AL调整为一个压缩 BCD格式的数字
4.3.2 非压缩 BCD码调整指令
1,AAA指令格式,AAA
功能:将 AL调整为一个非压缩 BCD格式的数字。
非压缩 BCD码调整指令(续)
2,AAS指令格式,AAS
功能:将 AL调整为一个非压缩 BCD格式的数字非压缩 BCD码调整指令(续)
3,AAM指令格式,AAM
功能:将二进制数 AL调整为一个非压缩 BCD
格式的数字 AX
非压缩 BCD码调整指令(续)
4,AAD指令格式,AAD
功能:将一个非压缩 BCD格式的数字 AX调整为二进制数字 AX
4.4 位运算指令对操作数中的每一个二进制位逐个操作
4.4.1 逻辑运算指令
4.4.2 位操作指令
4.4.3 移位指令
4.4.1 逻辑运算指令
逻辑运算指令包括 NOT,AND,OR,XOR、
TEST五条指令 。
按位进行操作
各位之间运算结果互相独立逻辑运算指令
1,AND指令
格式,AND DST,SRC
功能,DST ← DST & SRC
根据结果设置 ZF,SF,PF;
OF,CF设为 0
常用于将一个数中的某一位或几位清零举例:将某数高 4位清零,而低 4位不变
AND AL,0FH ; 0FH = 00001111B
AND指令(续)
举例,
‘ 5’ =35H=00110101B
和 00001111B相,与,后结果为 00000101B=5。 即:
& 00110101B = 35H
& 00001111B = 0FH
& 00000101B = 05H
2,OR指令格式,OR DST,SRC
功能,DST ← DST | SRC
常用于将一个数的某一位或某几位置 1
OR指令 (续 )
例如,9=00001001B,和 00110000B相,或,
后,得 ‘ 9’ =39H=00111001B。 即:
00001001B = 09H
| 00110000B = 30H
| 00111001B = 39H
3,XOR指令格式,XOR DST,SRC
功能,DST ← DST ^ SRC
常用于将一个数的某一位或某几位求反
XOR指令(续)
举例:
‘ G’=47H=01000111B,和 00100000B相
,异或,后,结果为 01100111B=67H=‘g’。
01000111B = 47H
^00100000B = 20H
^ 01100111B = 67H
4,TEST指令格式,TEST SRC1,SRC2
功能:两个操作数进行逻辑,与,操作,
设置 ZF,SF,PF标志位。 OF,CF设置为 0。
常用于测试某一位或几位是否为 1。
TEST指令(续)
举例:
测试 AL的第 4位是否为 1
TEST AL,10H
结果:
若 AL的第 4位 ( D4) 为 0,则 ZF=1;
若第 4位 ( D4) 为 1,则 ZF=0。
5,NOT指令格式,NOT DST
功能,DST ← NOT DST
用于将一个数的全部位求反
NOT指令(续)
举例:
若 BL=55H,执行指令,NOT BL后,BL=0AAH,
即:
~ 01010101B = 55H
10101010B = 0AAH
注意 NOT和 NEG的区别
4.4.2 位操作指令分为位扫描指令和位测试指令
1,BSF指令格式,BSF DST,SRC
功能:从右向左扫描 SRC中第一个含 1的位,
把这个位的编号赋给 DST,置 ZF=0。 若
SRC= 0,置 ZF=1,DST值不确定 。
举例:若 BX=0150H,执行指令 BSF AX,BX后,AX
的值变为 0004H 。
2,BSR指令格式,BSR DST,SRC
功能:从左向右扫描 SRC中第一个含 1的位,
把这个位的编号赋给 DST,置 ZF=0。 若
SRC?0,置 ZF=1,DST值不确定 。
举例,若 BX=0150H,执行指令 BSR AX,BX后,
AX的值变为 0008H 。
3,BT指令格式,BT DST,SRC
功能:取出 DST操作数中编号为 SRC的位,
赋给 CF
举例:若 BX=0040H,执行指令,BT BX,38后,
由于 SRC= 38,但 BX只有 16位,按 16为取模后得
SRC= 6,所以 CF得值为 1。
4,BTR指令格式,BTR DST,SRC
功能:取出 DST中编号为 SRC的位,赋给 CF,
再将该位设为 0。
BT指令不改变 DST的 SRC位
BTR指令将 DST的 SRC位设为 0
5,BTS指令格式,BTS DST,SRC
功能:取出 DST中编号为 SRC的位,赋给 CF,
再将该位设为 1
6,BTC指令格式,BTC DST,SRC
功能:取出 DST编号为 SRC的位,赋给 CF,
再将该位取反 。
4.4.3 移位指令
包括算术移位指令、逻辑移位指令和循环移位指令
进行左移和右移操作
统一格式:指令助记符 DST,SRC
1.算术左移和逻辑左移指令 SAL( SHL)
格式,SAL DST,SRC
格式,SHL DST,SRC
功能:将 DST向左移动 SRC指定的次数
最低位补入相应的 0
CF的内容为 DST最后移出位的值举例:
设 AL=73H,则执行指令,SHL AL,1后,
AL=0E6H,CF=0
如图:
2.逻辑右移指令 SHR
格式,SHR DST,SRC
功能:将 DST向右移动 SRC指定的次数
最高位补入相应的 0
CF的内容为 DST最后移出位的值举例:
AL=73H,则执行指令,SHR AL,1
后,AL=039H,CF=1
如图:
3.算术右移指令 SAR
格式,SAR DST,SRC
功能:将 DST向右移动 SRC指定的次数
最高位保持不变
CF的内容为 DST最后移出位的值举例:
设 AL=83H,则执行指令,SAR AL,1后,
AL=0C1H,CF=1
如图:
4.循环左移指令 ROL
格式,ROL DST,SRC
功能:将 DST向左移动 SRC指定的次数
移出的最高位复制到 CF和最低位中举例:
设 AL=0F3H,则执行指令 ROL AL,1后,
AL=0E7H,CF=1。
如图:
5.循环右移指令 ROR
格式,ROR DST,SRC
功能:将 DST向右移动 SRC指定的次数
移出的最低位复制到 CF和最高位中举例:
设 AL=0F3H,则执行指令,ROR AL,1后,
AL=0F9H,CF=1
如图:
6.带进位循环左移指令 RCL
格式,RCL DST,SRC
功能:将 DST向左移动 SRC指定的次数
CF复制到最低位
移出的最高位复制到 CF中举例:
设 AL=0F3H,CF=0,则执行指令,RCL AL,1
后,AL=0E7H,CF=1
如图:
7.带进位循环右移指令 RCR
格式,RCR DST,SRC
功能:将 DST向右移动 SRC指定的次数
CF复制到最高位后
移出的最低位复制到 CF中举例:
设 AL=0F3H,CF=0,执行指令,RCR AL,1
后,AL=079H,CF=1
如图:
8.双精度左移指令 SHLD
格式,SHLD DST,SRC1,SRC2
功能:把 DST左移由 SRC2指定的位
空出的位用 SRC1的最高 SRC2位填充
最后移出的位在 CF中
9.双精度右移指令 SHRD
格式,SHRD DST,SRC1,SRC2
功能:把 DST右移由 SRC2指定的位
空出的位用 SRC1的最低 SRC2位填充
最后移出的位在 CF中
10,CLC指令格式,CLC
功能:将 EFLAGS中的 CF标志位清零
11,STC指令格式,STC
功能:将 EFLAGS中的 CF标志位置 1
12,CMC指令格式,CMC
功能:将 EFLAGS中的 CF标志位变反执行 CMC后:
若 CF为 0,CF变为 1
若 CF为 1,CF变为 0
END