zoukankan      html  css  js  c++  java
  • 编写不会产生除法溢出的子程序

    divdw:           不溢出除法,被除数为dword,除数为word,结果为dword 

    ;参数:(dx):(ax)=被除数高、低16位  (cx)=除数 
    ;返回:(dx):(ax)=结果的高、低16位  (cx)=余数 

    h,L表示被除数H的高16位和低16位,int(h/n)取商,rem(h/n)取余。n代表除数.

     采用公式:x/n=int(h/n)*65536+[rem(h/n)*65536+L]/n 

    即:int(h/n)作高16位,             rem(h/n)做被除数高16位,L做低16位,除以n 的结果做 低16位。

    最开始相当很复杂,答案很简单:

    assume cs:code
    
    code segment
    start:mov ax,4240h ;dword型数据的低16位
            mov dx,000fh ;dword型数据的高16位
            mov cx,0Ah   ; c除数
            call divdw 
            mov ax,4c00h
            int 21h
    
    divdw:   push si
             push ax
             mov ax,dx ;ax存储高位
             mov dx,0
             div cx
             mov si,ax ;si存储商,dx存放余数
             
             pop ax ;ax存储低位
             div cx   ;运算后ax存储结果的低位
             
             mov cx,dx ;余数
             mov dx,si ;dx存储高位
             pop si
             
             ret
    
    
      code ends
      end start

      下面是自己写的一段简洁的代码:

    divdw:
            mov di,ax 
            mov ax,dx ;ax 存储高16位
            mov dx,0
            div cx ;ax 商,dx余
             
            push ax
            
            mov ax,di
            div cx  ;ax运算后为余安照公式存储低16位
            mov  cx,dx ;存储余数,最开始忘记了
            
            pop dx ;dx接受开始的ax
            
            ret

    下面的代码跟以上类似:

    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 ;子程序定义结束
  • 相关阅读:
    信息安全基本概念
    GmSSL开发环境搭建及双证书生成
    Git使用教程
    linux软件管理
    在Windows中查看文件的MD5值
    odoo显示页面格式化日期的一个方法
    Ubuntu 查看文件夹大小
    docker容器中启动postgresql 9.5失败:could not locate a valid checkpoint record
    如何让postgresql日志记录所有的执行语句
    vim快捷键
  • 原文地址:https://www.cnblogs.com/youxin/p/2524751.html
Copyright © 2011-2022 走看看