【发布时间】:2018-03-08 04:58:25
【问题描述】:
我在 ASM 中做一个关于使用 NASM 的帕斯卡三角形的项目
所以在项目中你需要计算从第0行到第63行的帕斯卡三角形
我的第一个问题是在哪里存储计算结果 -> 内存
第二个问题我在内存中使用什么类型的存储,要理解我的意思我有3种方式首先声明一个完整矩阵所以会像这样 p>
memoryLabl: resd 63*64 ; 63 rows of 64 columns each
但是这样的问题是一半的矩阵没有被使用,这使得我的程序效率不高所以让我们去第二种方法是可用的
为每一行声明一个内存标签 例如:
line0: dd 1
line1: dd 1,1
line2: dd 1,2,1 ; with pre-filled data for example purposes
...
line63: resd 64 ; reserve space for 64 dword entries
这种做法就像手工做一样,
班上的其他人尝试使用宏,如您所见here 但我不明白
到目前为止一切顺利
让我们看看我用过的最后一个 这就像第一个,但我使用 triangle matrices ,那是怎么回事, 通过仅声明我需要的内存量
所以要存储帕斯卡三角形的第 0 行到第 63 行,它给了我一个三角形矩阵,因为每一个新行我都添加一个单元格
我已经为三角形矩阵分配了 2080 个双字,这是怎么回事? 用 2080 dword 解释:
okey we have line0 have 1 dword /* 1 number in first line */
line1 have 2 dword /* 2 numbers in second line */
line2 have 3 dword /* 3 numbers in third line */
...
line63 have 64 dword /* 64 numbers in final line*/
so in the end we have 2080 as the sum of them
我给每个数字 1 个 dword
好的,现在我们已经创建了内存来存储结果让我们开始计算
first# 在帕斯卡三角形中,第 0 行 中的所有单元格的值都为 1
我会用伪代码来做,这样你就明白我是如何在第 0 行的所有单元格中放入一个的:
s=0
for(i=0;i<64;i++):
s = s+i
mov dword[x+s*4],1 /* x is addresses of triangle matrices */
帕斯卡三角形的第二部分是让每行的最后一行等于1
我将使用伪代码使其变得简单
s=0
for(i=2;i<64;i++):
s = s+i
mov dword[x+s*4],1
我从 i 等于 2 开始,因为 i = 0 (i=1) 是 line0 (line1) 并且 line0 (line1) 是满的,因为正如我在上面的解释中所说的那样,它只保存一个 (tow) 值
所以两个伪代码将使我的矩形看起来像在内存中:
1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
...
1 1
现在困难的部分是使用三角形中的这个值来填充所有三角形单元格的计算
让我们从这里的想法开始
let's take cell[line][row]
we have cell[2][1] = cell[1][0]+cell[1][1]
and cell[3][1]= cell[2][0]+cell[2][1]
cell[3][2]= cell[2][1]+cell[2][2]
in **general** we have
cell[line][row]= cell[line-1][row-1]+cell[line-1][row]
我的问题我无法使用 ASM 指令打破这种关系,因为我有一个
三角矩阵使用起来很奇怪,谁能帮助我使用关系或非常基本的伪代码或 asm 代码来破解它?
【问题讨论】:
-
memoryLabl dd 63*64 dup(?)是 MASM 语法。在 NASM 中:section .bss/memoryLabl: resd 63*64为 BSS 中的63*64dwords 保留空间。标签名称后面的:是可选的,但在 NASM 中推荐使用。 -
我如何在第 0 行的所有单元格中放置一个: 这看起来像 column 0,使用
s += i作为数组索引来跨越通过增加数量来记忆。列是垂直的,行是水平的(您也称它们为“行”)。 -
line2 dd dup(1,2,1)。我想你的意思是line2 dd 1,2,1。我不确定您是否可以复制多个元素的模式。 -
@PeterCordes 是的,你是对的
-
我有点想知道要回答你什么来帮助你:你对使用三角矩阵的代码更感兴趣,还是你只想要帕斯卡三角?你想要它怎么样?因为我猜存在直接的公式来计算三角形的特定位置(我认为它是组合数学中的“n 高于 k”或类似的东西),而且如果你想要屏幕输出,你可以只使用单个长行缓冲区来输出整个三角形,在每行输出后更新内容等......即打印帕斯卡三角形(在屏幕上或文本文件中)并不需要将其存储在内存中。
标签: algorithm assembly matrix x86 nasm