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

执行的操作:(POTR)<-- AL (字节操作) (PORT+1,PORT)<-- (AX) (字操作) 短格式为: OUT DX,AL (字节操作) OUT DX,AX (字操作) 执行的操作:((DX))<-- AL (字节操作) ((DX)+1,(DX))<-- (AX) (字操作) 在IBM PC机里,所有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~FFFFH),然后再用IN或OUT指令来传送信息,必须注意。这里的端口号或DX的内容均为地址,而传送的是端口中的信息,而且在用短格式时DX的内容就是端口号本身,不需要由任何段寄存器来修改它的值。 输入,输出指令不影响标志位。 (3)XLAT(Translate)换码指令 格式为: XLAT OPR 或 XLAT 执行的操作:(AL)<-- ((BX)+(AL)) 3.地址传送指令 (1)LEA(Load effective addres)有效地址送寄存器指令 格式为: LEA REG,SRC 执行的操作: (REG)<-- SRC 指令把源操作数的有效地址送到指定的寄存器中。 (2)LDS(Load DS with Pointer)指针送寄存器和DS指令 格式为: LDS REG,SRC 执行的操作:(REG)<-- (SRC) (DS)<-- (SRC+2) 把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。 (3)LES(Load ES with Pointer)指针送寄存器和ES指令 格式为: LES REG,SRC 执行的操作:(REG)<--(SRC) (ES)<--(SRC+2) 把源操作数指定的4个相继字节送到由指令指定寄存器及ES寄存器中。该指令常指定DI寄存器。 以上三条指令指定的寄存器不能使用段寄存器,且源操作数必须使用除立即数方式及寄存器方式以外的其它寻址方式。这些指令不影响标志位。 本组指令把变量的偏移地址(LEA)或段地址和偏移地址(LDS和LES)送给寄存器,以提供访问变量的工具。 例4.3.7: LEA BX,[BX+SI+0F62H] 如指令执行前:(BX)=0400H,(SI)=003CH 则指令执行后:(BX)=0400+003C+0F62=139EH

5

