关于一段代码的疑问

;计算(V-(X*Y+Z-540))/X

MOV AX,X ;将X(字)的内容传送到AX中
IMUL Y ;带符号将AX中的内容同Y相乘
MOV CX,AX ;将AX中的内容传送到CX(低字)中去
MOV BX,DX ;将DX中的内容传送到BX(高字)中去
MOV AX,Z ;将Z传送到AX中覆盖原来的X*Y的结果
CWD ;转换为双字指令
ADD CX,AX ;将AX(低字)中的内容同CX(低字)相加
;结果存入CX

ADC BX,DX ;将DX(高字)中的内容同BX(高字)相加
;结果存入BX
SUB CX,540 ;将540的低位同CX相减
SBB BX,0 ;将高位同BX相减
MOV AX,V ;将V移动到AX中
CWD ;将AX的内容符号扩展到DX
SUB AX,CX ;再次将AX(低字)减去CX(低字)的结果存入AX
SBB DX,BX ;将DX(高字)减去BX(高字)的结果存入DX
IDIV X ;用AX/DX中的数除以X

;最终AX/DX中的数就是要的数

在这里,两个CWD指令是不是是必须的?也就是说只要有要进行除法的地方,就必须有CWD/CBW?
[635 byte] By [oldgameman-月光轮舞] at [2007-12-16]
# 1
不是必须的,但是你必须进行类似的操作。
除法时必须进行符号位扩展,以使被除数和位数是除数的2倍。这样才不会溢出。
如 div bx,如果你确信bx是正数(bx<80h),那么你可以用xor dx,dx来代替cwd:)
woshiwo-我是我 at 2007-10-21 > top of Msdn China Tech,其他开发语言,汇编语言...
# 2
当然不是,要看情况
# 3
tk for woshiwo
oldgameman-月光轮舞 at 2007-10-21 > top of Msdn China Tech,其他开发语言,汇编语言...
# 4
学习中……
# 5
cwd指令是为后面的add/adc和sub/sbb指令准备的,和idiv并没有直接的关系。
从使用imul和idiv指令来看,参与运算的数据为符号数,在用add/adc和sub/sbb指令组进行32位的加减运算是,如果有操作数为16位的,应用cwd指令将符号位由ax扩展到dx中,否则dx中的值有可能是错误的,结果也就是错的了。
zara-Kyrieeleison at 2007-10-21 > top of Msdn China Tech,其他开发语言,汇编语言...