主题:[讨论]问一个用汇编写编译器的问题(乘/除)(加分帖)
FlyerLrt
[专家分:10] 发布于 2006-05-17 23:34:00
因为要进行大数的运算,但要求乘除的两个数都是十进数,如:
1245856523*12457852=XXXXXXXXXX....
加法减法已经搞定了
但是乘法出发没有找出什么好的算法……
大家提意见啊
沙发
chenzep [专家分:3640] 发布于 2006-05-17 23:42:00
转人家的,自己看是否有用。
; 精确计算一个数据的阶乘,数据由命令行中给出!
; 文件名: 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 ----------------------