《汇编语言》实验10.2 解决除法溢出问题

实验10.2

关于div指令

div是除法指令,使用div做除法的时候应该注意以下问题:

  1. 除数:有8位和16位两种,在一个reg或内存单元中。
  2. 被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位
  3. 结果:如果除数为8位,则AL存储出发操作的商,AH存储除法操作的余数;如果除数为16位,则AX存储出发操作的商,DX存储出发操作的余数。

除法溢出:我们再用div指令做除法的时候,很可能发生上面的情况:为8位除法,除以1000H,其中8位除法指的是除数为8位,比如处以1H,那么结果1000H很明显在AL中是存储不了的,这时这种错误就叫做除法溢出。

我们应该怎样解决这个问题呢?

assume cs:code,ss:stack

stack segement
    dw 0,0
stack ends

code segment
    start:  mov ax,stack
        mov ss,ax
        mov sp,10h
        mov ax,4240h
        mov dx,000fh
        mov cx,0ah
        call divdw

        mov ax,4c00h
        int 21h

    divdw:  push ax
        mov ax,dx
        mov dx,0
        div cx
        mov bx,ax
        pop ax
        div cx
        mov cx,dx
        mov dx,bx
        ret

code ends
end start

记住,汇编语言说到底就是数据的移动转移,因为地方有限,所以,这里移动一点,那里移动一点。

使用“数据流“的思想,会很好理解的。

我们把结果放在ax中,商放在dx中。
而被除数默认放在ax和dx中,这难免不了移动。

思路解析:

先开始处理dx吧,那么ax放被除数和结果的,那么ax本身的数据就要被移动入栈了,就是push ax
之后应该把要处理的dx放进ax中,但我们要处理的是8位啊,那么dx中还会存在数据,怎么办?当然清零啊!
故有mov ax,dx;mov dx,0
完成之后就可以来进行除法运算,除数在cx中,故div cx。算出来的结果商在ax中,我们还要进行出栈,要快点把它拿开,放到哪里呢?寄存器bx还空闲着,故有mov bx,ax
而之后就可以出栈了pop ax,此时DX还保留着上次的余数呢!
当然啊,因为它是高位哇!余数依然作为这次的高位啊!
这样,我们只要把低位ax提出来,然后再进行除法运算!div cx
结果ax为商,dx为余数,这时dx就是实实在在的余数了。
我们把这些整理一下
mov cx,dx mov dx,bx
这样:cx–最后的余数 dx–高八位的商 ax–低八位的商!

可以看出,所谓汇编语言难理解,是因为你缺乏机器的思维语言,这是你需要明确的,你必须清楚你的数据来自哪里,要干什么,要放哪里,遇到冲突怎么办,相关指令的处理机制,当明白这些时,你切问题都不是问题了!

你要无时无刻牢记你原先存储数据的位置,这点一定要明确!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微机原理与汇编语言-实验报告(中北大学大数据学院)(前4个实验都可以直接运行,后面的几个需要用到proteus,这个要自己根据自己的情况搞,咱就不能保证在你电脑上能不能运行了) 实验一 简单程序设计 1. 编制一个简单的运算程序,并且调试完成。 2. 编制一个计算x=a2+b2 3. 验证上述结果的正确 实验二 循环、分支程序设计 1. 编制一个统计数组中正负数个数及均值的程序,并且调试完成得到正确的结果。 2. 设计计算Y=1+2+3+....,直到累加和刚好大于10000的程序并且调试完成。 3. 对给定数组中的所有元素,按从大到小的顺序排序,并且加以验证。 实验三 系统功能调用实验 1.编制一个具有屏幕提示和键盘输入的程序,键盘输入一个人名,在屏幕上显示“Hello 人名!”; 2.通过键盘输入一串包含大小写字母和数字的字符串,统计其中大写、小写字母和数字字符的个数,并将结果显示在屏幕上。 实验四 8255并行接口实验 1.将8255一个端口接8个发光二极管,用不同工作方式控制其逐次点亮发光二极管。 2.将8255另一个端口接开关,用不同工作方式,编程将开关信息在发光二极管上显示出来。 3.验证上述操作的正确性,对实验结果进行解释 实验五 键盘、LED实验 1.在实验箱上,连接小键盘和LED显示器。 2.编程将键盘输入的数字,显示在显示器上,在按键时,原来显示的数字左移一位,新按的键值显示在最右端。 3.考虑两个键组合时的输入方法 4.对实验结果进行说明 实验六 中断实验 1.连接实验箱上的数码管,通过消抖开关作为中断源。 2.编写程序,完成在中断服务程序中记录中断次数,在主程序中显示按键次数。 3.将消抖开关换成一般开关,用同样的程序,再测试,仔细观察,发现了什么,为什么? 实验七 定时/计数器实验 1.使用计数器对消抖开关的按动次数进行计数,显示当前的计数值。 2.对实验箱中系统时钟进行计数,改变计数初值(两个初值要相差很大),观察有什么不同。 3.8253的初值用0和1,观察结果,并加以分析。 4.分析实验结果,并对实验结果进行说明。 实验八 综合实验 1.将实验箱设计成一个电子表,该表能分时(或按键切换)显示年月日、时分秒; 2.设置按键,通过按键可以修正日期和时间,在修正日期、时间时,电子表仍然可以继续工作。 3.AD实验,用显示器显示当前AD的输入电压值,要求精确到小数点后2位数(选做)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值