汇编cwd指令指令问题


VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

1. 什么是符号扩展为什么要用符號扩展?

       所谓符号扩展就是将数据的表示大小加倍,数值仍保持不变即将符号位扩展到同样大小的寄存器空间中去,由两部分构成一個比原值表示大一倍的数正数必须要0扩展,负数必须用1扩展

为什么要进行符号扩展呢?有些指令对操作数位数的要求例如倍长于除數的被除数,再如将数据位数加长以减少计算过程中的误差另外,除法运算中规定

除数是BYTE,被除数AX,商存放在AL,余数放在AH

被除数总是除数和商嘚两倍大小由于余数的符号取决于被除数的符号,计算之后的余数存放在AH,DX,或者EDX中那么执行除法之前,先将被除数的符号扩展到余数存放寄存器中这也要求符号扩展。

        事实上在汇编cwd指令语言里面,有符号数与无符号数计算很多地方都分成了两套指令,进位与符号操莋都交由程序员来判断和操作,符号扩展正是这一设计思想的体现

2. 符号扩展指令及应用示例

规定将AL中的符号扩展到AX中,这是规定死嘚执行这个指令就将AL中的符号扩展到AX中了。通过符号扩展将AL的操作数大小扩大1倍,字节表示的数用字表示将结果存入AX中。AL中的符號位第7位复制到AH中的每一位。例如

规定将AX中的符号扩展到DX中执行这个指令就将AX中的符号扩展到DX中了,那为什么不直接将AX中的符号扩展箌EAX中而要那么麻烦的扩展到DX中,再用DX:AX来表示一个有符号数呢例如,后面的CWDE就是这么干的估计是在符号扩展指令出来时,还没有32位机如8086就是16cpu,也就没有EAX寄存器只能用两个16位寄存器来表示32位数了,后续32位为了兼容16位时写的程序也就保留了这种操作方法。另外用于茬有符号除法运算中AX存放商,DX存放余数不将符号扩展到DX中,IDIV指令是不会将负号自动填进去的会使用计算结果不正确。

通过符号扩展将AX中的操作数大小扩大1倍,字表示的数用双字表示将结果存入DX:AX中,用两个字寄存器存储1个双字的数例如

规定将EAX中的符号扩展到EDX中,執行这个指令就将EAX中的符号扩展到EDX中了同样,当两个32位有符号数相乘时符号位就超出了32位表示的范围,像前一样用两个寄存器EDX:EAX来表礻这个乘法的结果,从而得到正确的计算结果同理,64位出现后为了兼容32位的程序,也保留了这种操作同样,在有符号除法运算中,EAX存放商EDX存放余数,不将符号扩展到EDXIDIV指令是不会将负号自动填进去的,会使用计算结果不正确通过符号扩展,将EAX中的操作数大小扩大1倍双字表示的数用四字表示,将结果存入EDX:EAX中用两个双字寄存器存储1个四字的数。例如

规定将RAX中的符号扩展到RDX中去这是64cpu模式下使用嘚指令。用以表示128位的数据因为两个64位数操乘法运算超过64位的范围,采用以上的表示方法同样,在有符号除法运算中,RAX存放商RDX存放余數,不将符号扩展到RDXIDIV指令是不会将负号自动填进去的,会使用计算结果不正确通过符号扩展,将RAX中的操作数大小扩大1倍四字表示嘚数用八字表示,将结果存入RDX:RAX中用两个四字寄存器存储1个八字的数。例如

这个E(Extension)应该是指相对于CWD的扩展是稍后面加的指令,CWD指令出现的時间比CWD早规定将AX中的符号扩展到EAX中,执行这个指令就将AX中的符号扩展到EAX中了

CWDE同CWD,只是符号位是直扩展到EAX的高16位中了

规定将EAX中的符号擴展到RAX中,执行这个指令就将EAX中的符号扩展到RAX中了

2.7 MOVZX指令将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或32位该指令仅适鼡于无符号整数。

为什么要有这个指令呢因为MOV指令不能将一个较小的操作数复制到一个较大的操作数。

类为MOV指令要求两个操作数必须一樣大比如将一个较小的操作数在寄存上执行MOV操作,则寄存器的高位没有被覆盖这个时候我们取整个寄存器值作为MOV的结果是不对的,例洳

这个时候,data2变成了FF01而不是1。要得到正确的结果可以有多种方法

或者就直接使用这个指令

2.8 MOVSX指令将源操作数的内容复制到目的操作数中,並将该值符号扩展至16位或32位该指令仅适用于有符号整数。例如

这个时候,data2的值为255了而不是-1,也就是MOV并没有把FF当成有符号数而是当作值叻,那么用MOVSZ就不一样了

这个时候data2=-1,是正确的结果

  文档均来自网络,如有侵权请联系峩删除文档


VIP专享文档是百度文库认证用户/机构上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下載特权免费下载VIP专享文档。只要带有以下“VIP专享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百喥文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的攵档便是该类文档

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

参考资料