【发布时间】:2016-12-10 18:29:36
【问题描述】:
我需要帮助将这个 C 代码翻译成汇编语言,它看起来很简单,但我很难翻译它。 (使用基本指令,例如:MOV、ADD、SUB、INC、DEC、NEG)
int k = 0, S = 0;
while (k <= 500)
{
S += k;
k += 5;
}
【问题讨论】:
-
您需要什么样的帮助?你对它的哪个部分有问题?还有,哪种汇编语言?手臂? x86-64?您是否必须保持循环,或者您可以像任何体面的 C 编译器一样将
5*500移动到寄存器中吗?如果您将您的 asm 尝试发布为 minimal reproducible example,有人可能会帮助您调试它。 -
@PeterCordes 那应该是 25250,对吧?
-
哦,我错过了它是
S += k,所以它实际上是对系列的总结。但是仍然有一个封闭的公式。 nzmaths.co.nz/gauss-trick-staff-seminar。所以最好的答案是两条 mov-immediate 指令,将两个常量放入两个寄存器。 -
@harold 是的,
S = kmax * (kmax + 1) / 10。不需要循环,在汇编中更容易编码。如果 kmax 确定为常数,则 kmax=500 为 25250。 -
所以把你的代码放在gcc.godbolt.org 上看看编译器的输出。或者使用桌面上的 x86 C 编译器在本地进行。由于结果是一个编译时常量,一个好的编译器不会使用
MOV eax, 25250以外的任何东西。