首页 理论教育 微型计算机原理中的数据传送指令

微型计算机原理中的数据传送指令

时间:2023-11-03 理论教育 版权反馈
【摘要】:数据传送指令用来把数据、地址或立即数传送到寄存器或存储单元中。此外,也不允许在两个段寄存器之间直接传送信息。POP指令执行时,将SP所指向的栈顶数据传送到目的地址,然后SP增2,指向新的栈顶地址。此时机器指令用二个字节表示,第二个字节就是端口号。

微型计算机原理中的数据传送指令

数据传送指令用来把数据、地址或立即数传送到寄存器或存储单元中。数据传送指令可以分为四类:通用数据传送指令、累加器专用数据传送指令、地址传送指令以及标志寄存器专用传送指令。

1.通用数据传送指令

通用数据传送指令主要有MOV、PUSH、POP、XCHG几种。

●MOV

格式:MOV dst,src

执行的操作:(dst)←(src)

其中,dst表示目的操作数,src表示源操作数。

MOV指令负责将源操作数(字节或字)传送到目的地址。其机器语言可以有7种格式:

MOV mem/regl,mem/reg2

MOV reg,data

MOV ac,mem

MOV mem,ac

MOV segreg,mem/reg

MOV mem/reg,segreg

MOV mem/reg,data

以上七种格式,说明MOV指令可以在CPU内或CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意,立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。但是MOV指令的目的操作数不允许用立即数方式,也不允许用CS寄存器,而且除源操作数为立即数的情况外,两个操作数中必须有一个是寄存器。也就是说,不允许用MOV指令在两个存储单元之间直接传送数据。此外,也不允许在两个段寄存器之间直接传送信息。

MOV指令不影响标志位。

●PUSH

格式:PUSH src

执行的操作:978-7-111-46342-9-Chapter03-36.jpg

●POP

格式:POP dst

执行的操作:978-7-111-46342-9-Chapter03-37.jpg

PUSH和POP是堆栈的进栈和出栈指令,分别用于将数据存入堆栈和从堆栈中取出数据。堆栈是以“后进先出”方式工作的一个存储区,它必须存在于堆栈段中,因而其段地址存放于SS寄存器中。堆栈只有一个出入口,所以只有一个堆栈指针寄存器SP,SP的内容在任何时候都指向当前的栈顶,所以PUSH和POP指令都必须根据当前SP的内容来确定进栈或出栈的存储单元,而且必须及时修改指针,以保证SP指向当前的栈顶。在基于X86系列微处理器的微机中,堆栈的存取必须以字为单位,所以PUSH和POP指令只能作字操作。它们可以使用除立即数以外的其他寻址方式。指令也可以指定段寄存器作为操作数,但POP指令不允许用CS寄存器。

PUSH指令执行时SP先被减2,然后将数据压入SP指向的字单元,存储的方法同样是高8位放在高地址字节,低8位放在低地址字节(即低位在前)。POP指令执行时,将SP所指向的栈顶数据传送到目的地址,然后SP增2,指向新的栈顶地址。PUSH和POP指令通常用于暂存某些数据和取出暂存的数据,尤其是在过程调用、中断服务等的实现中被广泛使用。

PUSH和POP指令不影响标志位。

●XCHG

格式:XCHG opr1,opr2

执行的操作:978-7-111-46342-9-Chapter03-38.jpg

XCHG指令交换给定的两个操作数。该指令的两个操作数中必须有一个在寄存器中,因此它可以在寄存器之间或者在寄存器和存储器之间交换信息。XCHG指令的操作数不能使用段寄存器,也不允许使用立即数。指令允许字或字节操作,但两个操作数的长度必须相同,也就是说必须同为字节或同为字。

XCHG指令不影响标志位。

2.累加器专用传送指令

累加器专用传送指令只限于使用累加器(AX或AL)传送信息,主要有IN、OUT和XLAT几种,其中IN和OUT是8086微处理器唯一能够用来与I/O端口进行数据交换的指令。

●IN

长格式为:IN AL,port(字节)

IN AX,port(字)

执行的操作:(AL)←(port)(字节)

(AX)←(port+1,port)(字)

短格式为:IN AL,DX(字节)

IN AX,DX(字)

执行的操作:(AL)←((DX))(字节)

(AX)←((DX)+1,(DX))(字)

●OUT

长格式为:OUT port,AL(字节)

OUT port,AX(字)

执行的操作:(port)←(AL)(字节)

(port+1,port)←(AX)(字)

短格式为:OUT DX,AL(字节)

OUT DX,AX(字)

执行的操作:((DX))←(AL)(字节)

((DX)+1,(DX))←(AX)(字)

在基于X86微处理器的微机中,所有I/O端口具有独立的地址空间,它们与CPU之间的通信都由IN和OUT指令来完成。其中IN完成从I/O端口到CPU的信息传送,而OUT完成从CPU到I/O端口的信息传送。CPU只能用累加器(AL或AX)接收或发送信息。外围设备最多可有65536个I/O端口,端口号(即外设的端口地址)为0000到FFFFH。其中前256个端口(0到FFH)称为固定端口,可以直接在指令中指定,这就是长格式中的port。此时机器指令用二个字节表示,第二个字节就是端口号。所以用长格式时可以在指令中直接指定端口号,但只限于外设的前256个端口。当端口号逸256时,称为可变端口。对可变端口的访问只能使用短格式,此时,必须先将端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息。必须注意,这里的端口号或DX的内容均为地址,而传送的是端口中的信息,而且在用短格式时DX的内容就是端口号本身,不需要由任何段寄存器来修改它的值。

