【发布时间】:2022-01-10 05:02:52
【问题描述】:
我正在尝试用内联汇编语言编写从 2 到 200 的迭代是否是素数,因为我们在每次迭代中都在执行 i2+1。我已经开始写了,但它只计算 2 到 200 之间的每秒数。
我知道我的逻辑在素数循环中搞砸了,因为它显然没有正确检查数字是否为素数,但没有足够的组装经验来理解我做错了什么。
任何帮助将不胜感激。这是我的参考代码:
#include <stdio.h>
int main() {
int i = 2, prime;
int c = 2;
__asm {
top: mov eax, i
cmp eax, 200
jg done
mul i
add eax, 1
prime: mov edx, 0
div c
cmp edx, 0
je done
mov prime, 1
cmp prime, 1
jne done
}
printf("%d\n", i);
__asm {
add i, 2
loop top
done: nop
}
}
程序的正确运行应该计算:2、4、6、10、14 ...
【问题讨论】:
-
您是否尝试过使用调试器来跟踪代码的逻辑?
-
当我写 asm 代码时,我通常会在 each 行加上侧边栏注释。如果我有要实现的 C 代码,我通常会引用变量和语句。比如看我的回答:stackoverflow.com/questions/36538325/mips-linked-list/…
-
您始终可以用 C 对其进行编码并检查
-O0生成的程序集作为一个很好的起点。有点作弊直接把它转过来。 -
@yano
-O0总是不好的起点godbolt.org/z/bvMEPx63a -
分析下面的代码。你拥有一切
标签: c assembly x86 inline-assembly