我正在尝试将此功能转换为程序集,但我不明白它在做什么
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 位)。
这段代码似乎做的是减去一个大数,其数字保存在 x
和 y
的元素中。该函数通过首先减去包含最低有效数字的两个元素来实现。如果有借用,他们会存储它以便稍后在下一个元素中使用它。
虽然这个功能还不完整。原来的应该有一个从第一个元素迭代到最后一个元素的循环。
要在汇编程序中执行此操作,请考虑到您可能不需要借用变量。如果你的机器有 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].
之前从中借用寄存器
对于作业,我必须将此 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 位)。
这段代码似乎做的是减去一个大数,其数字保存在 x
和 y
的元素中。该函数通过首先减去包含最低有效数字的两个元素来实现。如果有借用,他们会存储它以便稍后在下一个元素中使用它。
虽然这个功能还不完整。原来的应该有一个从第一个元素迭代到最后一个元素的循环。
要在汇编程序中执行此操作,请考虑到您可能不需要借用变量。如果你的机器有 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].