我正在尝试将此函数转换为汇编,但我不明白它在做什么

时间:2015-03-15 19:44:28

标签: c assembly

对于作业,我必须将此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;

}

我无法理解这个函数究竟在做什么,特别是最后一行让我感到困惑。我也不明白在这种情况下借位是做什么的。

我希望有人可以向我解释这个功能,也许会使用一个带有实数的例子。

提前致谢

2 个答案:

答案 0 :(得分:2)

首先,borrow不是一点,而是一个完整的unsigned long变量(可能是32位)。

此代码似乎做的是大数字的减法,其数字保存在xy的元素中。该函数通过首先减去包含最低有效数字的两个元素来实现。如果有借用,他们会将其存储在以后的元素中使用它。

但此功能尚未完成。原始的应该有一个从第一个元素到最后一个元素的循环。

要在汇编程序中执行此操作,请考虑您可能不需要借用变量。如果您的计算机有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]。