对于作业,我必须将此C函数转换为汇编语言:
void asma(unsigned long x[], unsigned long y[], unsigned long r[])
{
unsigned long borrow, r0;
r0 = x[0] - y[0];
borrow = r0 > x[0];
r[0] = r0;
r[1] = x[1] - y[1] - borrow;
}
我无法理解这个函数究竟在做什么,特别是最后一行让我感到困惑。我也不明白在这种情况下借位是做什么的。
我希望有人可以向我解释这个功能,也许会使用一个带有实数的例子。
提前致谢
答案 0 :(得分:2)
首先,borrow
不是一点,而是一个完整的unsigned long
变量(可能是32位)。
此代码似乎做的是大数字的减法,其数字保存在x
和y
的元素中。该函数通过首先减去包含最低有效数字的两个元素来实现。如果有借用,他们会将其存储在以后的元素中使用它。
但此功能尚未完成。原始的应该有一个从第一个元素到最后一个元素的循环。
要在汇编程序中执行此操作,请考虑您可能不需要借用变量。如果您的计算机有SUB
指令和SBB
指令(借用SUB
),您只需SUB
前两个元素x[0]
和{{1} })然后y[0]
其余的。 SBB
考虑借用最后一次操作。只是不要发出任何可能改变SBB
之间的借位/进位标志的操作(或将标志寄存器保存到存储器或其他寄存器中)
答案 1 :(得分:2)
氏
在不了解C或汇编程序的知识水平的情况下,这是至关重要的。
分解功能:
函数的三个参数(x[], y[] and r[]
)是指向数组(可寻址)内存的指针,并将被推送到堆栈框架并可供函数体使用。
两个“本地”值(borrow, r0
)将用于累积信息,通常是在使用寄存器进行管理时。
第一条指令r0 = x[0] - y[0];
表示 取x的偏移0处的值,并从偏移0处减去y的值,并将结果存储在寄存器r0 中强>
下一条指令borrow = r0 > x[0];
表示 取寄存器r0的值,并与x的偏移0处的值进行大于比较。将结果存储在借用寄存器中 。
r[0] = r0;
说 取寄存器r0的值并将其存储回r 的偏移量0。这有效地破坏了之前可能占据r阵列第一个位置的值。
最后一条指令r[1] = x[1] - y[1] - borrow;
从x的偏移量1开始,减去y的偏移量1的值,然后从中减去寄存器借位的值,将结果存储到r的偏移量1 在汇编程序中,我可能会将x [1]放入寄存器中,从中减去y [1]的值,然后在将其存储之前从中减去借位寄存器到r [1]。