鱼C论坛

 找回密码
 立即注册
查看: 2813|回复: 0

[技术交流] 任意大小数 乘法 的程序。发出来给大家分享下,勿喷 绝对原创

[复制链接]
回帖奖励 10 鱼币 回复本帖可获得 1 鱼币奖励! 每人限 1 次(中奖概率 70%)
发表于 2011-9-18 11:39:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 957591782 于 2012-2-13 11:42 编辑

      stacks  segment   stack       ;堆栈段
              dw        128 dup(?)
      stacks  ends
      
       datas  segment               ;数据段
         one  db        100d
              db        0
              db        100d    dup(0)
         two  db        100d
              db        0
              db        100d   dup(0)
        diyi  db        300d dup(0) ;第一个数的位数 ,得数保存在这里
        dier  db        300d dup(0) ;第二个数的位数
     baohudi  dw        0
      kakama  db        0           ;进位变量
       datas  ends
      
       codes  segment               ;代码段
              assume    cs:codes,ds:datas
      start:  mov       ax,datas    ;初始化
              mov       ds,ax
              mov       es,ax
      huiche  macro                 ;换行宏
              push      dx
              push      ax
              mov       dl,0dh
              mov       ah,02h
              int       21h
              mov       dl,0ah
              mov       ah,02h
              int       21h
              pop       ax
              pop       dx
              endm
              
              lea       dx,one
              mov       ah,10d
              int       21h
              huiche
              lea       dx,two
              mov       ah,10d
              int       21h
              xor       cx,cx
              and       byte ptr kakama,00000000b
              mov       cl,[one+1]
              add       cl,[two+1]
;开始
              xor       ax,ax
              xor       cx,cx
              mov       cl,[two+1]
              clc
              xor       dx,dx
              mov       dl,[two+1]
              mov       di,dx
              mov       dl,[one+1]
              add       di,dx
              dec       di
              mov       baohudi,di
              lea       si,two
              inc       si
              xor       ax,ax
              mov       al,[two+1]
              add       si,ax
    waiceng:  lea       bx,one
              inc       bx
              add       bl,[one+1]
              push      cx          ;保护,下面就进入内层循环了。外层循环时候再弹出
              push      di          ;保护
              clc                   ;清进位
              lahf                  ;取
              xor       cx,cx
              mov       cl,[one+1]  ;内层循环次数
              jisuan:   mov al,ds:[bx]
              and       al,00001111b
              mov       dl,byte ptr ds:[si]
              and       dl,00001111b
              mul       dl
              aam
              sahf                  ;置
              add       al,kakama
              aaa
              mov       kakama,ah
              lahf                  ;取
              mov       [dier+di],al
              dec       di
              dec       bx
              loop      jisuan      ;内层
;特殊处理,这里处理的是判断有没有最高的进位。      
              sahf                  ;置
              xor       al,al
              adc       al,kakama
              mov       [dier+di],al
;开始相加处理         
              push      ax
              push      bx
              clc
              lahf
              mov       di,baohudi
              mov       cx,di       ;循环相加次数
              inc       cx
              jiachuli:         mov al,[diyi+di]
              sahf
              adc       al,[dier+di]
              aaa
              lahf
              mov       [diyi+di],al
              dec       di
              loop      jiachuli
              pop       bx
              pop       ax
;相加处理结束                           
              dec       si
              mov       di,baohudi
              mov       cx,di
              inc       cx
   qingkong:  and       byte ptr [dier+di],00000000b
              dec       di
              loop      qingkong    ;将dier数组清空
              pop       di
              pop       cx
              and       kakama,00000000b        ;进位变量清零
              dec       di
              loop      waiceng
;输出-start
              mov       cx,baohudi
              inc       cx          ;其中保存的只是偏移还需加1 才能得出循环的次数
              mov       si,0
              dec       si        
  chuliling:  inc       si         
              cmp       [diyi+si],0
              loopz     chuliling
              inc       cx          ;循环出来还得将cx加1,因为循环的原因会多减一次
              huiche                ;换行
     shuchu:  mov       dl,[diyi+si]
              add       dl,30h
              mov       ah,02h
              int       21h
              inc       si
              loop      shuchu
              mov       ax,4c00h    ;退出程序
              int       21h
       codes  ends
              end       start

评分

参与人数 1鱼币 +2 收起 理由
冬冬 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表