关于数据计算中的一些小问题
2018年4月5日 10:05
程序分析如下:
题目:w=(x+y*3-45)/z
1.数据段定义:
定义三个字类型的变量x,y,z 并赋初值48(0030h),-21(ffebh),14(000eh)。 定义两个字型空间w和w+2来存放商和余数
2.代码段:
起始标号start,说明代码段的起始偏移地址,与最后的end start相对应,这是初始化代码段的重要依据。说明了程序从start处开始执行,ip=start。
首先,初始化数据段,需要用一个寄存器来做中介,一般用ax。
imul指令的作用:
a.操作数是字节类型:al与8位源操作数src相乘,结果放入ax
b.操作数是字类型: ax与16位源操作数src相乘,结果放入dx:ax,dx存高字,ax存低字
执行了 mov ax,3 imul y (3*y)后的内存情况:
可以看出x=48,y=-21,z=14 没变,是因为结果在dx:ax中,所以查看寄存器:
因为-21*3=-63(ffc1h)所以可以看到AX=FFC1,因为结果符号位为1,所以DX=FFFF。
这里把运算的结果重新存入cx和bx中,是为了把运算结果保存起来,以便下面计算。(cx和bx共同存放了结果)
对符号位进行扩展是因为如上式的结果是双字型。所以程序在执行完19行和21行后,寄存器的存储情况如下:
这里看到AX=0030,DX=0000,证明符号位扩展完毕。(dx和ax共同表示了x)
x和y*3的结果相加。 高位相加,低位相加,同时考虑低位向高位进位。因为48-63=-15(fff1h),所以ax应该等于fff1h,因为没有进位,所以dx应该等于ffffh。
减法与加法类似,考虑低位向高位借位。
-15-45=-60 -60/14 = -4......-4 所以当程序执行完时,商为-4(fffch),余数为-4(fffch)
看到x=48,y=-21,z=14,w=-4,w+2=-4。结果正确。