操作数的寻址方式—立即寻址,寄存器寻址,存储器寻址和I/O端口寻址。
立即数只能是整数而且是常数
立即数在指令队列中,不用总线周期,执行快。
MOV AX,0102H ;AX<-0102H
指令中指明某个寄存器的内容即为操作数。
寄存器在CPU中,不用总线周期,执行快。
MOV AX,BX ;AX-
指令中直接给出操作数所在的内存单元的有效地址(EA ,即偏移地址)
默认的段地址在 DS 段寄存器,若在其他段地址中可使用段超越前缀改变。
MOV AX,ES:[2000H]
(1) 基址寻址
用 BX 或 BP 作间接寻址寄存器
MOV AX,[BX] ;隐含在 DS 段
MOV AX,[BP] ;隐含在 SS 段
(2)变址寻址
用 SI 或 DI 作间接寻址寄存器
MOV CL,[SI] ;单独用 SI 或 DI 时,隐含在 DS 段中
MOV AX,[DI] ;串操作时 SI 隐含在 DS段,DI 隐含在 ES 段中
(3)相对基址寻址
指令中给出基址寄存器即位移量,二者之和为操作数的有效地址
MOV AX,[BX+6824H]
(4)相对变址寻址
指令中给出变址寄存器即位移量,二者之和为操作数的有效地址
MOV AX,[SI+6824H]
<=>
MOV AX,6824H[SI]
( 3 )(4)中,BX/SI/DI 段地址默认为 DS ,BP 段地址 默认是 SS,可用段超越前缀改变
MOV AX,ES:[DI+06H]
(5)基址变址寻址方式
有效地址 = 基址寄存器(BX或BP)的内容 + 变址寄存器(SI或DI)的内容。
MOV AX,[BX+SI]
<=>
MOV AX,[BX][SI]
(6)相对基址变址寻址方式
有效地址 = 基址寄存器(BX或BP)的内容 + 变址寄存器(SI或DI)的内容 + 8/16位位移量
MOV AX,[BX+DI+6]
<=>
MOV AX,6[BX+DI]
<=>
MOV AX,6[BX][DI]
① 基本传送指令 MOV
MOV 目的操作数,源操作数
注意:
MOV AX,06H
②数据交换指令 XCHG
XCHG 目的操作数,源操作数
把两个地方的操作数进行互换.
注意:
XCHG AH,AL
③堆栈操作指令 PUSH , POP
进栈指令 PUSH —— PUSH 源操作数
先使堆栈指针 SP 减2,然后把一个字操作数存入堆栈顶部
出栈指令 POP —— POP 目的操作数
把栈顶的一个字传送到目的操作数,然后堆栈指针 SP 加2
PUSH BX ;将 BX 的内容压入堆栈,SP=SP-2
POP AX ;将 栈顶(SP所指的)一个字的内容传至 AX,SP=SP+2
①输入输出指令 IN/OUT
IN AX/AL,源操作数
OUT 目的操作数,AX/AL
注意:
IN AL,20H
OUT DX,AX
②换码指令(查表指令) XLAT
XLAT
将 BX 指定的缓冲区中,AL 指定的位移处的一个字节数据提取出赋给 AL
使用方式:
1.换码指令前,在主存建立一个字节量表格,内含要转换成的目的代码,表格首地址放于BX中,AL 存放相对表格首地址的位移量。
2.换码指令执行后,AL 寄存器的内容转换为目标代码
①取有效地址指令 LEA
LEA 寄存器,源操作数
将存放源操作数的16位偏移地址送到一个16位的通用寄存器
②将地址指针(其实是内存单元的内容,该内容是地址)装入DS指令 LDS
LDS 寄存器,源操作数
LDS将源操作数有效地址所对应的内存单元中的双字长的高字节内容(该内容一般为段地址)送至DS、低字内容(给内容一般为偏移地址)送入指令所指的寄存器
③将地址指针(其实是内存单元的内容,该内容是地址)装入ES指令 LES
LES 寄存器,源操作数
LES将源操作数有效地址所对应的内存单元中的双字长的高字节内容(该内容一般为段地址)送至ES、低字内容(给内容一般为偏移地址)送入指令所指的寄存器
注意:
LEA,LDS,LES 指令
标志读取指令 LAHF
LAHF
将标志寄存器的低8位 传送到 AH 中,仅传送 SF,ZF,AF,PF,CF
标志设置指令 SAHF
SAHF
将AH寄存器的相应位传送带哦标志寄存器的 低8位,仅传送 SF,ZF,AF,PF,CF
标志寄存器压入堆栈指令 PUSHF
PUSHF
将标志寄存器的值压入堆栈顶部
注意:
目的操作数 = 目的操作数 + 源操作数
目的操作数 = 目的操作数 + 源操作数 + CF(进位标志)
目的操作数 = 目的操作数 + 1
注意:
目的操作数 = 目的操作数 - 源操作数
目的操作数 = 目的操作数 - 源操作数 - CF(进/借位标志)
目的操作数 = 目的操作数 - 1
目的操作数 = 目的操作数取补码( 0 - 目的操作数)
目的操作数 - 源操作数 ,但不保留结果,只是影响标志位
注意:
无符号相乘
16位:AX = AL * 源操作数
32位:DX,AX = AX * 源操作数
有符号相乘
16位:AX = AL * 源操作数
32位:DX,AX = AX * 源操作数
注意:
① DIV
DIV 源操作数
无符号数除法
32位:DX 和 AX 表示的32位数除以源操作数,得到的16位商放在 AX 中,16位余数放在 DX 中
16位: AX 表示的16位数除以8位源操作数,得到的8位商放在 AL 中,16位余数放在 AH 中
② IDIV
IDIV 源操作数
有符号数除法(其余与 DIV 一致)
32位:DX 和 AX 表示的32位数除以源操作数,得到的16位商放在 AX 中,16位余数放在 DX 中
16位: AX 表示的16位数除以8位源操作数,得到的8位商放在 AL 中,16位余数放在 AH 中
③ CBW
CBW
将字节扩展成字的指令,即将 AL 寄存器的符号位拓展到 AH 中
④ CWD
CWD
将 AX 中的被除数拓展成双字,即把 AX 寄存器中的符号位拓展到 DX 中
注意:
BCD 码 分为 组合式BCD码(1个字节两位) 和 分离式BCD码(1个字节一位)(分离式BCD码也称ASCLL码,高四位不用)
----------------------加减调整------------------------
原理:
----------------------乘除调整------------------------
AAM
将二进制乘法运算中间结果调整成以分离式表示的BCD码乘积,积的高位存放在 AH 中,低位存放在 AL 中
AAD
将 AH 及 AL 中二位分离式BCD码调整为二进制数并存入 AL 中 以便进行二进制除法运算。
注意:
按位与——AND
AND 目的操作数,源操作数.
按位或——OR
OR 目的操作数,源操作数
按位非——NOT
NOT 目的操作数
按位异或——XOR
XOR 目的操作数,源操作数
测试与——TEST
TEST 目的操作数,源操作数
将目的操作数和源操作数按位进行“与”运算,结果不保留,仅改变标志位(SF,ZF,PF)。
注意:
非循环移位指令
SAL 目的操作数,计数值 ;算术左移,最低位补0,最高位移入 CF
SHL 目的操作数,计数值 ;逻辑左移,和算术左移一样
SAR 目的操作数,计数值 ;算术右移,最高位保持不变并依次右移,最低位移入 CF
SHR 目的操作数,计数值 ;逻辑右移,最高位补0,向右移,最低位进入 CF
注意:
循环移位指令
ROL 目的操作数,计数值 ;不带进位的循环左移指令,每移一次,最高位进入最低位和 CF 位
ROR 目的操作数,计数值 ;不带进位的循环右移指令,每移一次,最低位进入最高位和 CF 位
RCL 目的操作数,计数值 ;带进位标志的循环左移指令,最高位进入CF,原CF进入最低位
RCR 目的操作数,计数值 ;带进位标志的循环右移指令,最低位进入CF,原CF进入最高位
注意:
REP
REP 串操作指令
重复串操作指令,直到 CX=0 停止
REPE 或 REPZ(含义相同)
重复串操作指令,直到 CX=0 或 ZF=0 停止
REPNE 或 REPNZ(含义相同)
重复串操作指令,直到 CX=0 或 ZF=1 停止
字符串传送指令
MOVSB
目的操作数( ES:DI)的数据按字节传至源操作数( DS:SI ),DF决定方向
MOVSW
目的操作数( ES:DI)的数据按字传至源操作数( DS:SI ),DF决定方向
注意:
字符串比较指令
CMPSB
目的操作数( ES:DI)的数据按字节与源操作数( DS:SI )的数据相比较,DF决定方向
CMPSW
目的操作数( ES:DI)的数据按字与源操作数( DS:SI )的数据相比较,DF决定方向
注意:
字符串检索指令
SCASB ;将AL中的字节与ES:DI字节相比较,DF决定方向
SCASW;将AX中的字与ES:DI字相比较,DF决定方向
这两条指令都是通过影响 标志位 AF,CF,OF,PF,SF,ZF 来反映结果的
取字符串指令
LODSB;将DS:SI中的字节放到AL,DF决定方向
LODSW;将DS:SI中的字放到AX,DF决定方向
存字符串指令
STOSB ;将 AL 中的数存到 ES:DI 中,DF决定方向
STOSW;将 AX 中的数存到 ES:DI 中,DF决定方向
JMP 目的地址
① 简单条件跳转指令
② 带符号数条件跳转指令(与CMP配合使用?)
③ 无符号数条件跳转指令(与CMP配合使用?)
注意: