汇编语言实现打印杨辉三角

计算杨辉三角形的前n(n<=10)行,并显示在屏幕上。要求计算及显示
用子程序形式实现。其显示格式为:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

CODE SEGMENT
 ASSUME CS:CODE,DS:CODE
 org 100h
 START: jmp begin
message db 13,10,9,'Input N(N<=10): $'
error db 13,10,9,'Data out of range!$'
begin:
 push cs
 pop ds
 mov dx,offset message
 mov ah,9
 int 21h

 call shur
 cmp bp,10
 jbe goon
 mov dx,offset error
 mov ah,9
 int 21h
 jmp exit
goon:
 mov ax,0e0dh
 int 10h
 mov al,0ah
 int 10h
push bp
 call yhsj
exit:
 mov ah,0
 int 16h
 mov ah,4ch
 int 21h

shur proc
push cx
push bx
xor bp,bp
mov bx,10
mov cx,2
input:
mov ah,0 ;键盘输入数据
int 16h
cmp al,0dh ;以回车结束输入
jz ok
cmp al,'0' ;只允许输入0~9
jb input
cmp al,'9'
ja input
mov ah,0eh ;显示有效输入
int 10h
sub al,30h ;化ASCII为HEX
cbw ;字节扩展为字
xchg ax,bp
mul bx ;扩大10倍
add bp,ax ;加一位
loop input
ok:nop ;数值结果在BP中
;恢复用到的寄存器
pop bx
pop cx
ret
shur endp

; 输出杨辉三角的函数,接受一个栈上的参数N
; 输出N阶杨辉三角
yhsj:
 mov bp, sp
 mov ax, [bp+2]  ; 保存N到ax
 shr ax, 1  ; N = N / 2
 push ax
 mov ax, [bp+2]  ; 保存N到ax
 push ax
 call C; C(N, N/2)获取最后一行中间的那个值,即最大值
 call getdigit   ; 计算该最大值的长度,如252则返回3
 mov cx, ax ; 保存最大长度到cx,用于事后格式用
 xor di, di ; 外层循环计数di,外层循环输出每一行
 jmp cp1
up1:
 inc di; 更新di
cp1:
 cmp di, [bp+2]  ; 测试循环条件,循环N次
 jg done1
 mov ax, [bp+2]  ; 以下3句计算行前空格数 = (N-i)*cl,cl是最大长度
 sub ax, di
 mul cl
 call showspace  ; 输出行前空格
 xor si, si ; 内存循环计数si,内层循环输出一行中的每个数
 jmp cp2
up2:
 inc si; 更新di
cp2:
 cmp si, di ; 测试循环条件,循环di次
 jg done2
 push si
 push di
 call C; 获取该行的位于si位置的组合数,调用C(di, si)
 push ax   ; 保存该组合数
 call show  ; 输出该数
 mov ax, cx ;┒以下3句输出数字间间隔空格,个数 = N - 1
 sub ax, 1  ;┃
 call showspace  ;┚
 pop ax;┒
 call getdigit   ;┃获取该组合数长度
 mov bx, ax ;┃
 mov ax, cx ;┃
 sub ax, bx ;┃计算需要填充的空格数 = 最大长度 - 该数长度 + 1
 add ax, 1  ;┃本来应该先填充再输出数字间空格,顺序反过来是为了左对齐
 call showspace  ;┚以上打括号的2段反过来是正常的顺序
 jmp up2   ; 更新内层循环
done2: ; 内层循环结束
 mov ah, 2  ; 以下5句实现换行
 mov dl, 13
 int 21h
 mov dl, 10
 int 21h
 jmp up1   ; 更新外层循环
done1: ; 外层循环结束
 ret 2 ; 释放函数参数使用的栈空间

