当前位置: 代码迷 >> 汇编语言 >> 关于 除法溢出 求余数 显示十进制的有关问题
  详细解决方案

关于 除法溢出 求余数 显示十进制的有关问题

热度:79   发布时间:2016-05-02 04:27:56.0
关于 除法溢出 求余数 显示十进制的问题

王爽 汇编 在课程设计1中!  在屏幕上显示 十进制数据  
比如 数值5937000  十六进制为5A 9768  按书上  让÷10 得到余数    
 可是数值有点大 要怎么处理?  
是先5A 9768÷10=90f24    在90f24÷10得到余数??如果这样得到余数 就少了一个0要肿么办?  

   课程设计1 出不来  就是因为这个弄不懂~ 百度好几天了      
   实在没有办法  在线等高手解答  求详细注释 或者 过程
------解决思路----------------------
噢天,这不是8086汇编?
你甚至可以加一个.8086去限制它只用8086代码!

副程序可以随时拿去用,dx放入高值,ax放低值
最大可以转换FFFF:FFFF = 4294967295
若只要FFFF (65535),清除dx就可以了
换一套比较传统的模版,也加了解释,希望对你有帮助



.8086

DATA SEGMENT

num dd 5A9768h

DATA ENDS


CODE SEGMENT
     ASSUME CS:CODE,DS:DATA

start:

 mov ax,data
 mov ds,ax
 mov ax,word ptr num  ;low word
 mov dx,word ptr num + 2  ;high word

 call print_dec  ;output to screen

 MOV AX,4C00H
 INT 21H

;----------------------------------------
print_dec:
;input  :  dx-high word, ax-low word
;output :  display dec digit to screen

push ax
push bx
push cx
push dx
push si
push bp
                xor     cx,cx
                xchg    bp,dx                   ;save high word to bp
                mov     si,000ah                ;10
mov bx,30h
count1:         or      bp,bp                   ;is it zero
                jz      count2                  ;yes, high word finish
                xchg    bp,ax                   ;exchange high and low word
                xor     dx,dx                   ;clear dx
                div     si                      ;div by 10
                xchg    bp,ax                   ;exchange low and result word
                div     si                      ;div by 10
                or      dl,bl                   ;change to ascii
                push    dx                      ;store it
                inc     cx                      ;no. of byte
                jmp     short count1            ;next
count2:         xor     dx,dx                   ;clear dx
                div     si                      ;div by 10
                or      dl,bl                   ;change to ascii
                push    dx                      ;store it
                inc     cx                      ;no. of byte
                or      ax,ax                   ;is it finish
                jnz     count2                  ;no, next
count3:         pop     dx                      ;get byte
                mov     ah,02                   ;print char
int 21h
                loop    count3                  ;next byte
pop bp
pop si
pop dx
pop cx
pop bx
pop ax
ret

;----------------------------------------


code ends
     end start

------解决思路----------------------
书上不是  说了 一个 长除法吗??


ax = 16位 低位
dx = 16位 高位
cx = 除数 10    返回的时候  cx = 余数     然后对余数进行处理 我去写一下代码
------解决思路----------------------

assume cs:code,ds:data,ss:stack


data segment

num dd 53970000,0,512321,22,333

data ends


stack segment stack
db 128 dup(0)
stack ends

code segment
start: mov ax,stack
mov ss,ax
mov sp,128


call init_reg

call outPut_num

mov ax,4c00H
int 21H

;==============================================
to_string:
push ax
push bx
push cx
push dx
push di


mov ax,ds:[bx].0 ;低16位
mov dx,ds:[bx].2 ;高16位
call is_div


pop di
pop dx
pop cx
pop bx
pop ax
ret

;==============================================
is_div: push ax ;函数long_div ret2 的原因
mov cx,10
call long_div
add cx,30H ;字符化处理
mov es:[di],cl
sub di,2 ;第一个是个位数 
mov cx,dx
jcxz isAxZero
jmp is_div
isAxZero: mov cx,ax
jcxz isDivRet
jmp is_div ;ax 和 dx 都等于0 说明数字除完了 否则继续除

isDivRet: ret

;==============================================
long_div: mov bp,sp
mov ax,dx
mov dx,0 ;具体 你看 王爽书最后的的解释
div cx

push ax
mov ax,ss:[bp+2]
div cx
mov cx,dx
pop dx

ret 2 ;pop ip  add sp,2

;==============================================
outPut_num:
mov bx,OFFSET num ;结构
mov cx,5
mov di,160*10 + 20*2 ;显示的位置

outPutNum: call to_string
add di,160
add bx,4
loop outPutNum

ret

;==============================================
;初始化 寄存器
init_reg: mov bx,0B800H
mov es,bx

mov bx,data
mov ds,bx

ret

code ends


end start



------解决思路----------------------
http://blog.csdn.net/misskissc/article/details/41964049
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax) = dword型数据的低16位,(dx) = dword型数据的高16位,(cx) = 除数
;返回:(dx) = 结果的高16位,(ax) = 结果的低16位,(cx) = 余数
divdw:
push          bx
push          si

mov bx,ax
mov ax, dx
mov dx, 0

div    cx     ;ax = int(H/N), dx = rem(H/N)
mov si, ax         ;si     =int(H/N), (dx) = rem(H/N) * 65536

mov ax, bx
div    cx     ;(rem(H/N) * 65536 + L) / N, ax保存的低16位商,(dx) = 余数

mov cx, dx
mov dx, si

pop  si
pop  bx
retf
  相关解决方案