第4章 指令系统(二) - 图文 下载本文

执行的操作:(DST)←(DST)∧(SRC) (2) OR(or)逻辑或指令 格式:OR DST,SRC 执行的操作:(DST)←(DST)∨(SRC) (3) NOT(not)逻辑非指令 格式:NOT DPR 执行的操作:(OPR)←(OPR) (4) XOR(exclusive or)异或指令 格式:XOR DST,SRC 执行的操作:(DST)←(DST)∨(SRC) (5) TEST(test)测试指令 格式:TEST OPR1,OPR2 执行的操作:(OPR1)∧(OPR2) 两个操作数相与的结果不保存,只根据其特征置条件码。 以上五种指令中,NOT不允许使用立即数,其它4条指令除非源操作数是立即数,至少有一个操作数必须存放在寄存器中,另一个操作数则可以使用任意寻址方式。它们对标志位的影响情况是:NOT指令不影响标志位,其它4种指令将使CF和OF为0,AF位无定义,而SF、ZF和PF则根据运算结果设置。 2.移位指令 (1)SHL(shift logical left)逻辑左移指令 格式:SHL OPR,CNT 其中OPR可以是除立即数以外的任何寻址方式。移位次数由CNT决定,CNT可以是1或CL。CNT为1时只移一位,如需要移位的次数大于1,则可以在该移位指令前把移位次数置于CL寄存器中,而移位指令中的CNT写为CL即可。有关OPR及CNT的规定适用于以下的移位指令。 (2)SAL(shift arithmetic left)算术左移指令 格式:SAL OPR,CNT 执行的操作:与SHL相同。 (3)SHR(shift logical right)逻辑右移指令 格式:SHR OPR,CNT 执行的操作:将(OPD)向右移动规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。 (4)SAR(shift arithmetic right)算术右移指令 格式:SAR OPR,CNT 执行的操作:将(OPD)向右移动指定的次数且最高位保持不变,CF的内容为最后移入位的值。即如原来是0则仍为0,原来是1则仍为1。 (5)ROL(Rotate left)循环左移指令 格式: ROL OPR,CNT 执行的操作:将目的操作数的最高位与最低位连接起来,组成一个环,将环中的所有位一起向左移规定的次数。CF的内容为最后移入的值。 (6)ROR(Rotate right)循环右移指令 格式:ROR OPR,CNT 执行的操作:该语句的移动方式完全同ROL,只是向右移动。 (7)RCL(Rotate left through carry)带进位循环左移指令

9

格式:RCL OPR,CNT 执行的操作:将目的操作数连同CF标识一起向左循环移动所规定的次数 (8)RCR RCL(Rotate left through carry)带进位循环右移指令 格式:RCR OPR,CNT 执行的操作:该指令的功能完全同RCL,只是向右移动。 所有移位指令都可以作字或字节操作.它们对条件码的影响是:CF位根据各条指令的规定设置。OF位只有当CNT=1时才是有效的,在移位后最高有效位的值发生变化时(原来为0,移位后为1;或原来为1,移位后为0)OF位置1,否则置0。循环移位指令不影响除CF和OF以外的其他条件标志。而移位指令则根据移位后的结果设置SF、ZF和PF位,AF位则无定义。 例4.3.14: 如(AX)=0012H,(BX)=0034H要求把它们装配在一起形成(AX)=1234H,可编制程序如下: MOV CL,8 ROL AX,CL ADD AX,BX 如指令执行前:(SI)=1450H;则指令执行后:(SI)=5140H,CF=0。 4.3.4 串处理指令 字符串处理指令有:MOVS(Move string)串传送、CMPS(Compatre string)串比较、SCAS(Scan string)串扫描、LODS(Load form string)从串取、STOS(Store in to string)存入串等五条。与上述基本指令配合使用的前缀有:REP(Repeat)重复、REPE/REPZ(Repeat while equal/zero)相等/为零则重复、REPE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复。 串处理指令处理存放在存储器里的数据串,所有串指令都可以处理字节或字。下面,我们分为两组来说明: 1.与REP相配合工作的MOVS,STOS和LODS指令 (1) REP重复串操作直到(CX)=0为止。 格式:REP string primitive 其中String Primitive可为MOVS,LODS或STOS指令。 执行的操作: 1) 如(CX)=0则退出REP,否则往下执行。 2) (CX)←(CX)-1 3) 执行其后的串指令 4) 重复(1)~(3) (2) MOVS 串传送指令 格式:可有三种 1)MOVS DST,SRC; 2)MOVSB(字节); 3)MOVSW(字) 其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如: MOVS ES:BYTE PTR[DI],DS∶[SI] 实际上MOVS的寻址方式是隐含的(这在下面所执行的操作中可以看到),所以这种格式中的DST及SRC只提供给汇编程序作类型检查,并且不允许用其他寻址方式来确定作数。 执行的操作: 1) ((DI))←((SI)) 2) 字节操作:(SI)←(SI)±1,(DI)←(DI)±1;当方向标志DF=0时用+,当方向标志DF=1时用-。 3) 字操作: (SI)←(SI)±2,(DI)←(DI)±2;当方向标志DF=0时用+,当方向标

