我正在尝试将此功能转换为程序集,但我不明白它在做什么

I am trying to translate this function into assembly, but I dont understand what it is doing

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

}

我很难理解这个函数到底在做什么,尤其是最后一行让我很困惑。我也不明白在这种情况下借位是做什么的。

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

提前致谢

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

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

虽然这个功能还不完整。原来的应该有一个从第一个元素迭代到最后一个元素的循环。

要在汇编程序中执行此操作,请考虑到您可能不需要借用变量。如果你的机器有 SUB 指令和 SBB 指令(SUB 带借用)你可以 SUB 前两个元素(x[0]y[0]) 然后 SBB 剩下的。 SBB 考虑到上次操作的借位。只是不要发出任何可能改变 SBB 之间的 borrow/carry 标志的操作(或将标志寄存器保存到内存或另一个寄存器中)

雅各布

在不了解您的 C 或汇编程序知识水平的情况下,这是基础知识。

分解函数:

函数的三个参数 (x[], y[] and r[]) 是指向数组(可寻址)内存的指针,将被压入堆栈帧并可供函数体使用。

这两个 'local' 值 (borrow, r0) 将用于累积信息,通常在使用寄存器管理它们时使用。

第一条指令r0 = x[0] - y[0];是说取x偏移量0处的值并减去y偏移量0处的值,并将结果存储在注册 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].

之前从中借用寄存器