求两数相加精确值

marknnnnn 2016-04-13 07:51:30
计算任意两个正整数相加的精确值(设它们的位数不超过50十进制位),要求这两个整数从键盘输入,运算后的结果在屏幕上打印。
提示:
8086提供16BIT+16BIT的加法指令,当相加的数大于16位时,就不能直接使用加法指令了。我们先将两个正整数以字符的形式存放在数组(字符串)里,然后再逐位相加,加完的结果也以字符的形式存在一个数组里(字符串)。
为了实现两个数字的个位对齐,可以先将键盘输入的字符串进行反序处理。这样就实现了个位对齐,因为从键盘输入数据时,个位数是最后一个输入的。运算结果也要进行反序处理,这样就做到了高位在前,低位在后。
注意1,在显示结果时,不要把数字前面的无效0显示出来。
注意2,要对输入的字符串进行检测,如出现非数字的情况,则停止计算。

大神帮忙看一下,谢谢!
...全文
658 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_23107797 2016-04-15
  • 打赏
  • 举报
回复
这是以前写的…. 由键盘输入两个50以内的十进位数,相加显示结果 第一句 max_num equ 50 中的50可以改, 20000 以内的十进位应该没问题(受限于64K)…但可能手会抽搐… 因为是COM格式,编译EXE后再转成COM 编译方法 MASM 5.1 MASM ADD.ASM LINK ADD.OBJ EXE2BIN ADD.EXE ADD.COM MASM 6.X ML ADD.ASM /AT

max_num         equ     50

cseg            segment
		assume cs:cseg,ds:cseg,es:cseg
		org	100h
begin:		jmp	start

intro_msg       db      10,13,'Input two integer Value:$'
first_msg       db      10,13,'First  value (50 digit):$'
second_msg      db      10,13,'Second value (50 digit):$'
sum_msg         db      10,13,9h,9h,'  Sum = $'
sum             db      max_num + 1 dup (0)
sign            db      '$'
first           db      max_num + 1 dup (0)
second          db      max_num + 1 dup (0)

start:          mov     dx,offset intro_msg
                call    print_msg
                mov     dx,offset first_msg
		call	print_msg
                mov     di,offset first
                call    input_num
                mov     si,offset first[max_num]
                mov     cx,max_num
                call    move_byte

                mov     dx,offset second_msg
                call    print_msg
                mov     di,offset second
                call    input_num
                mov     si,offset second[max_num]
                mov     cx,max_num
                call    move_byte

                mov     si,max_num
                mov     cx,max_num +1
                call    _ADD

                mov     dx,offset sum_msg
                call    print_msg
                mov     si,offset sum

relocate:       lodsb
                cmp     al,'0'
                jz      relocate
                dec     si
                mov     dx,si
                call    print_msg

exit:           mov     ah,4ch
                int     21h                     ;quit program

;----------------------------------------------------------
print_msg:      mov     ah,09h                  ;print string function call
		int	21h
		ret
;----------------------------------------------------------
Input_num:
; input di = offset end of buffers

                cld
                mov     bp,max_num
j5:             mov     ah,0
                int     16h
                cmp     al,1bh
                jnz     j7
                int     20h
j7:             cmp     al,08h
                jnz     j10
                cmp     bp,max_num
                jz      j5
                mov     dl,al
                mov     ah,02h
                int     21h
                mov     ah,07h
                mov     al,' '
                mov     cx,1
                mov     bl,ah                ;attrib of byte
                mov     ah,9                 ;write a byte to screen
                mov     bh,0                 ;now_page
                int     10h
                inc     bp
                dec     di
                mov     word ptr [di],0
                jmp     j5

j10:            cmp     al,0dh
                jnz     j20
                cmp     bp,max_num
                jnz     j40

j20:            cmp     bp,0
                jz      j5
                cmp     al,'0'
                ja      j30
                jb      j5
                cmp     bp,max_num
                jz      j5

j30:            cmp     al,'9'
                ja      j5
                stosb
                mov     dl,al
                mov     ah,02
                int     21h
                dec     bp
                jmp     j5
j40:            ret
;----------------------------------------------------------
move_byte:
                std
                mov     bp,0
move1:          mov     bx,si
                mov     dx,cx
                lodsb
                cmp     al,0
                jnz     move9
                mov     di,si
                inc     di
                rep     movsb
                inc     bp
                mov     cx,dx
                mov     si,bx
                dec     cx
                jmp     move1

move9:          cld
                cmp     bp,0
                jz      move10
                mov     di,bx
                sub     di,max_num
                mov     al,'0'
                mov     cx,bp
                rep     stosb

move10:         ret
;----------------------------------------------------------
_add:
;input: si position of last bytes
;       cx number of bytes

                mov     bl,0
_add1:          mov     al,second[si]
                mov     ah,first[si]
                add     al,ah
                add     al,bl
                mov     bl,0
                sub     al,30h
                cmp     al,39h
                jbe     _add2
                sub     al,10
                mov     bl,1
_add2:          mov     sum[si],al
                dec     si
                loop    _add1
                ret

;----------------------------------------------------------
cseg            ends
		end   begin		      ;	end program

zara 2016-04-14
  • 打赏
  • 举报
回复
这个,好像有些复杂的,网上也有不少的例子吧,搜索“大数相加”试试;前几天这里也看到个帖子的,或可参考:http://bbs.csdn.net/topics/391930233

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