【问题标题】:C code to assembly languageC 代码到汇编语言
【发布时间】: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 以外的任何东西。

标签: c assembly


【解决方案1】:
    mov ax,0
    mov bx,0
z:
    add bx,ax
    add ax,5
    cmp ax,500
    jle z

类似的东西

【讨论】:

  • 这不是正确的翻译。你写的是一个 do while 循环。 OP的问题是关于 while 循环!
  • @SepRoland 这是一个至少执行一次的while 循环,所以如果我对此进行评分,我可能会给予充分的评价。
  • 所有 r 值在第一次检查时都是常量
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 2019-08-03
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多