计算机组成原理与汇编语言实验指导书
- 1 -
计算机组成原理与汇编语言实验指导书
第二章 80X86指令系统 2.1数据传送指令的使用
一、数据传送指令概述
负责把数据、地址或立即数传送到寄存器、存储单元以及I/O端口,或从内存单元、I/O端口中读取数据。可以分为下面几类:
1. 通用传送指令: MOV,PUSH,POP,XCHG,XLAT 2. 输入输出指令指令: IN,OUT
3. 目的地址传送指令: LEA,LDS,LES
4. 标志位传送指令: LAHF,SAHF,PUSHF,POPF
注意:除 SAHF和POPF指令外,所有指令对标志寄存器没有影响。
二、数据传送指令详解
1. 通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数指令。用于在内存单元、寄存器、立即数之间进行数据传送。 ★ MOV 传送指令
格式:MOV dest,src
功能:把一个字节(B)或一个字(W)由源操作数src传送至目的操作数dest。 说明:
(1) 不能直接在两个内存单元之间进行数据传递;
MOV MEM2, MEM1
;错
MOV AX, MEM1 ;对 MOV MEM2, AX
(2) 立即数不能直接送入段寄存器中;
MOV DS, 2000 MOV AX, 2000
;错 ;对
MOV DS, AX
(3) 不能直接在段寄存器之间的传送数据;
MOV ES, DS MOV AX, DS
;错 ;对
MOV ES, AX
(4) CS和IP不能作为目标操作数,可以作为源操作数;
MOV CS,AX ;错
MOV AX,CS MOV IP, AX MOV AX,IP
★ PUSH入栈指令 格式:PUSH src
功能:把一个字从源操作数src压入由SP指向堆栈顶部。同时SP=SP-2。
- 2 -
;对 ;错 ;错
计算机组成原理与汇编语言实验指导书
说明:
(1) PUSH入栈指令可以使用的源操作数src有:寄存器(通用寄存器,地址指
针,变址寄存器,段寄存器,存储器。
PUSH PUSH
CS IP
; 可以,但是实际不要使用 ;错
(2) PUSH的操作数必须为一个字。字的低字节压入堆栈的低地址,高字节压入
堆栈的高地址中;
PUSH AX ;把寄存器AL和AH中内容分别放在SP和SP+1指向的堆栈空间中。
★ POP出栈指令 格式:POP dest
功能:把当前SP所指向堆栈顶部的一个字弹出送入指定的目的操作数,同时SP=SP+2。 说明:
(1) POP出栈指令可以使用的目的操作数dest有:寄存器(通用寄存器,地址
指针,变址寄存器,段寄存器CS除外),存储器。
POP
CS
;可以,但是实际不要使用
POP IP ;错
(2) POP的操作数必须为一个字。堆栈弹出的低地址内容放入操作数的低字节,
高地址内容放入操作数高字节中; POP AX ;把SP和SP+1指向的堆栈空间中内容弹出放到寄存器AL和AH中。
★ XCHG 交换指令
格式:XCHG dest , src
功能:把一个字节或一个字的源操作数与目的操作数进行交换。 说明:
(1) 寄存器之间、寄存器和存储器之间进行交换,不能在两个存储器之间进行交
换,两个操作数中必须有一个为寄存器操作数;
XCHG BL, DL ;对
XCHG AX, SI ;对 XCHG COUNT[DI], AX ;对
(2) 段寄存器不能作为一个操作数;
XCHG [BX],[DI] XCHG DS, AX
★ XLAT 换码指令
格式:XLAT str_table
;错 ;错
或 XLAT
功能:把DS: (BX+AL)内存单元中的内容取出送入AL寄存器中。 说明:
(1)XLAT指令使用方法:
? 先建立一个字节表格;
- 3 -
计算机组成原理与汇编语言实验指导书
? 表格第一个字节偏移地址存入str_table送入BX寄存器;
? 需要转换代码的序号(相对于表格首地址位移量)存入AL;(表中第一个
元素的序号为0) ? 执行XLAT指令后,表中指定序号的元素存于AL中。(AL)为转换的代码。 (2)默认寄存器:
? BX:存放表格第一个字节偏移地址
? AL:使用XLAT指令前,存放相对于表格首字节的位移偏移量;使用XLAT
指令后,存放表格中指定的字节的内容; (3)内存的数据段中有一十六进制数字的ASCII码表。首地址为:Hex_table ,欲查
出元素?A‘的ASCII码;
MOV BX,OFFSET Hex_table MOV AL,0AH
XLAT Hex_table
程序运行后,AL寄存器中的内容为41H。
2. 输入输出指令用于在寄存器和外设端口之间进行数据交换,无论接受还是发送数据,必须通过累加器AX(字)或AL(字节),又称累加器专用传送指令。输入输出指令有两种使用格式:长格式和短格式。若需要访问的端口号小于256,则端口号可以以立即数形式写在指令中,此格式称为长格式;若需要访问的端口号大于等于256,则端口号应先放在DX寄存器中,此格式称为短格式。 ★ IN 输入指令
格式: IN AL, data8
IN AL, DX IN AX, DX
;端口地址8位,输入一个字节 ;端口地址8位,输入一个字
IN AX, data8
;端口地址16位,输入一个字节 ;端口地址16位,输入一个字
功能:用于CPU从外设端口接受数据。 说明: (1) (2)
一个端口号只能存放一个字节数据;一个字数据应存放在2个端口中,高地址端口存放高位字节,底地址端口存放低为位字节;
把(29H)(28H)端口中数据(字数据,29H中是高8位)送入字变量(DATA_WORD)中。 IN AX,28H MOV DATA_WORD,AX
★ OUT 输出指令
格式: OUT data8, AL ; 端口地址8位,输出一个字节
OUT data8, AX ;端口地址8位,输出一个字 OUT DX, AL ;端口地址16位,输出一个字节
AX ;端口地址16位,输出一个字
OUT DX,
功能:用于CPU向外设端口发送数据。
说明: (1)
参见IN指令说明;
- 4 -
计算机组成原理与汇编语言实验指导书
(2)把(AX)中的字数据送入05H和06H端口中。 OUT 5,AL
3. 目的地址传送指令用于获取操作数的地址信息 ★ LEA
格式:LEA reg16 , mem16
功能:把指令中指定的存储器操作数有效地址装入指定的寄存器 。 说明:
(1) LEA指令中的目标寄存器必须是16位的通用寄存器,源操作数必须是一个存储器。
(2) LEA 指令与MOV 的区别: LEA BX , BUFFER ;把BUFFER指向内存单元的有效地址送BX寄存器
MOV BX , BUFFER ;把BUFFER指向内存单元中的内容送BX寄存器
LEA 指令与MOV等价 LEA BX , BUFFER ;把BUFFER指向内存单元的有效地址送BX寄存器
MOV BX , OFFSET BUFFER ; 同上 ★ LDS
格式:LDS reg16, mem32
功能:将指令指定mem32内存单元中的前两个单元内容(16位偏移量)装入指令指定通用寄存器reg16,把后两个单元内容(段地址) 装入到DS段寄存器。 说明:
(1)LDS默认规定把mem32指向的后两个内存单元中的内容放入DS寄存器中。Reg16一般使用SI寄存器。 ★ LES
格式:LES reg16, mem32
功能:将指令指定mem32内存单元中的前两个单元内容(16位偏移量)装入指令指定通用寄存器reg16,把后两个单元内容(段地址) 装入到ES段寄存器。 说明:
(1)LES默认规定把mem32指向的后两个内存单元中的内容放入ES寄存器中。Reg16一般使用DI寄存器。
4. 标志传送指令用于完成和标志寄存器相关的操作,采用了隐含寄存器(AH、PSW)规定操作数方式,LAHF、PUSHF不影响标志位,SAHF、POPF由装入的值确定标志位的值, 即影响标志位。 ★ LAHF 格式:LAHF
功能:标志寄存器低八位低8位送入AH寄存器中。 说明:
(1)默认规定了AH寄存器和标志寄存器PSW的低8位;
- 5 -