170413 汇编-防溢出除法和数值转字符型的子程序

1625-5 王子昂 总结《2017年4月13日》 【连续第194天总结】

A. 汇编语言实验十 90%

B. 第二个子程序:解决除法溢出的问题

word型/byte型时以8位寄存器保存余数和商,但有可能商大于8位,此时会报错Divide overflow;解决程序:

被除数为dword型,除数为word型,结果为dword型

参数: ax=低16位

  dx=高16位

cx=除数

返回: dx=结果的高16位

ax=结果的低16位

cx=余数

代码:

divdw: mov bx,ax ;bx中存L

mov ax,dx ;dx置0,ax中存H

mov ax,0

div cx ;H/N,商在ax,余在dx

mov bp,ax int(H/N)暂存

mov ax,bx

div cx

mov dx,bp

ret

原理:公式X/N=int(H/N)*65536+[rem(H/N)*65536+L]/N

其中:X为被除数,N为除数,H为X的高16位,L为X的低16位,int()表示取商,rem()表示取余

注意点:

通用寄存器有ax,bx,cx,dx,bp,sp,si,di八个,它们虽然名义上有自己的用途,但实际上是可以作为数据暂存通用的。当需要中介转移数据时可以任意使用这8个寄存器


第三个子程序:数值显示

程序中,数值类型和字符串类型是两种,例如'0'的ASCII码值是30H。因此若需要在显存中表示它们,则需要转换成字符类型。

参数: ax=word型数据

ds:si指向字符串的首地址

代码:

dtoc: mov bp,4 ;8位寄存器所能存储的数据最大长度5

dtocl: mov bh,10 ;除以10得到余数

div bh

mov [si+bp],ah ;将余数送往指定段

add [si+bp],30H ;加上30H,使其的值表示的字符与原值相同

mov ah,0 ;ah置0,等待下次进行除法

mov cl,al ;判断商是否为0

jcxz ok

sub bp,1 ;非0则将指针-1,继续循环

loop dtocl

ok: ret

注意点:

由于取余的方法得到的数字顺序与原数字是相反的,所以我用指针-1的方法来放置;但是这样其实还是有弊端,当非5位数时会造成左边有空余

顺序倒置只能通过栈或内存区域进行一次转换,但是参数中又没有给定栈数据段来操作,因此不知道该如何倒置

C. 明日计划

汇编语言 明天将3个子程序综合起来做一次程序设计,利用显存来显示内容

PYQT 地图控件




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值