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

    xiaoxiao2021-04-14  81

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

    转载请注明原文地址: https://ju.6miu.com/read-670717.html

    最新回复(0)