问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

汇编题目: 接收整数n,显示杨辉三角形

发布网友 发布时间:2022-04-23 14:50

我来回答

3个回答

热心网友 时间:2022-04-23 16:19

assume cs:code, ss:stack

stack segment
db 1024 p(?)
stack ends

code segment
start:
mov ax, stack ; 初始化栈
mov ss, ax
mov sp, 1024

mov ax, 9
push ax
sub ax, 2
push ax
sub ax, 3
push ax
call yhsj
call yhsj
call yhsj

mov ax, 4c00h
int 21h

; 输出杨辉三角的函数,接受一个栈上的参数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

热心网友 时间:2022-04-23 17:37

在图像显示模式下画出杨辉三角形?

热心网友 时间:2022-04-23 19:12

2020
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
中控是什么意思 抖音直播中控是什么意思 iphone通讯录群组设置 如何更改iphone通讯录拨打电话时总是出现两个称呼 我的电脑是Win8.1update老硬盘有坏道,最近新买了一个硬盘是希捷的1TB混 ... 使命召唤:黑色行动2常见问题 GMA 4500M技术特性 电脑显示器的配置电脑的基本配置有哪些 梦见对象把门钥匙和我分手 梦见对象还我门钥匙要和我分手的预兆 公益性捐赠税前扣除资格 股票选择波动大的好还是小的好 当孩子流鼻血的时候,家长应该如何正确处理? 山东省国三国四大客车提前淘汰补贴政策 孩子爱流鼻血怎么护理? 一个手机如何同时登录两个? 股市波动大风险高,政信波动小,风险低? 陕西国三车报废补贴 国三汽车报废是多少钱 一个手机可以同时登录2个吗?- 问一问 请问眼睛总是流泪是怎么回事啊?请问眼睛总是流泪是怎么回事?眼睛特别容易酸,看电脑屏幕时间长了就流泪 国3报废国家补偿标准 眼睛容易流泪,笑时,见风,都容易流泪 京剧是我国戏曲种类之一,它的表演特点是什么? 12306买了票,发邮箱没看见检票口怎么办,同一时间帮朋友买早一天的,他的就有显示检票口 宝贝别哭是个成语吗? 戏曲表演的艺术特征 宝贝别哭txt全集下载 这是啥,超级大的干鲍鱼吗??? 《宝贝别哭》最新txt全集下载 ..别哭了宝贝,我最见不得眼泪,请问这首歌的名字是什么? 灵溪灵江公交车路线 金乡到灵溪的早上第一班公交车几点 苍南灵溪镇19路公交车路线 桥圢至灵溪火车站最后一班公交车什么时间 灵溪3路公交车终点站是哪? 苍南灵溪有什么公交车直接到动车站的 苍南至龙港公交车最后一班发车几点 龙港到灵溪的车路线 龙港到灵溪公交车怎么坐 苍南县公交车 我是霞关人,我请问苍南灵溪火车站到灵溪汽车站〔就是可以回霞关的那个车站〕,做几路公交车去啊 苍南灵溪到南雁荡山怎么乘公交车 苍南灵溪到南雁荡山怎么乘公交 一部手机两个怎么弄 霞关镇到灵溪镇车的时间表 一部手机两个怎么弄 一部手机能不能同时用两个 宝宝皮肤病怎么办 宝宝有皮肤病怎么办? 为什么宝宝皮肤病不能乱用药?