回 帖 发 新 帖 刷新版面

主题:程序段的一些疑问

在下面的例子中有一些疑问不是很理解,望能给予指导,谢谢~~~~


编写程序段,完成下面公式的计算(其中:变量X和Y是32位有符号数,变量A,B和Z是16位有符号数)。

A←(X-Y+24)/Z的商,B←(X-Y+24)/Z的余数

解: 
 DATA1 SEGMENT 
 
X DD ? 
Y DD ? 
Z DW ? 
A DW ? 
B DW ? 
… 
DATA1 ENDS 
CODE1 SEGMENT 
… 
MOV AX, X 
[b]MOV DX, X+2 ;用(DX:AX)来保存32位变量X的数值 [/b]在这里中,为什么X要加2呢?
SUB AX,Y 
SBB DX, Y+2 ;(DX:AX)-(Y+2:Y) 
ADD AX, 24D 
ADC DX, 0 ;(DX:AX)+24 
[b]IDIV Z [/b]IDIV功能是用显式操作数去除隐含操作数(都作为有符号数),在这里隐含的被除数是什么,为什么?还有就所得到的商和余数是如何放到AX与DX的?
MOV A, AX 
MOV B, DX 
… 
CODE1 ENDS 

回复列表 (共2个回复)

沙发

MOV AX, X 
MOV DX, X+2 ;用(DX:AX)来保存32位变量X的数值 在这里中,为什么X要加2呢?
--------------------------------------------
首先指出,在语法上,上述两条指令是错误的。ax和dx是16位的,而x是32位变量,会产生类型不一致的错误,应改为这样:

mov ax, word ptr x
mov dx, word ptr x+2

至于x为什么要加2,是由于要取出x高两个字节的值,x+2就是x高两个字节的地址。



IDIV Z IDIV功能是用显式操作数去除隐含操作数(都作为有符号数),在这里隐含的被除数是什么,为什么?还有就所得到的商和余数是如何放到AX与DX的?
---------------------------------------------------------
被除数的大小视乎除数的大小,在这里z是一个16位数值,因此被除数就是dx和ax合起来的32位数值,dx是高16位,ax低16位,商存放在ax,符号视除数与被除数的符号而定,余数存放在dx,符号与被除数相同,如果商的长度大于16位,将产生int 0除法溢出错误。如果z是8位数值,那么被除数就是ax。

板凳

谢谢您~~~~

我来回复

您尚未登录,请登录后再回复。点此登录或注册