汇编传送指令

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编传送指令

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

m8——一个8位存储器操作数单元(包括所有主存寻址方式)

m16——一个16位存储器操作数单元(包括所有主存寻址方式)

mem——代表m8或m16

i8——一个8位立即数

i16——一个16位立即数

imm——代表i8或i16

dest——目的操作数

src——源操作数

----------------------------------------------------------------------------------------------------------------------------

一、通用数据传送指令

1、传送指令MOV

格式:MOV dest,src ;dest←src

MOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。源操作数可以是立即数、寄存器或是主存单元,目的操作数可以是寄存器或主存单元,但不能是立即数。用约定的符号表达如下:

MOV reg/mem, imm ;立即数送寄存器或是存储器

MOV reg/mem/seg, reg ;寄存器送寄存器(包括段寄存器)或贮存

MOV reg/seg, mem ;主存送寄存器(包括段寄存器)

MOV reg/mem, seg ;段寄存器送主存或寄存器

特别说明:(1)立即数传送至通用寄存器(不包括段寄存器)或存储单元MOV reg/mem,imm

例:

mov al,4 ;al←4,字节传送

mov cx,0ffh ;cx←00ffh,字传送

mov byte ptr [si],0ah ;ds:[si]←0ah, byte ptr说明是字节操作

mov word ptr [si+2],0bh ;ds:[si+2]←0bh, word ptr 说明是字操作

绝大多数说操作数的指令中(除非特别说明)目的操作数与源操作数必须类型一致,或同为字节,或同为字,否则为非法指令。8086不允许立即数传送至段寄存器。

特别说明(2)8086指令系统除串操作类指令外,不允许两个操作数都是存储单元,所以也就没有主存至主存的数据传送。可以通过寄存器间接实现

。例:

mov ax,buffer1 ;ax←buffer1(将buffer1内容送ax)

mov buffer2,ax ;buffer2←ax

;buffer1、buffer2实际表示直接寻址方式

虽然存在通用寄存器和存储单元向CS段寄存器传送数据的指令,但却不允许执行。因为这样直接改变CS值,将引起程序执行混乱。如MOV CS,[SI]是不允许使用的指令

特别说明(3)段寄存器传送到通用寄存器(不包括段寄存器)或存储单元。例:mov [si],ds

mov ax,es

但是,不允许段寄存器之间的直接数据传送,如:MOV DS,ES是非法指令。

----------------------------------------------------------------------------------------------------------------------------

实践操作:数据块传送程序

例1:将以S1为其实地址的30个字符依次传送到同数据段的以S2为起始地址的一片字节存储单元里。

方法一:数据块是用DB定义的一个字符串S。用变址寄存器间接寻址方式访问S1和S2,即用[SI]表示S1中个字节的位移量,用[DI]表示S2中个字节的位移量。

完整程序:

NAME EX1-1

DATA SEGMENT

S1 DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123'

S2 DB 30 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE

START: MOV AX,DATA ;数据段寄存器的填充

MOV DS,AX ;

MOV SI,OFFSET S1 ;S1的位移量→SI

MOV DI OFFSET S2 ;S2的位移量→DI

MOV CX,30 ;循环次数30→CX

NEXT: MOV AX,[SI] ;([SI])→AL

MOV [DI],AX ;(AL)→[DI]

INC SI ;(SI)+1→SI

INC DI ;(DI)+1→DI

LOOP NEXT ;(CX)-1→CX,(CX)=0时循环结束

MOV AH,4CH ;程序结束

INT 21H ;返回系统

CODE ENDS

END START

方法二:用db定义30个字节的字符数据标的方法来定义的数据块s1。用变址+16位位移量的寄存器相对寻址方式(即s1[SI]和S2[SI])访问S1 和S2,即用[SI]表示距离S1(或S2)的起始地址的字节数(相对位移量),用16位的直接位移量S1(或S2)加上[SI]中的相对位移量,表示 S1或S2中的各字节的位移量(有效地址)。SI寄存器的取值应为0~29,每次循环SI加1。

完整程序:

NAME EX1-2

DATA SEGMENT

S1 DB 'ABCDEFGHIJKLMNOPQISTUVWXYZ0123'

S2 DB 30 DUP (?)

DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE

START: MOV AX,DATA

MOV DS,AX

MOV SI,0H

MOV CX,30

NEXT: MOV AL,S1[SI]

MOV S2[SI],AL

INC SI

LOOP NEXT

MOV AH,4CH

INT 21H

CODE ENDS

END START

方法三:数据块用DW伪指令定义15个字的数据表,每次分配两个字符。由于8086/8088微处理器是小端方式存储,为了等效一、二方法里用DB定义的字符串,数据必须写成:'BA','DC',…,'32'形式。采用相对基址变址寻址方式(即[BX+SI]和[BX+SI+30])来访问S1和S2中各字(S1、S2在内存分配上是相邻的)。将S1的起始地址[OFFSET S1]送至BX,用[SI]表示距离S1(或S2)的起始地址的字节数(相对位移量),且数据块传送时以字为单位,SI寄存器的取值为 0,2,...,28,循环15次。

完整程序:

NAME EX1-3

DATA SEGMENT

S1 DW

'BA','DC','FE','HG','JI','LK','NM','PO','RQ','TS','VU','XW','ZY','10 ','32'

S2 DW 15 DUP(?)

DATA ENDS

CODE SEGMENT

相关文档
最新文档