0%

8086指令基础 - 数据传送类指令

最近在学习 16位汇编编程,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习汇编开发的童鞋们提供一份参考。

运行环境:

  • 操作系统: Windows 10家庭版
  • 编译器:Windows XP Debug

数据传送指令

本篇重点指令为:MOV XCHG XLAT PUSH POP LEA

帮助

在学习汇编指令之前,我们先下载一个手册,下载地址:[链接:](https://pan.baidu.com/s/1uSaKwezcqaRdukYypCgfPg 提取码:dwqv )

在XP的机器中是可以直接打开的,如果无法打开,先运行winhlp32.exe,然后打开指令.hlp

指令操作数的表达包括以下:

  • r8–任意一个8位通用寄存器
    • AH AL BH BL CH CL DH DL
  • r16–任意一个16位通用寄存器
    • AX BX CX DX SI DI BP SP
  • reg–代表r8或r16
  • seg–段寄存器
    • CS DS ES SS
  • i8–一个8位立即数
  • i16–一个16位立即数
  • imn–代表i8或i16
  • dest–目的操作数
  • src–源操作数

通用数据传送指令

数据传送指令mov

1
2
3
4
MOV reg/mem,imm
MOV reg/mem/seg,reg
MOV reg/seg,mem
MOV reg/mem,seg

demo:

1
2
3
4
5
6
7
8
9
10
11
12
mov al,4                ;al<--4,字节传送
mov cx,0ffh ;cx<--00ffh,字传送
mov si,200h ;si<--0200h, 字传送
mov byte ptr [si],0ah ;byte ptr 说明是字节操作
mov word ptr [si+2],0bh ;word ptr 说明是字操作
mov ax,bx ;ax<--,字传送
mov ah,al ;ah<--,字节操作
mov ds,ax ;ds<--ax,字传送
mov [si],al ;[si]<--al,字节传送
mov al,[bx]
mov dx,[bp] ;dx<--ss:[bp]
mov es,[si] ;es<--ds:[si]

不存在存储器向存储器的传送指令

  • 非法传送种种
    • 两个操作数的类型不一致
    • 两个操作数不能都是存储器
    • 段寄存器的操作有一些限制

交换指令XCHG

  • 寄存器与寄存器之间对换数据
  • 寄存器与存储器之间对换数据
  • 不能在存储器与存储器之间对换数据
1
2
XCHG reg,reg/mem
;reg  reg/mem

换码指令XLAT

将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL

1
XLAT    ;al←ds:[bx+al]

demo;

1
2
3
mov bx,100h
mov al,03h
xlat

堆栈操作指令

  • 堆栈是一个”先进后出”的主存区域,位于堆栈段中;SS段寄存器记录其段地址
  • 堆栈只有一个出口,即当前栈顶,用堆栈指针寄存器SP指定
  • 栈顶是地址较小的一段(低地址位置),栈底不变

1
2
3
4
5
6
7
PUSH r16/m16/seg
;SP←SP-2
;SS:[SP]←r16/m16/seg

POP r16/m16/seg
;r16/m16/seg←SS:[SP]
;SP←SP+2

标志寄存器操作

标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作

1
2
低8位传送:LAHF和SAHF
16位传送:PUSHF和POPF

LAHF

LAHF指令将标志寄存器的低字节送寄存器AH
SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意

SAHF

1
;FLAGS的低字节←AH

SAHF将AH寄存器内容送FLAGS的低字节
用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

PUSHF

1
2
;SP←SP-2
;SS:[SP]←FLAGS

PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2

POPF

1
2
;FLAGS←SS:[SP]
;SP←SP+2

POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2

地址传送指令

LEA

1
2
LEA r16,mem
;r16←mem的有效地址EA

LDS

1
2
3
LDS r16,mem
;r16←mem,
;DS←mem+2

LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器

LES

1
2
3
LES r16,mem
;r16←mem,
;ES←mem+2

LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器

输入输出指令

8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址

输入输出寻址方式

  • 直接寻址:只用于寻址00H~FFH前256个端口,操作数i8表示端口号
  • 间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号对大于FFH的端口只能采用间接寻址方式

输入指令IN

将外设数据传给CPU内部的AL/AX。

1
2
3
4
5
6
7
8
IN AL,i8
;字节输入:AL←I/O端口(i8直接寻址)
IN AL,DX
;字节输入:AL←I/O端口(DX间接寻址)
IN AX,i8
;字输入:AX←I/O端口(i8直接寻址)
IN AX,DX
;字输入:AX←I/O端口(DX间接寻址)

输出指令OUT

1
2
3
4
5
6
7
8
OUT i8,AL
;字节输出:I/O端口←AL(i8直接寻址)
OUT DX,AL
;字节输出:I/O端口←AL(DX间接寻址)
OUT i8,AX
;字输出:I/O端口←AX(i8直接寻址)
OUT DX,AX
;字输出:I/O端口←AX(DX间接寻址)