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 地图控件