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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值