标题:16位汇编写的一个杨辉三角
只看楼主
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
结帖率:99.34%
已结贴  问题点数:20 回复次数:25 
16位汇编写的一个杨辉三角
杨辉三角在C语言里很常见
下面是C代码和效果图
程序代码:
#include<stdio.h>
#define M 12
int main(void)
{
    int a[M][M], i, j;
    printf("\n\n\n");
    for (i = 0; i < M; i++)
    {
        printf("        ");
        for (j = 0; j <= i; j++)
        {
            if (i == j || j == 0)
                a[i][j] = 1;
            else
                a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
            printf("%-4d", a[i][j]);
            if (i == j)

                printf("\n");
        }
    }
        return 0;
}
---

现在 汇编来实现这个目的
不过我做这个有点限制 就是限制在12行 即最大数能到百位 要搞更多行可以对程序做出适当的修改。
上代码和效果图, 有兴趣的看看, 那里可以改进下。
=====
程序代码:
;#Mode=DOS
;MASMPlus 单文件代码模板 - 纯 DOS 程序
;--------------------------------------------------------------------
;--------------------------------------------------------------------
; program name:             Yang Hui triangle
; producer:                yrjd
; program function:            Show the Yang Hui triangle as Left angle
; produce data:                2012-10-5

;--------------------------------------------------------------------

assume cs:code, ds:data, ss:stack

stack    segment
    db 128 dup(?)
stack ends

data segment
prompt          db '12 lines of Left angle Yang Hui triangle: ', 0dh, 0ah, '$'
endStr          db 0dh, 0ah, 'Press any key to continue', '$'
last            db 20 dup (0)
next            db 20 dup (0)
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, 4
                 mov    dl, 8
                 mov    ax, 160
                 mul    dh
                 mov    bx, ax
                 mov    ax, 2
                 mul    dl
                 add    bx, ax
                

                 mov    ax, 0b800h
                 mov    es, ax
                

                 mov    cx, 11
                 mov    bp, 1
                 mov    last[0], 1
                 mov    es:[bx + 6], 31h
                 mov    es:[bx + 6 + 1], 2
                 add    bx, 160
        Set:     push    cx
                mov    dx, 1
                mov    next[0], 1
                mov    es:[bx + 6], 31h
                 mov    es:[bx + 6 + 1], 2
        dis:        cmp    dx, bp
                je    SetOne
                mov    di, dx
                mov    al, BYTE ptr last[di]
                dec    di
                add    al, last[di]
                inc    di
                mov    next[di], al
                mov    al, next[di]
                call    TurnToBCD
                inc    dx
                jmp    dis
        SetOne:        mov    si, dx
                mov    next[si], 1
                mov    al, next[si]

                call    TurnToBCD
                

                 push    di
                 mov    cx, dx
                 mov    di, 1
        SetOK:        mov    ah, BYTE ptr next[di]
                mov    BYTE ptr last[di], ah
                inc     di
                loop    SetOK
                pop    di
               

                pop    cx
                inc    bp
                add    bx, 160
                loop     Set
               

                mov    ah, 2
                mov    bh, 0
                mov    dh, 17
                mov    dl, 0
                int     10h
               

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

                mov    ah, 01h
                 int    21h
                 mov    ah, 4ch
                 int    21h   

                

TurnToBCD:           

                push    bx
                push    cx
                push    dx
                push    si
                push    di
                push     ax
                push    ax
                                               

                mov    ax, dx
                mov    dl, 8
                mul    dl
                mov    di, ax
                pop    ax
               


                mov    ah, 0
                mov    cl, 10
                div    cl
                add    ah, 30h
                mov    dl, ah
               

                mov    ah, 0
                mov    cl, 10
                div    cl
                add    ah, 30h
                mov    dh, ah
               

                mov    ah, 0
                mov    cl, 10
                div    cl
                add    ah, 30h
                mov    ch, ah
               


                

                 cmp    ch, 30h
                 jz    ok1
                mov    es:[bx + di + 2], ch
                 mov    es:[bx + di + 3], 2
                

        ok1:         cmp    dh, 30h
                jz    ok2
                mov    es:[bx + di + 4], dh
                 mov    es:[bx + di + 5], 2
                

        ok2:        

                 mov    es:[bx + di + 6], dl
                 mov    es:[bx + di + 7], 2
           

            OK:     pop    ax
                 pop    di
                 pop    si
                 pop    dx
                 pop    cx
                 pop    bx

                ret           

code ends

end start
----

对贴上去的排版无语 以后有时间修正下 稍微加点注释。。。
眼冒金星了 睡觉去。
搜索更多相关主题的帖子: 效果图 C语言 杨辉三角 
2012-10-06 01:58
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
我晕 真是昏头了 我要发到汇编版的 怎么发到C版了
麻烦版主们看到后速度移贴
我没有来C版显摆的意思啊 脑袋被搞昏了

梅尚程荀
马谭杨奚







                                                       
2012-10-06 02:02
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
咦 发现最后一行不对头。。。
擦 算了 明天再搞 、、、、

梅尚程荀
马谭杨奚







                                                       
2012-10-06 02:04
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
得分:0 
顶啊

实现自己既定的目标,必须能耐得住寂寞单干。
2012-10-06 10:38
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:5 
你截个代码在编辑器里的图呗
2012-10-06 10:46
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 4楼 小习小习
谢谢 。。。


梅尚程荀
马谭杨奚







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

你截个代码在编辑器里的图呗

呵呵 这倒是个办法不过比较长。。。

现在早到问题所在了 原来用al来存放三角里的值 到大于256后就会溢出 所以第12行就乱来了
还好 我定的是12行 刚开始定的是10行 如果那样就发现不了这个问题了

梅尚程荀
马谭杨奚







                                                       
2012-10-06 11:05
小习小习
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:6
帖 子:1467
专家分:4792
注 册:2012-7-2
得分:5 
回复 7楼 有容就大
大哥,得多发一下你的实验程序,让我们学习啊

实现自己既定的目标,必须能耐得住寂寞单干。
2012-10-06 11:48
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
以下是引用小习小习在2012-10-6 11:48:09的发言:

大哥,得多发一下你的实验程序,让我们学习啊

王爽的那书答案我发到论坛下载区了 有兴趣可以去看看

https://down.bccn.net/3252.html

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

梅尚程荀
马谭杨奚







                                                       
2012-10-06 12:28
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
终于搞定了 不过DOS的显存一行只能有80个字符
最大限制只能显示14行 。。。

不过比较欣慰的是能处理一个word宽度了
等下注释好了发程序上来 。。。

梅尚程荀
马谭杨奚







                                                       
2012-10-06 12:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-382590-1-1.html




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

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