您的位置:首页 > 其它

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

2017-04-13 23:22 357 查看
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
地图控件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: