我一直在读一本关于汇编语言编程的书,它有一个我似乎无法弄清楚的练习题。 问题在于给出了函数原型
void multiply2D (unsigned char image[numRows][numCols], int numRows, int numCols,
int factor)
我应该找到一种在程序集中编写函数的方法,它将整个数组乘以factor
而不使用嵌套循环。
我知道2D阵列会在装配中衰变成单个线性阵列,但我无法找出一个算法来指示何时停止(即到达阵列末尾)。我想简单地将列和行相乘以获得整体大小,但是它指出行与列相乘的大小可能不适合整数。
答案 0 :(得分:2)
在这种情况下,2D数组实际上是一个完整的线性数组,其大小为numRows * numCols
。因此,您必须执行32x32 = 64乘法,其中64位答案将位于某个寄存器中(请查看assembler reference以获取所需的指令)。
在psuedo-code中你需要:
reg_64 rsize = numRows * numCols
reg_64 count = 0
while( count < rsize )
image[count] *= factor
i7具有64位寄存器访问权限,因此您可以访问64位类型。
如果你真的很挣扎,你可以用C语言编写并编译它,然后用objdump反汇编它,看看编译器如何解决问题!它可能不是最有效的,但它至少会是一个答案!