8086指令系统之数据传送指令
- 前言
- 1.通用数据传送指令
- 一般传送指令MOV
- 指令格式
- 指令功能
- MOV指令可实现以下各种传送
- 堆栈操作指令PUSH和POP
- 压栈指令 PUSH
- 指令格式
- 执行过程
- 出栈指令 POP
- 指令格式
- 执行过程
- 交换指令XCHG
- 指令格式
- 指令功能
- 查表转换指令 XLAT
- 指令格式
- 指令功能
- 2.输入输出指令
- 指令格式
- 指令寻址方式
- 直接寻址
- 间接寻址
- 3.取偏移地址指令
- 指令格式
- 指令功能
- LEA与MOV的对比
- 4.其他传送指令
- 字节到字的扩展指令
- 指令格式
- 指令操作
- 指令规则
- 字到双字的扩展指令
- 指令格式
- 指令操作
- 指令规则
- 取远地址指针指令
- LDS
- 指令格式
- 指令功能
- LES
- 指令格式
- 指令功能
- 标志位操作指令
- LAHF,SAHF
- PUSHF,POPF
- 总结与升华
前言
本篇文章正式进入汇编语言,下面是要用到的一些符号:
- OPRD:泛指各种类型的操作数
- mem:存储器操作数
- acc:累加器操作数
- dest:目标操作数
- src:源操作数
- disp:8位或16位偏移量,可用符号地址表示
- DATA:8位或16位立即数
- port:输入输出端口,可用数字或表达式表示
- [ ]:表示存储器操作数,方括号中的内容表示数据的偏移地址
数据传送指令是实际程序中使用最为频繁的一类指令,因为无论什么样的程序都需要将原始数据、中间运算结果、最终结果及其他信息在CPU的寄存器和存储器之间进行传送。
绝大多数数据传送指令都不会对状态寄存器FLAGS产生影响。
数据传送指令按功能可分为四小类:
- 通用数据传送指令
- 目标地址传送指令
- 标志传送指令
- 输入输出指令
1.通用数据传送指令
通用数据传送指令包括一般传送指令MOV、堆栈操作指令PUSH和POP、交换指令XCHG、查表转换指令XLAT和字位拓展指令。
该类指令的执行对标志位不产生影响。
一般传送指令MOV
指令格式
MOV dest,src
- 两操作数字长必须相同;
- 两操作数不允许同时为存储器操作数;
- 两操作数不允许同时为段寄存器;
- 在源操作数是立即数时,目标操作数不能是段寄存器;
指令功能
这里的dest表示目标操作数,src表示源操作数。
指令的功能是将一个操作数从源地址传送到目标地址,而源地址中的数据保持不变。
也就是说,MOV指令实际上是完成了一次数据的复制。
MOV指令可实现以下各种传送
注:
- reg:寄存器
- mem:存储器
- sreg :段寄存器
- data :8或16立即数
堆栈操作指令PUSH和POP
堆栈是内存中一个特定的区域,用以存放寄存器或存储器中暂时不用又必须保存的数据。
在程序中,堆栈主要应用于子程序调用、中断响应等操作时的参数保护,也可用于实现参数传递。
压栈指令 PUSH
指令格式
格式: PUSH src
执行过程
在压入操作数之前,堆栈指针SP先减2:
出栈指令 POP
指令格式
格式: POP dest
执行过程
交换指令XCHG
指令格式
XCHG OPRD1,OPRD2
需要注意的是:
- 操作数可以是寄存器数或存储器数(但不能同时是存储器数,即必须有一个是寄存器数)
- 不允许使用段寄存器
- 两个操作数字长必须相同,可以字节/字交换
指令功能
交换指令的操作是将源地址与目标地址中的内容进行互换,即将源操作数送到目标操作数,同时将目标操作数传送到源操作数。
查表转换指令 XLAT
XLAT是一条字节的查表转换指令,可用根据表中元素的序号查出表中相应元素的内容
指令格式
XLAT ;AL <~ [BX+AL]
指令功能
将BX+AL所指单元的内容送AL(1个字节)
2.输入输出指令
输入输出(I/O)指令是专门面向输入输出端口进行读写的指令,共有两条,分别是IN和OUT。
指令格式
指令寻址方式
根据端口地址码的长度,指令具有两种不同的端口地址表现形式。
直接寻址
- 端口地址为8位时,指令中直接给出8位端口地址;
- 寻址256个端口。
间接寻址
- 端口地址为16位时,指令中的端口地址必须由DX指定;
- 可寻址64K个端口。
3.取偏移地址指令
指令格式
LEA REG,MEM
源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。
指令功能
将存储器操作数的16位偏移地址取出送目标寄存器
当程序中用符号地址表示内存偏移地址时,须使用该指令。
LEA与MOV的对比
4.其他传送指令
字节到字的扩展指令
指令格式
CBW
指令操作
将AL内容扩展到AX
指令规则
- 若AL最高位=1,则执行后AH=FFH
- 若AL最高位=0,则执行后AH=00H
字到双字的扩展指令
指令格式
CWD
指令操作
将AX内容扩展到DX AX
指令规则
- 若AX最高位=1,则执行后DX=FFFFH
- 若AX最高位=0,则执行后DX=0000H
取远地址指针指令
LDS
指令格式
LDS reg,MEM32
指令功能
将内存中连续4个字节内容送到DS和寄存器reg中。
LES
指令格式
LES reg,MEM32
指令功能
将内存中连续4个字节内容送到ES和寄存器reg中。
标志位操作指令
LAHF,SAHF
PUSHF,POPF
针对FLAGS的堆栈操作指令
将标志寄存器压栈或从堆栈弹出
总结与升华