早教吧 育儿知识 作业答案 考试题库 百科 知识分享

一个汇编的小问题,x,y,z,v均为16位带符号数,计算(v-(x*y+z–540))/xMOVAX,XIMULYMOVCX,AXMOVBX,DXMOVAX,ZCWDADDCX,AXADCBX,DXSUBCX,540SBBBX,0MOVAX,VCWDSUBAX,CXSBBDX,BXIDIVX上述代码中为啥要用CW

题目详情
一个汇编的小问题,x ,y ,z ,v 均为16位带符号数,计算 ( v - ( x*y + z – 540 ) ) / x
MOV AX,X
IMUL Y
MOV CX,AX
MOV BX,DX
MOV AX,Z
CWD
ADD CX,AX
ADC BX,DX
SUB CX,540
SBB BX,0
MOV AX,V
CWD
SUB AX,CX
SBB DX,BX
IDIV X
上述代码中为啥要用CWD,能不能改成这样:
MOV AX,X
IMUL Y
MOV CX,AX
MOV BX,DX
MOV AX,Z
ADD CX,AX
ADC BX,0
SUB CX,540
SBB BX,0
MOV AX,V
SUB AX,CX
SBB DX,0
IDIV X
▼优质解答
答案和解析
将16位的“带”符号数 Z 扩展成32位,必须用CWD,才能保证不论 Z 是正是负,都得到正确的结果.
你改写的程序,仅在Z是正数的时候结果正确.
若 Z 是一个负数,你改写后的程序的运算结果就会出错.