数据传送类指令

  • 数据传送是计算机中最基本、最重要的一种操作
  • 传送指令也是最常使用的一类指令
  • 传送指令把数据从一个位置传送到另一个位置
  • 除标志寄存器传送指令外,均不影响标志位
  • 重点掌握 MOV XCHG XLAT PUSH POP LEA

通用数据传送指令

  • 提供方便灵活的通用传送操作
  • 有3条指令 MOV XCHG XLAT

传送指令MOV(move)

  • 把一个字节或字的操作数从源地址传送至目的地址
1
2
3
4
MOV reg/mem,imm ;立即数送寄存器或主存
MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存
MOV reg/seg,mem ;主存送(段)寄存器
MOV reg/mem,seg ;段寄存器送寄存器或主存

image-20240729175053620

image-20240729175437836

非法传送

  • 两个操作数的类型不一致
    • 例如源操作数是字节,而目的操作数是字;或相反
  • 两个操作数不能都是存储器
    • 传送指令很灵活,但主存之间的直接传送却不允许
  • 段寄存器的操作有一些限制
    • 段寄存器属专用寄存器,对他们的操作能力有限
两个操作数的类型要一致
  • 绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须一致,否则为非法指令

    1
    MOV AL,050AH ;非法指令:050Ah为字,而AL为字节
  • 寄存器有明确的字节或字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型

  • 对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型

两个操作数不能都是存储器
  • 8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种操作,可通过寄存器间接实现

image-20240729181820951

要小心段寄存器的操作
  • 不允许立即数传送给段寄存器

    1
    MOV DS,100H  ;非法指令:立即数不能传送段寄存器
  • 不允许直接改变CS值

    1
    MOV CS,[SI]  ;不允许使用的指令
  • 不允许段寄存器之间的直接数据传送

    1
    MOV DS,ES  ;非法指令:不允许段寄存器间传送

交换指令XCHG(exchage)

  • 把两个地方的数据进行互换

    image-20240729183124245

  • 寄存器与寄存器之间对换数据

  • 寄存器与存储器之间对换数据

  • 不能在存储器与存储器之间对换数据

1
2
3
4
;两数交换
mov ax,1
mov bx,2
xchg ax,bx

成功交换AH和BH的值

image-20240729182931159

换码指令XLAT(translate)

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

    image-20240729183557637

  • 换码指令执行前:

    在主存建立一个字节量表格,内含要转换的目的代码

    表格首地址存放于BX,AL存放相对表格首地址的位移量

  • 换码指令执行后:

    将AL寄存器的内容转换为目标代码

1
2
3
4
5
6
7
8
9
10
MyData segment             ;数据段
TABLE1 db 03,04,05,06
string db "Hello World$"
;path db "C:\1.txt",0
MyData ends


mov bx,TABLE1
mov al,1
XLAT

成功换码(在TABLE1中1对应的为04)

image-20240729184837159

image-20240729185031539

堆栈操作指令

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

image-20240729185526580

堆栈的特点

  • 堆栈操作的单位是字,进栈和出栈只对字量
  • 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节
  • 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据
  • 堆栈常用来
    • 临时存放数据
    • 传递参数
    • 保存和恢复寄存器

现场保护恢复

image-20240729191547502

1
2
3
4
5
6
7
8
9
10
11
12
13
mov ax,1
mov bx,2
xchg ax,bx

push bx
push cx

mov bx,offset TABLE1
mov al,1
XLAT

pop cx
pop bx

成功把BX、CX压入堆栈

image-20240729192505067

成功取出BX、CX,原来堆栈的值被改变

image-20240729192701590

标志寄存器传送指令

  • 标志寄存器传送指令用传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作
  • 有2对4条指令
    • 低8位传送:LAHF和SAHF
    • 16位传送:PUSHF和POPF

image-20240729201512669

image-20240729201540789

地址传送指令

  • 地址传送指令将存储单元的逻辑地址送至指定的寄存器
    • 有效地址传送指令LEA
    • 指针传送指令LDS和LES
  • 注意不是获取存储器单元的内容

有效地址传送指令LEA(load EA)

  • 将存储器操作数的有效地址传送至指定的16位寄存器中

image-20240729203440178

1
2
;地址传送
lea ax,word ptr [bx+8]

运行成功后AX的值为BX的值加8

image-20240729204306039

指针传送指令

image-20240729204518031

1
2
3
4
5
6
7
8
9
10
11
12
MyData2 segment
NUM2 dw 12h
MyData2 ends

mov ax,MyData2
push ax
mov ax,0
push ax
mov bp,sp
lds dx,[bp]
les dx,[bp]
add sp,4

运行完后DX的值为0000,DS的值为077D

image-20240729210024994

此时DS中存的就是MyData2的段基址

image-20240729210434950

输入输出指令

image-20240729210838608

输入输出寻址方式

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

输入指令IN

  • 将外设数据传送给CPU内的AL/AX

image-20240729211405863

输出指令OUT

  • 将CPU内的AL/AX数据传送给外设

image-20240729211607713

image-20240729211912131

image-20240729211838506

1
2
3
4
5
;输入输出指令 in out 端口号
in al,64h
in al,60h
out 60h,al
int 21h

image-20240729212537622

成功运行后会让你输入,如果输入a则AL会显示a的ASCII码

image-20240729212640971