| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1529 人关注过本帖
标题:16位汇编写的一个杨辉三角
取消只看楼主 加入收藏
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用信箱有效在2012-10-6 17:04:25的发言:

接分
不速结贴不是好唐僧

速度结了  ~~
这个TS有点痴(迟)。。。

梅尚程荀
马谭杨奚







                                                       
2012-10-06 17:07
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
发现处理下双字除法后 能输出到16行哦 哈哈
发代码上来 也不排版了 算留个底稿 以后自己丢了程序就来论坛上找 嘿嘿
图片附件: 游客没有浏览图片的权限,请 登录注册

--
程序代码:
;#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
    db 128 dup(?)
stack ends

data segment
prompt          db '16 lines of Left angle Yang Hui triangle: ', 0dh, 0ah, '$'
endStr          db 0dh, 0ah, 'Press any key to continue', '$'
last            dw 300 dup (0)
next            dw 300 dup (0)
store           db 10 dup(?)
data ends

code segment
start:           ;; 初始化段寄存器
                 mov    ax, stack
                 mov    ss, ax
                 mov    sp, 128
                 mov    ax, data
                 mov    ds, ax

                 ;; 输出提示
                 lea    dx, prompt
                 mov    ah, 09h
                 int    21h               
            
                 ;; 确定顶部位置
                 mov    dh, 1
                 mov    ax, 160
                 mul    dh
                 mov    bx, ax
                 add    bx, ax
                 
                 ;; 关联显存
                 mov    ax, 0b800h
                 mov    es, ax               

                 ;; 循环处理三角中的每个数值 放入显存中
                 ;; 行列都从0下标开始
                 mov    cx, 15    ; 循环13次 处理除首行外的其他行    
                 mov    bp, 2        ; bp/2相当于一行的最大列                  
                 mov    last[0], 1    ; 输出0行0列
                 mov    es:[bx + 6], 31h
                 mov    es:[bx + 6 + 1], 2
                 add    bx, 160
        Set:     push   cx        ; cx压栈 便于内循环
                 mov    dx, 2        ; dx/2相当于内循环的列数 
                 mov    next[0], 1    ; 输出dx/2行0列
                 mov    es:[bx + 6], 31h
                 mov    es:[bx + 6 + 1], 2
        dis:     cmp    dx, bp    ; 比较内循环的自己列与最大列
                 je     SetOne    ; 相等就置1

                 ; 按规律处理下一行与上一行的值
                 ; 即C语言中的 a[i][j] = a[i - 1][j - 1] + a[i - 1][j]
                 ; 即next[di] = last[di] + last[di - 2]
                 mov    di, dx
                 mov    ax, last[di]
                 dec    di
                 dec     di
                 add    ax, last[di]
                 inc    di
                 inc     di
                 mov    next[di], ax
                 mov    ax, next[di]
                 ; 转到BCD码处理 将一个数的千 百 十 个 位分别放入对应的显存
                 call   TurnToBCD
                 inc    dx
                 inc    dx
                 jmp    dis  

        SetOne:  mov    si, dx   
                 mov    next[si], 1
                 mov    ax, next[si]
                 call    TurnToBCD                 

                 ;; 计算出next 后将其复制到last中 便于下次循环
                 push    di
                 mov    cx, dx
                 mov    di, 2
        SetOK:   mov    ax,  next[di]
                 mov    last[di], ax
                 inc    di
                 inc    di
                 loop   SetOK
                 pop    di              

                 ;; cx 出栈对应于Set循环 bp 加2 对应于dx 加2
                 ;; bx 加 160即显存换行
                 pop    cx
                 inc    bp
                 inc    bp
                 add    bx, 160
                 loop   Set               

                 ;; 设置光标 便于输出press any key to continue
                 mov    ah, 2
                 mov    bh, 0
                 mov    dh, 18
                 mov    dl, 0
                 int    10h               

                 lea    dx, endStr
                 mov    ah, 09h
                 int    21h               

                 ;; 查看结果 返回DOS
                 mov    ah, 01h
                 int    21h
                 mov    ah, 4ch
                 int    21h   
               
