关于数据计算中的一些小问题

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。结果正确。