IN和OUT指令提供了字和字节两种使用方式,选用哪一种,则取决于外设端口宽度。如端口宽度只有8位则只能用字节指令传送信息。

例如:

IN AX,28H

MOV DATA_WORD,AX

这两条指令把端口28H的一个字经过AX传送到存储单元DATA_WORD中。

MOV DX,3FCH

IN AX,DX

从端口03FCH送一个字到AX寄存器。

OUT 5,AL

从AL寄存器输出一个字节到端口5。(www.xing528.com)

在基于X86系列微处理器的微机中,由于外围设备的单独编址,IN和OUT指令是微处理器和外围设备进行通信的唯一手段。在本书中,我们会经常使用这两条指令。

●XLAT

格式为:XLAT opr

或 XLAT

执行的操作:(AL)←((DS)×16+(BX)+(AL))

在汇编程序中,经常需要把一种代码转换为另一种代码,例如把字符的扫描码转换成ASCⅡ码或者把数字0~9转换成7段数码管所需要的相应代码等,XLAT就是为这种用途所设置的指令。在使用这条指令以前,应先建立一个长度不超过256字节的字节表格,表格的首地址提前存入BX寄存器,需要转换的代码应该是相对于表格首地址的位移量此位移量也提前存放在AL寄存器中,表格的内容则是所要换取的代码,该指令执行后就可在AL中得到转换后的代码。该指令可用XLAT或XLAT opr两种格式中的任一种,使用XLAT opr时,opr为表格的首地址(一般为符号地址),但在这里的opr只是为提高程序的可读性而设置的,指令执行时只使用预先已存入BX中的表格首地址,而并不用汇编格式中指定的值。

XLAT指令不影响标志位。

下面是XLAT指令的一个例子:

MOV BX,OFFSET TABLE

MOV AL,1

XLAT TABLE

这段程序就是将数字0~9转换成7段数码管所需要相应代码的程序段,执行后,AL将被赋予TABLE标号所指表格中第二个表项的值,即为06H,对应于1这个数字在7段数码管上显示所需要的显示代码。

3.地址传送指令

地址传送指令负责完成把地址送到指定寄存器的功能。主要有LEA、LDS、LES几种。

●LEA

格式:LEA reg,src

执行的操作:(reg)←src

LEA指令把源操作数的有效地址送到指定的寄存器中。例如:

LEA BX,[BX+SI+0F62H]

如指令执行前(BX)=0400H,(SI)=003CH,

则指令执行后(BX)=0400+003C+0F62=139EH

必须注意,在这里BX寄存器得到的是偏移地址而不是该存储单元的内容。结合OFF-SET伪操作符使用MOV指令也可以达到类似的目的,例如:

MOV BX,OFFSET DATA

但是,和LEA指令可以使用除了立即数和寄存器之外任何一种寻址方式不同,OFFSET伪操作符必须作用于简单变量或标号。这是因为OFFSET伪操作符和LEA指令的实现方式是不同的。OFFSET伪操作符是在汇编的时候就将标号的地址计算出来并作为一个立即数添到指令中,而在运行的时候这个立即数被直接装入对应的寄存器。也就是说,上面例子中的那条指令的源操作数采用的是立即数寻址。LEA指令则是在程序运行的时候按照指令中指定的寻址方式进行地址的计算,并将计算结果传送到指定的目的寄存器。由于使用立即数寻址方式的原因,OFFSET伪操作的运行速度要比LEA指令快得多,所以在能够使用OFFSET伪操作的情况下一般不选择使用LEA指令。

●LDS和LES

格式为:LDS reg,src

LES reg,src

执行的操作:(reg)←(src)

(DS)←(src+2)……LDS指令

(ES)←(src+2)……LES指令

LDS和LES两条指令用于把源操作数指定的4个相继字节送到由指令指定的寄存器及DS或ES寄存器中。它们通常被用于为串处理指令初始化DS:SI和ES:DI指针,所以LDS指令常指定SI寄存器,而LES指令常指定DI寄存器。

例:

LDS SI,10H

如指令执行前(DS)=C0000H,(C0010H)=0180H,(C0012H)=2000H,

则指令执行后(SI)=0180H,(DS)=2000H。

例:

LES DI,[BX]

如指令执行前(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H,

则指令执行后(DI)=05AEH,(ES)=4000H。

需要注意的是,LEA、LDS、LES三条指令指定的寄存器都不能使用段寄存器,且源操作数必须使用除立即数方式及寄存器方式以外的其他寻址方式。这三条指令不影响标志位。

4.标志寄存器传送指令

标志寄存器传送指令可以在标志寄存器和AH寄存器或堆栈之间实现标志位信息的传递,有4条指令:LAHF、SAHF、PUSHF和POPF。它们的格式与功能如下:

●LAHF

格式:LAHF

执行的操作:(AH)←(PSW的低字节)

将标志寄存器的低字节送到AH寄存器。

●SAHF

格式:SAHF

执行的操作:(PSW的低字节)←(AH)

将AH寄存器的内容送到标志寄存器的低字节。

●PUSHF

格式:PUSHF

执行的操作:(SP)←(SP)-2

((SP)+1,(SP))←(PSW)

将标志寄存器的内容入栈。

●POPF

格式:POPF

执行的操作:(PSW)←((SP)+1,(SP))

(SP)←(SP)+2

将栈顶的内容出栈并送到标志寄存器中。

这组指令中的LAHF和PUSHF不影响标志位。SAHF和POPF则由装入的值来确定标志位的值。PUSHF和POPF指令可以用于微处理器现场的保存和恢复,通常用于中断服务程序等场合。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