TurnToBCD:       ;;   分解一个数的千 百 十 个 位分别放入对应的显存    
                 push    bx
                 push    cx
                 push    dx
                 push    si
                 push    di
                 push    ax                 

                 ;;  确定一个数字占5个位置的显存                             
                 mov    ax, dx
                 mov    dl, 5
                 mul    dl
                 mov    di, ax           
                 pop    ax            

                 ;; 个位
                 mov    dx, 0
                 mov    cx, 10
                 div    cx
                 mov    cx, dx              
                 add    cl, 30h
                 mov    store[0], cl 
               
                 ;; 十位
                 mov    dx, 0
                 mov    cx, 10
                 div    cx
                 add    dx, 30h
                 mov    store[1], dl
                
                 ;; 百位
                 mov    ah, 0
                 mov    cl, 10
                 div    cl
                 add    ah, 30h
                 mov    store[2], ah
                 ;; 千位
                
                 mov    ah, 0
                 mov    cl, 10
                 div    cl
                 add    ah, 30h
                 mov    store[3], ah

                 ;; 输出到对应显存 前导为0则不输出
                 ;; 在这里有个疑问 也就是显存的输出必须从低到高输出
                 ;; 若是从高到低则前面的数据将被覆盖 只能显示最后一位 为什么?
                 mov    cl, store[3]
                 cmp    cl, 30h
                 jz     ok 

                 mov    es:[bx + di + 2], cl
                 mov    es:[bx + di + 3], 2
                 mov    cl, store[2]  
                 mov    es:[bx + di + 4], cl
                 mov    es:[bx + di + 5], 2  
                 mov    cl, store[1]               
                 mov    es:[bx + di + 6], cl
                 mov    es:[bx + di + 7], 2   
                 mov    cl, store[0]    
                 mov    es:[bx + di + 8], cl
                 mov    es:[bx + di + 9], 2
                 jmp     OK3
                   
    ok:          mov    cl, store[2]                
                 cmp    cl, 30h
                 jz     ok1 

                 mov    es:[bx + di + 4], cl
                 mov    es:[bx + di + 5], 2                  
                 mov    cl, store[1]              
                 mov    es:[bx + di + 6], cl
                 mov    es:[bx + di + 7], 2                    
                 mov    cl, store[0]    
                 mov    es:[bx + di + 8], cl
                 mov    es:[bx + di + 9], 2
                 jmp     OK3
                   
    ok1:         mov    cl, store[1]              
                 cmp    cl, 30h
                 jz    ok2 

                 mov    es:[bx + di + 6], cl
                 mov    es:[bx + di + 7], 2               
    ok2:         mov    cl, store[0]    
                 mov    es:[bx + di + 8], cl
                 mov    es:[bx + di + 9], 2
              
    OK3:         pop    di
                 pop    si
                 pop    dx
                 pop    cx
                 pop    bx
                 ret          
code ends

end start



[ 本帖最后由 有容就大 于 2012-10-6 20:09 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-10-06 17:09
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用zklhp在2012-10-6 19:46:38的发言:


你误会了

我的意思是 让你把你的编辑器里面的东西发出来 我看看和你帖出来的有多大区别

你发现没有 你帖的代码里面没有注释 但在你截图的源文件里是有的

还是你发的方式有问题 要不怎么贴不出来呢

呵呵 后面那个贴图是第二次修改后的
再后面那个不排版的程序代码是第三次修改的
上200行的程序 排版比较难搞啊。

算了 还是去排下版吧 。。。
看着也称透点

[ 本帖最后由 有容就大 于 2012-10-6 20:02 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-10-06 20:00
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 22楼 zklhp
嗯 做东西要一丝不苟 我错了。

梅尚程荀
马谭杨奚







                                                       
2012-10-06 20:19
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用Alar30在2012-10-6 20:05:41的发言:

杨辉三角。。
好久远的概念了

。。。C版经常有人写的哦

梅尚程荀
马谭杨奚







                                                       
2012-10-06 20:20
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 25楼 zklhp
这个错误和缺点多多 改了几次的还没 把握 排版又不咋地 不合加精标准啦 呵呵。

什么时候能有你那一副好身板 也急速搬砖。。。

梅尚程荀
马谭杨奚







                                                       
2012-10-06 20:39
快速回复:16位汇编写的一个杨辉三角
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029273 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved