注册 登录
编程论坛 汇编论坛

汇编大数相加。

有容就大 发布于 2012-10-02 21:54, 1468 次点击
搞了N久 搞出了大数相加,不过很原始啊 AAA指令都没用 因为不知道怎么用
有兴趣大家可以看下 讨论下更好的办法。。。
先上结果图  不知道有BUG没?
只有本站会员才能查看附件,请 登录


程序代码:
;#Mode=DOS
;
MASMPlus 单文件代码模板 - 纯 DOS 程序
;
--------------------------------------------------------------------
;
单个文件需要指定编译模式,否则默认是EXE方式,在系统设置中可以设置默认是DOS还是Windows.
;
编译模式自带了DOS/COM/CON/EXE/DLL/LIB这几种,如果有必要,可以更改ide.ini添加新的编译模式
;
当然,更好的是创建为一个工程.更方便及易于管理,使用方法:按Ctrl多选->创建工程.必须有多个文件

assume cs:code, ds:data, ss:stack
stack segment
        dw    200 dup(?)
stack ends

data    segment
    stra     db    'Please input  a:  ', '$'
    strb     db    'Please input  b:  ', '$'
    strc     db    'The resut a + b = ', '$'
    bufa     db 100
        lena db ?
             db 100 dup(?)
    bufb     db 100
        lenb db ?
             db 100 dup(?)
    tempa    db 101 dup(0)
    tempb    db 101 dup(0)
    rslt     db 200 dup(0)
data    ends
code    segment
start:              mov    ax, data
                    mov    ds, ax
                    mov    es, ax                     

                    mov    ax, stack
                    mov    ss, ax
                    mov    sp, 200                  

                    mov    dx, offset stra
                    mov    ah, 9
                    int   21h                  
                  
                    mov    ah, 10
                    mov    dx, offset bufa
                    int    21h                  

                    mov    cl, lena
                    mov    ch, 0
                    mov    si, offset bufa
                    add    si, cx
                    inc     si
                    mov    di, offset tempa
   convert_stra:    mov    dl, BYTE ptr [si]
                    sub     dl, 30h
                    mov    BYTE ptr [di], dl
                    dec    si
                    inc     di
                    loop     convert_stra                                         

                    call     crlf
                  
                    mov    dx, offset strb
                    mov    ah, 9
                    int     21h
                  
                    mov    dx, offset bufb
                    mov     ah, 10
                    int    21h
                    mov    cl, lenb
                    mov    ch, 0               

                    mov    di, offset tempb
                    mov    si, offset bufb
                    add    si, cx
                    inc    si
   convert_strb:    mov    dl, BYTE ptr [si]
                    sub    dl, 30h
                    mov    BYTE ptr [di], dl
                    dec     si
                    inc     di
                    loop    convert_strb                     

                    mov    ch, 0
                    mov    cl, lena
                    cmp    cl, lenb
                    ja    addnow
                    mov    cl, lenb
     addnow:        add     cx, 1
                    mov    dx, cx
                    mov    bl, 0
                    mov    si, offset tempa
                    mov    di, offset tempb               

        addloop:    mov     al, BYTE ptr [si]
                    add    al, BYTE ptr [di]
                    add    al, bl
                    cmp   al, 9
                    ja    adjust
                    mov    bl, 0
                    jmp   notadj
         adjust:    add    al, 6
                    and    al, 00001111b
                    mov    bl, 1
        notadj:     add    al, 30h
                    mov    ah, 0
                    push     ax
                    inc    di
                    inc     si
                    loop  addloop
                  
                    mov    si, offset rslt
                    pop   bx
                    cmp    bl, '0'
                    je    storerslt
                    mov    BYTE ptr [si], bl
                    inc    si
        storerslt:  mov   cx, dx
                    dec    cx                  
         storeloop: pop     bx
                    mov    BYTE ptr [si], bl
                    inc     si
                    loop     storeloop
                  
                    mov    al, '$'
                    mov    BYTE ptr [si], al
                  
                    call     crlf
                  
                    mov    dx, offset strc
                    mov    ah, 9
                    int     21h
                              
                    mov    dx, offset rslt
                    mov    ah, 9  
                    int     21h
                  
                    mov    ah, 1
                    int    21h
                    mov    ah, 4ch
                    int     21h
                  
crlf:               mov    dl, 13
                    mov    ah, 2
                    int    21h
                    mov    dl, 10
                    mov    ah, 2
                    int    21h
                    ret
code    ends

