数据传送类指令
日期:2024-02-02 20:58:16   来源:数据传输类

  通用数据传送指令包含传送指令MOV、仓库操作指令PUSH、POP、输入/输出指令(累加器传送指令)、数据交流指令XCHG和查表转化指令XLAT。这类指令是仅有答应以段寄存器作为操作数的指令(XCHG在外)。

  8086/8088指令系统中有齐备的加、减、乘、除算术运算指令,能处理4种类型数据:无符号二进制数、带符号二进制数、无符号紧缩的十进制数和元符号非紧缩的十进制数。无符号二进制数和带符号二进制数的长度可所以8位或16位。带符号二进制数用补码表明,最高位为符号,所能表明的数值规模,8位时为—128—十127,16位时为-32768~+32767;无符号二进制数的表明规模,8位时为0~255,16位时为0~65535。若加/减运算的成果超出上述规模,对无符号二进制数,以Cf置位表明,即溢出也便是进位;而对带符号数,则以OF置位来表明,阐明运算呈现了溢出过错。

  指令功用:将源操作数OPS传送到意图操作数OPD,即(OPD)→(OPS)。

  源操作数OPS可所以8/16位的通用寄存器、段寄存器、存储器中某单元或8/16位的当即数。

  经过这些指令的履行,能够读出当时标志寄存器中的内容,也能够对标志寄存器设置新值。

  指令功用:把标志寄存器FR中SF,ZF,AF,PF和CF(8080和8085所具有的标志)别离送到AH中第7,6,4,2和0位,AH中第5,3,1位内容未定义,可任意,标志寄存器自身内容不变。

  指令功用:将累加器(AL/AX)中的内容输出传送到指定的I/O端口中。相同,当端口地址在00~FFH问,用直接方法,端口地址直接由指令中给出,当端口地址在0000~FFFFH间,用直接方法。先将端口地址放入DX中,然后在指令顶用Dx替代端口地址,即用直接方法表明。

  可见,LDS指令要求:OPD必定要是一个16位通用寄存器,常用SI寄存器。OPS所提

  供的必定要是一个存储器地址,且是一个地址指针,从指针所指示的地址单元开端,接连4个字节单元的内容别离送入OPD和DS中。

  指令功用:把整个标志寄存器的内容压入仓库,一起修正栈指针,即SP–2 → SP,该指令履行后不影响标志位。

  指令功用:POPF的功用正好与PUSHF相反,是将当时仓库指针SP所指的一个字传送到标志寄存器FR中,一起修正栈指针即SP+2 → SP。

  由上可知,IN指令有两种格局,当端口地址为00~FFH时用直接方法,端口地址值包含在指令中;当端口地址为0000~FFFFH时,用直接方法,即先将端口地址放在DX中,指令顶用DX替代端口地址。留意,这时指令的书写方法与寄存器寻址方法相似,但这儿其实便是间址方法。

  输入/输出数据传送指令简称I/O指令,共两条,一条是输入指令IN,另一条是输出指令OUT。I/O指令用来完结累加器AL/AX与I/O端口问的数据传送,指令中给出I/O端口的地址,当端口地址值≤255时,端口地址由指令中直接给出,当端口地址值≥256时用直接方法,先将端口地址方位于DX中,然后指令顶用DX作间址方法表明。因而,I/O指令有两种格局。

  8086/8088指令系统中有3条专门用于传送地址的指令:LEA、LDS和LES。可用来传送操作数的段地址或偏移地址。

  意图操作数OPD可所以16位通用寄存器、段寄存器或存储单元,但CS不能作意图操作数。

  和进栈指令不同的是,出栈操作时是先将数据弹出送入方针地址,然后修正栈指针,行将SP减2送SP,这时SP向高地址端移动,指向新的栈顶。

  指令功用:把一个字或字节的源操作数OPS与意图操作数OPD相互交流方位。

  PUSHF和POPF这两条指令用于人为地保存和康复标志寄存器,常用进程调用和中止服务程序的最初与结束,用来保存主程序的状况标志。

  这两条指令的另一个用处是用来改动盯梢单步标志TF,8086/8088指令系统中没有能直接改动TF的指令,若要改动TF,可先用PUSHF指令将标志寄存器压入仓库,然后设法改动栈顶单元中D8位(TF位),然后再用POPF指令把仓库中修正过的内容送回标志寄存器。这样,只需TF位被改动,其它标志位不变。

  为完成这一转化,首要应在内存数据段树立一个表格,表中寄存着十六进制数0,1,…,F的ASCII码,并将表格的首地址置于BX中,AL中置入所要查找的十六进制数距表头的位移量,比方现在要查找表中第5项内容,则AL中应置入4。完成上述操作的程序如下:

  指令功用:按源操作数OPS供给的寻址方法核算偏移地址(即EA),并将该偏移地址传送到意图操作数OPD所指示的16位寄存器中。

  留意:LEA指令中要求源操作数OPS所供给的有必要是一个存储器单元地址,而意图操作数OPD有必要是一个除段寄存器以外的16位寄存器。别的,运用LBA指令时应留意它与MOV指令的差异,MOV指令传送的是源操作数中的内容,而LEA指令传送的是源操作数的有用地址。

  指令功用:将源操作数OPS压入仓库,即SP–2 → SP,OPS →(SPH,SP)。

  源操作数0PS可所以16位通用寄存器、段寄存器或存储器中的数据字,以确保仓库按“字”操作。源操作数OPS不能是当即数。

  因为仓库是按“后进先出”方法作业,所以每次履行PUSH指令时,总是首要修正栈指针(SP)–2 → SP(即SP先减2),使之指向新栈顶,然后把源操作数压入仓库中SP所指示的方位,高字节在较高地址单元,低字节在较低地址单元中(线)SAHF AH送标志寄存器低字节指令

  指令功用:SAHF的功用与LAHF指令相反,是将AH中第7,6,4,2和0位状况传送至标志寄存器FR中的SF,ZF,AF,PF和CF位,替代这些标志位原内容,而OF,IF,TF,DF标志不受影响。可见,经过该指令能够对标志位进行从头设置,所以该指令也叫设置标志指令。

  因为仓库总是按字操作,所以,SP总是指向字地址单元,仓库段基址由SS确认。仓库最大容量为64K。

  指令功用:将仓库中当时SP所指示的栈顶的一个字传送到指定的意图操作数OPD中,一起修正栈指针,即(SP+1,SP)→ OPD,(SP)+2 → SP,出栈操作是进栈操作的逆进程。

  该指令履行时是把从源操作数OPS所指示的接连4个字节(双字)存储器单元中的操作数送到意图寄存器OPD和DS中,其间低位地址的两个字节传送到OPD指示的寄存器中,高位地址的两个字节传送到段寄存器DS中。

  源操作数OPS可为通用寄存器或存储器,意图操作数OPD只能为通用寄存器。因而,交流指令能够在通用寄存器之间、通用寄存器与累加器之间、通用寄存器与存储器之间进行。段寄存器不能作为操作数。

  数据传送指令用于完成寄存器与存储器之间、寄存器之间、累加器AL/AX与I/O端口之间、当即数到寄存器或存储器之间的字节或字的传送。这类指令的一起特点是不影响标志寄存器的内容(SAHF,POPF在外)。仓库操作指令、标志位传送指令和地址传送指令也归入这一类中,共14条指令,又可分为4组,如表3.4所示。

  指令功用:将端口地址中的8位或16位数传送到AL或AX中,将端口中的16位数输入时,先将指定端口中的字节数送入AL中,再将端口地址+1,然后将该端口中的字节数送入AH中。

  指令功用:将[BX]为首址,[AL]为位移量的字节存储器单元中的数据→ AL,即[BX+AL] → AL。

  查表转化指令XLAT可用来将一种代码转化成另一种代码,或者说可使累加器中的一个值变换为内存表格中的某一个值。详细完成是这样的:

  运用XLAT指令之前有必要先在内存(数据段)中树立一个表格,表格的内容便是所需求转化的代码,表格最多不超越256个字节,将表格的开始地址事前装入BX寄存器中,AL中寄存所要查找的目标(表中某一项)到表首地址间的位移量。履行XLAT指令时,就将BX中的内容和AL中的内容相加作为有用地址,将表格中与该地址相对应的单元中的内容取出并传送到AL中。也便是说,指令履行后所要查找的目标(即转化后的代码)就在AL中,BX中内容坚持不变。可见,只需改动AL的值即可从表中找到不同的代码。

  LES指令功用与LDS相似,所不同的是将OPS所指示的4个接连单元中的后两个字节(高地址)单元中的内容送入附加数据段寄存器ES中而不是送入DS,前两个字节(低地址)单元中的内容送OPD所指示的16位寄存器中。

  标志位传送指令共有4条:LAHF(标志装入AH)、SAHF(AH的内容存入标志寄存器)、PUSHF(标志压入仓库)和POPF(标志出栈)。这些都是单字节指令,指令的操作数是隐含的,因而这些指令都是无操作数指令。