第4章8086指令系统(下)本章内容提要4.1字符串操作指令4.2处理器控制类指令4.3程序控制类指令4.1字符串操作指令源串(源操作数)一般存放在当前数据段中,即寄存器DS中的内容为其段地址,寄存器SI中的内容为其偏移地址,因此,源串地址为DS:SI。目的串(目的操作数)一般存放在附加数据段ES中,即寄存器ES中的内容为其段地址,寄存器DI中的内容为其偏移地址,因此,目的串地址为ES:DI。若要使用重复前缀指令时,字符串的长度必须存放在CX寄存器中。每次执行字符串操作后,SI和DI中的内容会自动修改,从而指向下一个字节或字。SI和DI的修改方式取决于标志位DF的值,增减量的大小取决于操作数类型。4.1.1基本串操作指令1.串传送指令格式:MOVSB(字节串传送)或MOVSW(字串传送)或MOVSDST,SRC功能:将SI所指向的源串中的一个字节或字传送到DI所指向的目的串中。注:该指令对标志位无影响。2.串比较指令格式:CMPSB(字节串比较)或CMPSW(字串比较)或CMPSDST,SRC功能:将SI所指向的源串中的一个字节或字与DI所指向的目的串中的一个字节或字相减,不保存结果,只是根据结果设置标志位。注:受影响的标志位有:OF、SF、ZF、AF、PF和CF。1、串传送指令MOVS功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。即:①DS:[SI]→ES:[DI]。②当DF=0时,SI和DI自动增量;当DF=1时,SI和DI自动减量。MOVSB;字节串传送:ES:[DI]←DS:[SI];SI←SI±1,DI←DI±1演示MOVSW;字串传送:ES:[DI]←DS:[SI];SI←SI±2,DI←DI±2演示特殊性?内存操作数之间直接传送例:字节串传送例子。编写一程序段,将源数据串中的100个字节数据传送到目的串数据区中。设源数据串的首偏移地址为2000H,目的串的首偏移地址为5000Hmovsi,2000Hmovdi,5000Hmovcx,100;cx←传送次数cld;置DF=0,地址增加again:movsb;传送一个字节deccx;传送次数减1jnzagain;判断传送次数cx是否为0;不为0,则到again位置执行指令;否则,结束2、串比较指令CMPS功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。即:①([SI])-([DI])。②修改串指针,使之指向串中的下一个元素。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。CMPSB;字节串比较:DS:[SI]-ES:[DI];SI←SI±1,DI←DI±1CMPSW;字串比较:DS:[SI]-ES:[DI];SI←SI±2,DI←DI±2特殊性?例:字符串比较。对str1和str2两个字符串进行比较,若串相同,在result单元中置0,否则置-1movsi,offsetstr1movdi,offsetstr2movcx,countcldagain:cmpsb;比较两个字符jnzunmat;有不同字符,转移deccxjnzagain;进行下一个字符比较moval,0;字符串相等,设置00hjmpoutput;转向outputunmat:moval,0ffh;设置ffhoutput:movresult,al;输出结果标记Loopagain3.串扫描指令格式:SCASB(字节串扫描)或SCASW(字串扫描)或SCASDST功能:将寄存器AL(字节操作)或AX(字操作)中的内容与DI所指向的目的串中的一个字节或字相减,不保存结果,只是根据结果设置标志位。注:受影响的标志位有:OF、SF、ZF、AF、PF和CF。3、串扫描指令SCAS功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存。即:①字节操作:(AL)-([DI]),字操作:(AX)-([DI])②修改指针使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。SCASB;字节串扫描:AL-ES:[DI];DI←DI±1SCASW;字串扫描:AX-ES:[DI];DI←DI±2例:在字符串STRING中搜索字符“#”movdi,offsetstringmoval,‘#’movcx,countcldagain:scasbjzfounddeccxjnzagain...found:...4.串装入指令格式:LODSB(字节串装入)或LODSW(字串装入)或LODSSRC功能:将SI所指向的源串中的一个字节或字送入寄存器AL(字节操作)或AX(字操作)中。注:此指令对标志位无影响。5.串存储指令格式:STOSB(字节存储)或STOSW(字存储)或STOSDST功能:将寄存器AL(字节操作)或AX(字操作)中的一个字节或字存入DI所指向的目的串中。注:此指令对标志位无影响。┆STRDB'12345ABC'┆MOVAX,SEGSTRMOVDS,AXLEASI,STRMOVCX,8XORBX,BXXORAH,AHCLDAGAIN:LODSBADCBX,AXLOOPAGAIN┆例:编写一程序段,计算字符串“12345ABC”中各字符所对应的ASCII值之和。例:串存储指令应用。┆MOVAL,’#’MOVDI,100HMOVCX,200CLDAGAIN:STOSBLOOPAGAIN┆分析以上程序段的执行结果?实际编程时,常采用这种方法进行数据存储区的初始化4.1.2重复前缀指令使用重复前缀指令前,先要将字符串的长度装入CX寄存器,每执行一次基本串操作指令后,CX的值自动减1,直到CX=0。1.REP前缀格式:REP串操作指令功能:重复执行串操作指令,直到CX中的值为0时结束操作。3.REPNE/REPNZ前缀格式:REPNE/REPNZ串比较或串扫描指令功能:CX≠0且ZF=0(要比较的两个字节或字不相等或相减不为零)时重复执行串比较或串扫描指令;否则,结束操作。2.REPE/REPZ前缀格式:REPE/REPZ串比较或串扫描指令功能:CX≠0且ZF=1(要比较的两个字节或字相等或相减为零)时重复执行串比较或串扫描指令;否则,结束操作。注:重复前缀指令不能单独使用,后面必须跟基本串操作指令。重复前缀指令不影响标志位。【例4-1】将1000H:0200H地址开始的100个字节传送到2000H:1000H开始的存储单元中。程序段如下:MOVAX,1000HMOVDS,AX;设置源串段地址MOVAX,2000HMOVES,AX;设置目的串段地址MOVSI,0200H;设置源串偏移地址MOVDI,1000H;设置目的串偏移地址MOVCX,100;将串的长度送入CXCLD;将DF置为0,地址自动递增REPMOVSB;重复执行串传送指令,每次传送一个字节【例4-2】对附加段中从BUFF开始的100个连续的内存单元进行清0操作。程序段如下:LEADI,BUFF;将目的串的偏移地址送入DIMOVAL,00H;将0送入ALMOVCX,100;将串的长度送入CXCLD;将DF置为0,地址自动递增REPSTOSB;重复执行串存储指令,将100个连续的内存单元;清04.2处理器控制类指令4.2.1标志位操作指令注:对其他标志位无影响。4.2.2外部同步指令注:不影响标志位。实训4-1寻找字符串中指定字符在文章的每一段开头,一般要缩进几个空格。现有一个以空格开头的字符串,找出其中第一个非空格字符,并把其偏移地址存入指定内存单元ADDR中。首先,将字符串首地址送入DI,设置字符串操作方向,将字符串长度送入CX,并为ADDR设置初值。重复执行传扫描指令,直到找到第一个非空格字符,使DI指向第一个非空格字符,并将其偏移地址存入ADDR。若未找到非空格字符,则程序结束。源程序STRDB‘Thisisastring!$’;定义源字符串NUMEQU$-STR;NUM为字符串STR的长度LEADI,STR;将字符串的首地址送入DICLD;设置方向标志,使DF=0MOVCX,NUM;将字符串长度NUM送入CXMOVAL,20H;将空格字符的ASCII码送入ALMOVADDR,0FFFFH;将ADDR的初始值设为0FFFFHREPZSCASB;若当前字符是空格,则重复执行串扫;描指令JZEXIT;若全部是空格,则程序转移至EXITDECDI;使DI指向第一个非空格字符MOVADDR,DI;将第一个非空格字符的偏移地址存入;ADDREXIT:MOVAH,4CH;系统功能调用,结束程序返回DOSINT21H4.3程序控制类指令4.3.1无条件转移指令1.段内直接短转移格式:JMPSHORTOPR功能:操作数可以是目标地址的标号或指定一个8位的偏移量,转移范围为-128~127字节。指令执行后,CS的内容不变,IP的值(即JMP指令的下一条指令)与8位偏移量之和被赋于当前的IP。【例4-3】…JMPSHORTNEXTL:MOVAL,12H…NEXT:MOVCX,1234H…设标号L和NEXT之间的偏移量为08H。执行JMP指令后,IP的内容更新为1008H。2.段内直接近转移格式:JMPNEARPTROPR功能:操作数可以是目标地址的标号或指定一个16位的偏移量,转移范围为-32768~32767字节。指令执行后,CS的内容不变,IP的值(即JMP指令的下一条指令)与16位偏移量之和被赋于当前的IP。3.段内间接转移格式:JMPWORDPTROPR功能:指令中的操作数是16位寄存器或存储器单元,段内转移的偏移地址存放在16位寄存器或存储器中连续两个字节的存储单元中。指令执行后,CS的内容不变,寄存器中的内容或存储器中指定地址开始的连续两个字节单元的内容被赋于当前的IP。4.段间直接转移格式:JMPFARPTROPR功能:操作数可以是目标地址的标号,指令操作码后的连续两个字给出转移后的偏移地址(低16位)和段地址(高16位)。指令执行后,段地址和偏移地址分别被赋于当前的CS和IP,程序转移到另一个代码段中相应位置去执行。5.段间间接转移格式:JMPDWORDPTROPR功能:指令中的操作数是一个双字存储器单元,偏移地址和段地址分别存放在连续两个字的存储单元中。指令执行后,段地址(高16位)和偏移地址(低16位)分别被赋于当前的CS和IP,程序转移到另一个代码段中相应位置去执行。注:无条件转移指令对标志位无影响。4.3.2条件转移指令注:所有的条件转移指令都是短转移,即转移的目标地址必须在当前代码段内,偏移量的范围为﹣128~127字节。条件转移指令对标志位无影响。【例4-4】比较两个带符号数A和B的大小,把大数存入MAX单元。实现这个过程的程序段如下:MOVAX,A;将A存入AXMOVBX,B;将B存入BXCMPAX,BX;比较AX和BX的大小JGNEXT;AX大于BX时程序转移至NEXTMOVMAX,BX;AX小于或等于BX时,将BX的内容;送入MAX单元JMPEXIT;程序转移至EXITNEXT:MOVMAX,AX;AX大于BX时,将AX的内容送入MAX单元EXIT:…4.3.3循环控制指令循环控制指令使用CX寄存器作为循环计数器,因此,在使用循环指令前,必须先将循环次数存入CX中。每执行一次循环控制指令,CX中的值自动减1,然后对循环条件进行判断。注:循环控制指令是短转移,即转移的目标地址必须在当前代码段内,偏移量的范围为﹣128~127字节。循环指令对标志位无影响。【例4-5】将以BUFFER开始的100个内存单元都减去1,如果某个单元减1后为0则不再执行此操作。程序段如下:MOVDI,0;将DI的初始值设为0MOVCX,100;将字节数(循环次数)送入CXLOP:INCDI;地址指针加1DECBUFFER[