汇编-数据传送类指令
数据传送类指令
- 通用数据传送指令
- 输入输出指令
- 地址传送指令
- 标志传送指令
除标志传送指令外,其他指令的执行对标志位不产生影响
通用数据传送指令
-
一般数据传送指令
- 使用 \(MOV\) 的注意事项
- 两个操作数的字长必须相同
- 两个操作数不允许同时为存储器操作数
- 两个操作数不能同时为段寄存器
- 在源操作数是立即数的时候 ,目标操作数不能是段寄存器
- \(IP\) 和 \(CS\) 不作为目标操作数, \(FLAGS\) 一般也不作为操作数在指令中出现
\(MOV \ [BX][BP] , BX\) 是 错误的, 目标操作数两个都是基址,应为\([基址][变址]\)
- 使用 \(MOV\) 的注意事项
-
堆栈操作指令 \(PUSH\) \(POP\) 操作数必须是 16位 的 通用寄存器 和 存储器均可,存储器需要声明字长
-
交换指令 \(XCHG\) 操作数至少有一个是寄存器,如果是存储器操作数 必须声明字长
-
查表转换指令 \(XLAT\)
-
字位扩展指令
- 将符号数的符号位扩展到高位
- 指令为零操作数指令,采用隐含寻址,隐含的操作数为 \(AX\) 及 \(AX, DX\)
- 无符号数的扩展规则为在高位补零
- \(CBW\)
- 将 \(AL\) 的内容扩展到 \(AX\) 若最高位为 \(1\) 则执行后 \(AH = FFH\) 若最高位为 \(0\), 则执行后 \(AH = 00H\)
- \(CWD\)
- 将 \(AX\) 的内容扩展到 \(DX \ AX\) 若最高位为 \(1\) 则执行后 \(DX = FFFFH\) 若最高位为 \(0\), 则执行后 \(DX = 0000H\)
该类所有指令的执行都不影响标志位
输入输出指令
I/O端口:
I/O 接口中用于存储数据、可以直接被CPU访问的寄存器
计算机输入输出系统中可以包含若干接口控制电路(芯片),每个接口都包含了一个或者多个端口
输入输出指令
专门面向 I/O 端口操作的指令
端口地址在指令中的表示方式 寻址方式
指令功能: 从端口地址读入数据到累加器/将累加器的值输出到端口中
指令格式:
- 输入指令: \(IN \ acc, PORT\) (\(PORT\)是端口地址, \(acc\) 是 \(AL / AX\))
- 输出指令: \(OUT \ PORT, acc\)
指令寻址方式
根据端口地址码的长度,指令具有两种不同的端口地址表现形式
直接寻址
- 端口地址为 8位 时,指令中直接给出 8位 端口地址
- 寻址 256个 端口
间接寻址
- 端口地址为 16位 指令中的端口地址必须由DX 指定
- 可寻址 64K 个端口
地址传送指令
- 取偏移地址指令 \(LEA\) 取近地址指针
- \(*LDS\) 指令 取远地址指针
- \(*LES\) 指令 取远地址指针
LEA
操作
将变量的 16位 偏移地址写入到目标寄存器
当程序中用符号标志内存偏移地址的时,须使用该指令
格式
\(LEA \ REG,MEM\)
指令要求
源操作数 必须是一个 存储器操作数,目标操作数通常是间址寄存器
LDS LES指令
LDS 和 LES 均用于将一个 32位的远地址指针写入到目标寄存器
LDS 的一般格式
LDS 通用寄存器,存储操作数
将源操作数的偏移地址送到目标寄存器,将源操作数的段地址送到 ES
因此这个存储器操作数事实上是一个 32位 的操作数
LES 的一般格式
LES 通用寄存器,存储操作数
将源操作数的偏移地址送到目标寄存器,将原操作数的段地址送到 ES
标志传送指令
LAHF SAHF
隐含操作数 \(AH\)
LAHF : 将 \(FLAGS\) 的低八位装入 \(AH\)
SAHF : 将 \(AH\) 的内容写入 \(FLAGS\) 的低八位
PUSHF POPF
隐含操作数 \(FLAGS\)
能够表示偏移地址的寄存器只有四个 \(BX \ BP \ SI \ DI\)