必须注意。在这里BX 寄存器得到的是偏移地址而不是该存储单元的内容 4.3.2 算术运算指令 1.加法指令 (1) ADD(add)加法 格式:ADD DST,SRC 执行的操作:(DST)<--(SRC)+(DST) (2) ADC(add with carry)带进位加法 格式:ADC DST,SRC 执行的操作:(DST)<-- (SRC)+(DST)+CF 其中CF为进位位的值 (3) INC(increment)加1 格式:INC OPR 执行的操作: (OPR)<-- (OPR)+1 2.减法指令 (1) SUB(subtract)减法 格式:SUB DST,SRC 执行的操作:(DST)? (DST)-(SRC) (2) SBB(subtract with borrow)带借位减法 格式:SBB DST,SRC 执行的操作:(DST)? (DST)-(SRC)-CF (3) DEC (decrement) 减1 格式:DEC OPR 执行的操作:(OPR)? (OPR)-1 (4)NEG (negate)求补 格式:NEG OPR 执行的操作:(OPR)? -(OPR) (5) CMP(compare)比较 格式:CMP OPR1,OPR2 执行的操作:(OPR1)-(OPR2) 3. 乘法指令 (1) MUL(Unsigned Multiple)无符号数乘法指令 格式:MUL SRC 执行的操作: 字节操作数:(AX)? (AL)×(SRC) 字操作数:(DX,AX)? (AX) ×(SRC) (2) IMUL(Signed Multiple)带符号数乘法指令 格式:IMUL SRC 执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数。 在乘法指令里,目的操作数必须是累加器,字运算为AX,字节运算为AL。两个8位数相乘得到的是16位乘积存放在AX中,两个16位数相乘得到的是32位乘积,存放在DX,AX中,其中DX存放高位字,AX存放低位字。指令中的源操作数 可以使用除立即数方式以外的任何一种寻址方式。 乘法指令对除CF和OF以外的条件码位无定义(注意:无定义的意义和不影响不同,无定义是指指令执行后这些条件码位的状态不定,而不影响则是指该指令的结果并不影响条件码,

6

因而条件码应保持原状态不变。),对于MUL指令,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)为0,则CF和OF均为0;否则(即字节操作时的(AH) ≠0或字操作时的(DX)≠0)CF和OF均为1。这样的条件码设置可以检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。对于IMUL指令,如果乘积的高一半是低一半的符号扩展则CF和OF均为0,否则就均为1。 例4.3.11: 如(AL)=0B4H,(BL)=11H求执行指令 IMUL BL和MUL BL后的乘积值。 (AL)=0B4H为无符号数的180D,带符号数的-76D,(BL)=11H为无符号数的17D,执行IMUL BL的结果为: (AX)=0FAF4H=-1292D;CF=OF=1 执行的MUL BL的结果为: (AX)=0BF4H=3060D;CF=OF=1 4.除法指令 (1) DIV (Unsigned divide) 无符号数除法指令 格式为: DIV SRC 执行的操作: 1) 字节操作:16位被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。表示为: (AL)? (AX)/(SRC)的商; (AH)? (AX)/(SRC)的余数 2) 字操作:32位被除数在DX,AX中,其中DX为高位字;16位除数为源操作数,结果的16位商在AX中,16位余数在DX中。表示为: (AX)? (DX,AX)/(SRC)的商; (DX)? (DX,AX)/(SRC)的余数 商和余数均为无符号数。 (2) IDIV (Signed divide)带符号除法指令 格式为:IDIV SRC 执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号和被除数的符号相同。 除法指令的寻址方式和乘法指令相同。其目的操作数必须存放在AX或DX,AX中。而其源操作数可以用除立即数以外的任何一种寻址方式。 除法指令对所有条件码位均无定义。 由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,因而往往需要用符号扩展的方法取得除法指令所需要的被除数格式,为此我们介绍两条符号扩展指令如下: (3) CBW(Convert byte to word)字节转换为字指令 格式为:CWB 执行的操作:AL的内容符号扩展到AH。即如(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH。 (4) CWD(Convert word to double word)字转换为字节指令 格式为:CWD 执行的操作:AX的内容符号扩展到DX。即如(AX)的最高有效位为0,则(DX)=0000;如(AX)的最高有效位为1,则(DX)=0FFFFH。 这两条指令都不影响条件码。 5. 十进制调整指令 前面提到的所有算术运算指令都是二进制数的运算指令,但是人们最常用的是十进制数,

7

这样,当用计算机进行计算时,必须先把十进制数转换成二进制数,然后再进行二进制数的计算,计算结果又转换成十进制数输出。为了便于十进制数的计算,计算机还提供了一组十进制数调整指令,这组指令在二进制计算的基础上,给予十进制调整,可以直接得到十进制的结果。在说明这组指令之前,我们首先介绍计算机中常用的表示十进制数的BCD码。 在IBM PC机里,表示十进制数的BCD码可以用压缩的BCD码和非压缩的BCD码两种格式来表示。压缩的BCD码(packed BCD format)用4位二进制数表示一个十进制数位,整个十进制数形式为一个顺序的以4位为一组的数串。例如,9503d应表示为: 1001 0101 0000 0010。 非压缩的BCD码(unpacked BCD format)则以8位为一组表示一个十进制数位,8位中的低4位表示8421的BCD 码,而高4位则没有意义。例如,9502d则表示为: uuuu1001 uuuu0101 uuuu0000 uuuu0010。 可以看出数字的ASCII码是一种非压缩的BCD码。因为数字的ACSII的高4位值为0011而低4位是以8421码表示的十进制数位,这符合非压缩BCD码高4位无意义的规定。 IBM PC机的十进制调整指令分为两组,下面分别加以说明: (1) 压缩的BCD码调整指令 1) DAA(decimal adjust for addifion)加法的十进制调整指令 执行的操作: (AL)<-- 把AL中的和调整到压缩的BCD码格式,这条指令之前必须执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果保存AL寄存器中。本指令的调整方法是: 如果AF标志(辅助进位位)为1,或者AL寄存器的低4位是十六进制的A~F,则 AL寄存器内容加06H,且将AF置1;如果CF标志为1,或者AL寄存器的高4位是十六进制的A~F,则AL寄存器内容加60H,并将CF位置1。 DAA指令对标志无定义,但影响所有其它条件标志。 2) DAS(decimal adjust for subtraction)减法的十进制调整指令 执行的操作: (AL)把AL中的差调整到压缩的BCD格式。 这条指令之前必须执行SUB和SBB指令,减法指令必须把两个BCD码相减,并把结果存放在AL寄存器中。本指令的调整方法是: 如果AF标志为1,或者AL寄存器的低4位是十六进制的A~F,则使AL寄存器的内容减去06H,且将AF置1;如果CF标志为1,或者AL寄存器的高4位是十六进制的A~F,则AL寄存器的内容减去60H,并将CF位置1。 DAS指令对OF标志无定义,但影响所有其它条件标志。 (2) 非压缩的BCD码调整指令 1) AAA(ASCII adjust for addition)加法的ASCII调整指令 2) AAS(ASCII adjust for subtraction)减法的ASCII调整指令 3) AAM(ASCII adjust for multiplication)乘法的ASCII调整指令 4) AAD(ASCII adjust for division)除法的ASCII调整指令 这里我们不再详细叙述。 4.3.3 逻辑指令 1.逻辑运算指令 逻辑运算指令可以对字或字节执行逻辑运算。由于逻辑运算是按位操作的,因此一般说来,其操作数应该是位串而不是数。 (1) AND(and)逻辑与指令 格式:OR DST,SRC

8

联系客服:779662525#qq.com(#替换为@)