| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1529 人关注过本帖
标题:16位汇编写的一个杨辉三角
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
膜拜大牛!

授人以渔,不授人以鱼。
2012-10-06 12:32
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用TonyDeng在2012-10-6 12:32:23的发言:

膜拜大牛!

大牛上的一根毛。别膜。。。

梅尚程荀
马谭杨奚







                                                       
2012-10-06 14:21
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
试试截图发程序 呵呵
够麻烦的
图片附件: 游客没有浏览图片的权限,请 登录注册

--
图片附件: 游客没有浏览图片的权限,请 登录注册

---
图片附件: 游客没有浏览图片的权限,请 登录注册

--
图片附件: 游客没有浏览图片的权限,请 登录注册

--
图片附件: 游客没有浏览图片的权限,请 登录注册

--
图片附件: 游客没有浏览图片的权限,请 登录注册




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

梅尚程荀
马谭杨奚







                                                       
2012-10-06 14:32
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
6 7图的注释有点错 晕以后不搞这个玩意了 修改都麻烦。。。
图片附件: 游客没有浏览图片的权限,请 登录注册


梅尚程荀
马谭杨奚







                                                       
2012-10-06 14:46
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:5 
接分
不速结贴不是好唐僧
2012-10-06 17:04
有容就大
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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用有容就大在2012-10-6 14:46:16的发言:

6 7图的注释有点错 晕以后不搞这个玩意了 修改都麻烦。。。

你误会了

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

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

还是你发的方式有问题 要不怎么贴不出来呢
2012-10-06 19:46
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用有容就大在2012-10-6 17:09:35的发言:

发现处理下双字除法后 能输出到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:6], 31h
                 mov    es:6 + 1], 2
                 add    bx, 160
        Set:     push   cx        ; cx压栈 便于内循环
                 mov    dx, 2        ; dx/2相当于内循环的列数  
                 mov    next[0], 1    ; 输出dx/2行0列
                 mov    es:6], 31h
                 mov    es:6 + 1], 2
        dis:     cmp    dx, bp    ; 比较内循环的自己列与最大列
                 je     SetOne    ; 相等就置1
 
                 ; 按规律处理下一行与上一行的值
                 ; 即C语言中的 a[j] = a[j - 1] + a[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
            
 
             ;; 个位
           ; lea     si, store
             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:2], cl
                 mov    es:3], 2
 
             mov    cl, store[2]  
 
                 mov    es:4], cl
                 mov    es:5], 2
 
 
                 mov    cl, store[1]               
 
                 mov    es:6], cl
                 mov    es:7], 2   
 
 
             mov    cl, store[0]   
 
                 mov    es:8], cl
                 mov    es:9], 2
                   jmp     OK3
                  
 
    ok:         mov    cl, store[2]                 
 
                cmp    cl, 30h
                 jz     ok1
                 mov    es:4], cl
                 mov    es:5], 2
                 
 
               mov    cl, store[1]               
 
                 mov    es:6], cl
                 mov    es:7], 2                  
 
 
 
             mov    cl, store[0]   
 
                 mov    es:8], cl
                 mov    es:9], 2
                 jmp     OK3   
 
                 
 
    ok1:         mov    cl, store[1]               
 
                 cmp    cl, 30h
                 jz    ok2
                 mov    es:6], cl
                 mov    es:7], 2               
 
        ok2:        
 
             mov    cl, store[0]   
 
                 mov    es:8], cl
                 mov    es:9], 2
               
 
        OK3:      pop    di
                 pop    si
                 pop    dx
                 pop    cx
                 pop    bx
                ret           
 
code ends
 
end start

你排的好看一点这个也可以算精华 比较这个版原创的东西不多啊。。
2012-10-06 19:47
有容就大
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
快速回复:16位汇编写的一个杨辉三角
数据加载中...
 
   



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

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