1

所以我试图添加 1+2+3... 等等...而不使用蛮力。Y=∑_1^100▒X_i,数字 Xi 存储在从位置 100 开始的连续内存位置中。我使用的是 IAS 指令集:

我认为 IAS 指令足以完成这项任务

我似乎无法完成这件事。我什至不知道从哪里开始,没有真正的循环或 if 语句

4

1 回答 1

2

您有 4 种不同的可能方法,由于我对 IAS 的了解非常有限,因此我将使用 x86 编写它们,但您可以应用相同的逻辑

1/蛮力

xor eax, eax
mov ecx, 100

.myloop:
add eax, ecx
dec ecx
jnz .myloop

2/从蛮力逻辑你可以在内存地址加载值(这似乎是你想要做的?我从 100 加到 1。

xor eax, eax
mov ecx, 100

.myloop:
lea edx, [100+ecx*4-4]       ; assuming integer array
add eax, [edx]
dec ecx
jnz .myloop

3/ 一种更有效的方法,假设数字相互跟随并从 1 开始,您可以使用著名的公式res = n(n+1) / 2。如果你考虑一个骰子,从 1 到 6 的总和是 21,正好是 6 * 7 / 2。为了避免 INT_MAX 溢出,我建议测试 n 的位是否设置,如果设置除 n+ 1 除以 2,否则将 n 除以 2

mov edx, [100+99*4]      ; load value 100 in register edx
test edx, 1
jnz .planb

mov eax, edx
shr eax
inc edx
imul eax, edx
leave
ret

.planb:
mov eax, edx
inc eax
shr eax
imul eax, edx
leave
ret

4/ 在您的寄存器中硬编码 n(n+1)/2。(等于 5050)

于 2020-04-14T04:23:06.203 回答