10

志DF=1时用 - 。 该指令不影响条件码。MOVS指令可以把由(SI)指向的数据段中的一个字(或字节)传送到由(DI)指向的附加段中的一个字(或字节)中去,同时根据方向标志及数据格式(字或字节)对SI和DI进行修改。当该指令与前缀REP联用时,则可将数据段中的整串数据传送到附加段中去。这里源串必须在数据段中,目的串必须在附加段中,但源串允许使用段跨越前缀来修改。在与REP联用时还必须先把数据串的长度送到CX寄存器中,以便控制指令结束。因此在执行该指令前,应该先做好以下准备工作: 1) 把存放于数据段中的源串首地址(如反向传送则应是末地址)放入SI寄存器中; 2) 把将要存放数据串的附加段中的目的串首地址(或反向传送时的末地址)放入DI寄存器中; 3) 把数据串长度放入CX寄存器; 4) 建立方向标志,这里介绍两条指令。 在完成这些准备工作后就可使用串指令传送信息了。 为了建立方向标志,这里介绍两条指令。 ·CLD(Clear direction flag)该指令使DF=0,在执行串处理指令时可使地址自动增量; ·STD(Set direction flag)该指令使DF=1,在执行中处理指令可使地址自动减量。 例4.3.15: 在数据段中有一个字符串,其长度为17,要求把它们传送到附加段中的一个缓冲区中。编制程序如下图所示。其中SEGMENT,ENDS为定义段的伪操作,DB为定义字节数据的伪操作。存放在数据段中从符号地址MESSI开始的存储区内,每个字符占有一个字节;MESS2为目的串,存放在附加段中从符号地址MESS2开始空出17个字节的存储区内。后面的程序则存放代码段中。 DATAREA SEGMENT MESS1 DB ’PERSONAL COMPUTER $’ DATAREA ENDS EXTRA SEGMENT MESS2 DB 17 DUP(?) EXTRA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATAREA,ES:EXTRA START: MOV AX, DATAREA MOV DS, AX MOV AX, EXTRA MOV ES, AX LEA SI, MESS1 LEA DI, MESS2 MOV CX, 17 CLD REP MOVSB MOV AH, 4CH INT 21H CODE ENDS END START (3) STOS 存入串指令 格式:

11

1)STOS DST; 2)STOSB(字节); 3)STOSW(字) 执行的操作: 字节操作: ((DI))←(AL),(DI)←(DI)±1 字 操 作: ((DI))←(AX),(DI)←(DI)±2 该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容。当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中。上述有关串处理指令的特性也适用于STOS指令,该指令也不影响标志位。 (4) LODS 从串中取指令 格式:1)LODS SRC; 2)LODSB(字节); 3)LODSW(字) 执行的操作: 字节操作:((AL))←(SI),(SI)←(SI)±1 字 操 作: ((AX))←(SI),(SI)←(SI)±2 该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容。指令允许使用段跨越前缀来指定非数据段的存储区。该指令也不影响条件码。 2.与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令 (1) REPE/REPZ 当相等/为零时重复串操作 格式: REPE(或REPZ) String Primitive 其中String Primitive可为CMPS或SCAS指令。 执行的操作: 1) 如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行。 2) (CX)←(CX)-1; 3) 执行其后的串指令; 4) 重复1)~3)。 实际上REPE和REPZ是完全相同的,只是表达的方式不同而已,与REP相比,除满足(CX)=0的条件可结束操作外,还增加了ZF=0的条件。也就是说,只要两数相等就可继续比较,如果遇到两数不相等时可提前结束操作。 (2) REPNE/REPNZ 当不相等/不为零时重复串操作 格式:REPNE(或REPNZ) String Primitive 其中String Primtive可为CMPS和SCAS指令。 执行的操作:除退出条件为(CX)=0或ZF=1外,其他操作与REPE完全相同。也就是说,只要两数比较不相等,就可继续执行串处理指令,如某次两数比较相等或(CX)=0时,就可结束操作。 (3) CMPS 串比较指令 格式: 1)CMPS SRC,DST; 2)CMPSB(字节); 3)CMPSW(字) 执行的操作: 1) ((SI))-((DI)) 2) 字节操作:((SI))←(SI)±1,(SI)←(DI)±1 字操作: ((SI))←(SI)±2,(SI)←(DI)±2 指令把由(SI)指向的数据段中的一个字(或字节)由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果置条件码,指令的其他特性和MOVS指令的规定相同。 (4) SCAS 串扫描指令

12