回 帖 发 新 帖 刷新版面

主题:[讨论]问一个用汇编写编译器的问题(乘/除)(加分帖)

因为要进行大数的运算,但要求乘除的两个数都是十进数,如:
1245856523*12457852=XXXXXXXXXX....
加法减法已经搞定了
但是乘法出发没有找出什么好的算法……
大家提意见啊

回复列表 (共2个回复)

沙发

转人家的,自己看是否有用。
; 精确计算一个数据的阶乘,数据由命令行中给出!
; 文件名: Jch.asm
;-------------------------------------------------

        .model tiny
        .data
Js_Jg   dw 1            ;存放计算结果

        .const
Out10   equ 0f000h      ;从该地址开始存放10进制的输出结果
        
        .code
        org 100h        ;COM格式的文件指令从此处开始执行(因为没使用.startup伪指令,所以此句不能省略) 
start:
        mov si,81h      ;从命令行中接收一个数据
        call input      ;取该数据并从AX中返回
        mov cx,ax       ;计算CX中数据的阶乘
        mov bp,1        ;初始化计算结果所占字数,1字为2字节
        mov bx,bp       ;一个计数器      
        jb s9           ;取数据错转结束
        cmp cx,6300     ;最大可计算6300的阶乘
        ja s9
        jcxz s3p
s0:
        mov bx,bp       
        mov ax,cx       ;利用CX的值来计算阶乘
        lea si,Js_Jg    ;SI<-计算结果存放地址
        mov dx,0        ;计算(AX*计算结果)
        xchg dx,[si]
s1:
        push ax
        mul dx
        add [si],ax
        adc dx,0
        inc si
        inc si
        pop ax
        dec bx
        jz s2
        xchg dx,[si]
        jmp s1
s2:
        or dx,dx
        jz s3
        inc bp           ;调整计算结果所占字数
        mov [si],dx
s3:
        loop s0          ;循环完成阶乘的计算

;;;;;;;;;;;;下面完成计算结果按十进制形式输出;;;;;;;;;;;;;;

s3p:
        std
        mov di,Out10     ;存放十进制形式输出的数据
        mov cx,10        ;以十进制形式输出
        mov bx,bp        ;机内数据所占字数
s4:
        mov bp,bx
        mov si,bp
        dec si
        shl si,1
        add si,offset Js_Jg
        xor dx,dx
s4p:        
        lodsw
        or ax,ax
        jnz s6
        dec bx
        dec bp           ;已经完全转换成十进制吗?
        jz s7            ;是,转去显示
        jmp s4p
s5:       
        lodsw            ;数据除以10
s6:        
        div cx           
        mov [si+2],ax
        dec bp
        jnz s5
        mov ax,dx        ;存储余数
        add al,'0'
        stosb
        jmp s4
s7:
        mov si,di        ;计算显示数据的起始地址
        inc si
        mov cx,out10     ;计算要显示数据的位数
        sub cx,di
        cld
s8: 
        lodsb
        mov dl,al
        mov ah,2
        int 21h
        loop s8          ;循环显示每一位
S9:         
        mov ah,4ch       ;结束
        int 21h

;跳过空格及制表符,DS:SI指向第一个有效字符
overs   proc near
        cld
        push ax
overs1:
        lodsb
        cmp al,' '       ;是空格吗?
        jz overs1
        cmp al,9         ;是制表符吗?
        jz overs1
        dec si
        cmp al,13        ;是回车(结束)符吗?
        pop ax
        ret
overs   endp

        
;取一个十进制数据,放在AX中返回
;若无数据可取,则CF=1
;否则,CF=0,AX中为取得的数据
input   proc near
        call overs      ;若已无数据,置CF=1
        jz input3
        push dx         ;保存寄存器
        push si         ;保存数据的起始地址
        xor dx,dx       ;DX用来暂存数据,初始化为0
input1:
        lodsb
        cmp al,'0'      ;是数字吗?
        jb input2
        cmp al,'9'
        ja input2
        sub al,'0'
        cbw
        push ax         ;计算dx*10+ax
        mov ax,10
        mul dx
        pop dx
        add dx,ax
        jmp input1      ;取下一位数据
input2:
        dec si          ;调整SI
        mov ax,dx       ;将数据送入AX
        pop dx
        cmp dx,si
        pop dx
        jb input4
input3:
        stc     
        ret
input4:
        clc 
        ret
input   endp      
        end start
;------------------------------------------------------------
D:\Masm615> ml Jch.asm
Microsoft (R) Macro Assembler Version 6.15.8803
        Patched for you by promethee [ECL] in the year 2001 - enjoy
Copyright (C) Microsoft Corp 1981-2000.  All rights reserved.

Assembling: Jch.asm

Microsoft (R) Segmented Executable Linker  Version 5.60.339 Dec  5 1994
Copyright (C) Microsoft Corp 1984-1993.  All rights reserved.

Object Modules [.obj]: Jch.obj /t
Run File [Jch.com]: "Jch.com"
List File [nul.map]: NUL
Libraries [.lib]:
Definitions File [nul.def]:

D:\Masm615>jch 6             ;计算6的阶乘
720
D:\Masm615>jch 100 > 100!    ;计算100的阶乘并改向输出到文件 100!

D:\Masm615>type 100!         ;显示100的阶乘的结果(可用Windows下的计算器验证结果)
93326215443944152681699238856266700490715968264381621
46859296389521759999322991560894146397615651828625369
7920827223758251185210916864000000000000000000000000
D:\Masm615>_

------------------------- 怜香 于 2002/12/5 ----------------------

板凳

好像不行吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册