; 求组合数的递归函数,接受栈上的2个参数n, m(n > m)
; 返回C(n, m),即n选m的个数
; 算法是:
; { C(n, m) = 1 (n < m 或 m = 0)
; { C(n, m) = C(n-1, m-1) + C(n-1, m) (n > m)
; 即某位置组合数等于上一行左右两数之和
C:
 push bp
 mov bp, sp
 sub sp, 2  ; 预留一个存储位置
 mov bx, [bp+6]  ; 保存m到bx
 cmp bx, [bp+4]  ; 如果m > n 返回1
 jz L1
 cmp bx, 0  ; 如果m = 0 返回1
 jz L1
 mov ax, [bp+4]  ; 保存n到ax
 dec ax; ax = ax - 1
 dec bx; bx = bx - 1
 push bx
 push ax
 call C; 返回上一行左边的那个数
 mov [bp-2], ax  ; 保存左肩膀上的数
 mov ax, [bp+4]  ; 以下5句同理,返回上一行右肩膀上的数
 dec ax
 push [bp+6]
 push ax
 call C
 add ax, [bp-2]  ; 和左肩膀上的数相加得出该组合数
 jmp L2
L1:
 mov ax, 1
L2:
 mov sp, bp
 pop bp
 ret 4 ; ax返回组合数

; 递归以10进制输出ax
; 方法很简单,就是求出余数,然后ax = ax / 10
; ax = 0时退出,开始逆序输出求出的各位余数
show:
 mov bx, 10
 cmp ax, 0
 jz ok1
 div bl
 push ax
 and ax, 00ffh
 call show
 pop dx
 mov dl, dh
 or dl, 30h
 mov ah, 2
 int 21h
ok1:
 ret

; 获取一个数的长度,ax为参数,如果ax = 252则返回3
; ax里是返回值
getdigit:
 mov bx, 10
 xor dx, dx
next:
 cmp ax, 0
 jle ok2
 div bl
 and ax, 0ffh
 inc dx
 jmp next
ok2:
 mov ax, dx
 ret

; 输出ax个空格,参数ax,无返回值
showspace:
 mov bx, ax
 mov ah, 2
 mov dl, ' '
nexts:
 cmp bx, 0
 jle dones
 int 21h
 dec bx
 jmp nexts
dones:
 ret

 CODE ENDS
 END START

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# 中杨辉三角的实现

    C# 中杨辉三角的实现 问题描述:创建一个程序来求三角形.该程序提示用户输入数据,然后显示出杨辉三角的规律. // 输入描述:杨辉三角长,代表数值 // 程序输出:杨辉三角 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication2 { class Program { static void Main(string[] arg

  • 使用python生成杨辉三角形的示例代码

    杨辉三角杨辉 定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / \ 1 5 10 10 5 1 把每一行看做一个list,试写一个generator,不断输出下一行的list: def triangles(): L = [1] while True: yield L M=L[:]#复制一个list,这样才不会影响到原有的list.不然results里的每个列表

  • 用java实现杨辉三角的示例代码

    之前有学弟问过我一道java的面试题,题目不算难.用java实现杨辉三角.我花了点时间整理了一下,发现挺有意思的,于是想写下来分享一下.在写代码之前,我们先理清下面两个问题. 什么是杨辉三角 杨辉三角,是二项式系数在三角形中的一种几何排列.在我国南宋数学家杨辉1261年所著的<详解九章算法>有提到过.在欧洲叫做帕斯卡三角形,如图. 杨辉三角 杨辉三角的规律即原理 1.每个数等于它上方两数之和. 2.每行数字左右对称,由1开始逐渐变大. 3.第n行的数字有n项. 4.第n行数字和为2n-1. 5

  • C语言在屏幕上输出杨辉三角

    这就是杨辉三角,也叫贾宪三角.这于我们现在的学习联系最紧密的是2项式乘方展开式的系数规律.如图,在贾宪三角中,第3行的第三个数恰好对应着两数和的平方公式依次下去. 杨辉三角是一个由数字排列成的三角形数表,一般形式如下: ................................................. 杨辉三角的规律是:它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和. 代码如下: #include<stdio.h> #include<stdlib.h

  • PHP写杨辉三角实例代码

    复制代码 代码如下: <?php //杨辉三角 for ($i=6;$i >= 0;$i--) { for ($j=$i;$j <= 6;$j++) { if ($j <= 6-1) { echo "<b>a</b>"; }else { echo "<br />"; } } } ?> PHP打印杨辉三角自定义 复制代码 代码如下: <form method="post" ac

  • C语言小程序 杨辉三角示例代码

    复制代码 代码如下: #include <stdio.h>#include <stdlib.h>int main(){ int i,j,k; int line; int *prev, *next; printf("输入要查看杨辉三角的行数(大于2):"); scanf("%d",&line); if(line < 2) {  printf("行数小于2,Goodbye!\n");  exit(1); } fo

  • C语言打印杨辉三角示例汇总

    杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一.在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1.也就是说任何一个数等于这个是高中的组合数.n代表行数减1,不代表列数减1.如:第五行的第三个数就为=6. 现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数.再令两边的数为1,即当每行的第一个数和

  • JavaScript代码简单实现求杨辉三角给定行的最大值

    复制代码 代码如下: function cal(row) { var result = 1; for(var i = 0; i < row / 2; i++) { return result * = (row - i) / i; } return result; };

  • java编程实现杨辉三角两种输出结果实例代码

    首先展示下结果: 简介: 杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年.杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的优美结合. 实例代码如下: package com.sxt; import java.util.Arrays; public class KeBen { p

  • python实现杨辉三角思路

    程序输出需要实现如下效果: [1] [1,1] [1,2,1] [1,3,3,1] ...... 方法:迭代,生成器 def triangles() L = [1] while True: yiled L L =[1] + [L[i] + L[I+1] for i in range(len(L)-1)] + [1] n = 0 for t in triangles(): print(t) n += 1 if n == 10: break 实现逻辑: 1.由于yield为生成器中断输出,所以有了第

随机推荐