end    start
为什么 帖程序老是会不按原来的排版出现 短的还能自己改下 长的就太难看了 很多次了啊
特别是对我这种爱帖程序的人 伤不起啊

[ 本帖最后由 有容就大 于 2012-10-2 22:04 编辑 ]
19 回复
#2
zklhp2012-10-02 21:57
我是来膜拜的楼主的

贴代码是这样 代码中的TAB帖上来就变成4个空格了 而在编辑器中 TAB的宽带其实是考虑对齐的 所以 可能会对不齐
#3
有容就大2012-10-02 22:02
回复 2楼 zklhp
这样啊 但是也常发现一个空行的间隔 会变成3到4行? 莫非是当时写程序的时候确实ENTER了几次 然后又把光标移动到只有一行间距的那行去了?

#4
zklhp2012-10-02 22:05
以下是引用有容就大在2012-10-2 22:02:18的发言:

这样啊 但是也常发现一个空行的间隔 会变成3到4行? 莫非是当时写程序的时候确实ENTER了几次 然后又把光标移动到只有一行间距的那行去了?
这个不知道


这下面有一行空行



程序代码:

这下面有两行空行




程序代码:

这下面有三行空行





程序代码:

这下面有四行空行





#5
zklhp2012-10-02 22:07
刚试了 手工打的没有问题 你找一下你的代码 换不同编辑器打开或用记事本打开 看看是不是显示的问题

马上结题算了
#6
有容就大2012-10-02 22:08
回复 4楼 zklhp
可能是那么的。。。
Z版 有什么好建议吗
我这个太绕了 如果沿这个思路再做乘法 除法 那就更绕了
#7
zklhp2012-10-02 22:10
以下是引用有容就大在2012-10-2 22:08:38的发言:

可能是那么的。。。
Z版 有什么好建议吗
我这个太绕了 如果沿这个思路再做乘法 除法 那就更绕了

这还绕 你实现一个带小数点的看看就知道绕不饶了。。。
#8
有容就大2012-10-02 22:13
回复 7楼 zklhp
哇 小数点 。。。。。。这个 这个 有挑战性
#9
zklhp2012-10-02 22:14
只有本站会员才能查看附件,请 登录


我曾经写过一个 你看看这里面判断的层数就知道了 貌似有上千行的C语言 才只实现了带小数的加减
#10
有容就大2012-10-02 22:14
听你的 速度结了。。。
#11
有容就大2012-10-02 22:15
以下是引用zklhp在2012-10-2 22:14:45的发言:



我曾经写过一个 你看看这里面判断的层数就知道了 貌似有上千行的C语言 才只实现了带小数的加减

图点不出来? 不能放大?
#12
有容就大2012-10-02 22:16
回复 9楼 zklhp
你这个是C语言写的?
#13
有容就大2012-10-02 22:18
不是吧 结题就去另外的地方搬砖了?
看来以后要慢点结

#14
zklhp2012-10-02 22:26
C写的 不是为了让你看字 所以缩小了

要睡觉了 明天还得搬砖 手机发帖。。。
#15
有容就大2012-10-02 22:28
以下是引用zklhp在2012-10-2 22:26:57的发言:

C写的 不是为了让你看字 所以缩小了
 
要睡觉了 明天还得搬砖 手机发帖。。。

难怪 。。。
用手机上论坛 也伤不起啊
#16
zhu2240392012-10-03 00:37
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
#17
fz46284132012-11-06 09:32
版主~1、2为什么要这么做

;初始状态:AL,BL存放的是两个个位数

    ADD    AL, BL
    CMP    AL, 9
    JA     adjust    ;---大于9,跳转adujust进行进位处理
    MOV    BL, 0     ;---记录进位情况
    JMP    notadj     ;---请无视之
adjust:   
        ;---应该是取余,但是不明白这样是怎么做到的
    ADD    AL, 00000110B     ;1
    AND    AL, 00001111B     ;2
        MOV    BL, 1
#18
有容就大2012-11-06 12:39
回复 17楼 fz4628413
这个你可以去了解下DAA 和 AAA指令 机制差不多。
#19
bingghost2012-11-06 16:43
膜拜楼主

记得以前有个 4行代码计算1W的阶乘的
http://blog.

俺也写过1个大数的阶乘  效率极低
算1W的阶乘用了14秒....
人家是秒掉  这就是差距啊
#20
有容就大2012-11-06 22:36
回复 19楼 bingghost
咋一看 吓我一跳 我还以为是汇编四行代码解决的
1