Написание программы сборки добавить от 1 до 100 - PullRequest
0 голосов
/ 14 апреля 2020

Так что я пытаюсь добавить 1 + 2 + 3 ... и так далее ... без использования грубой силы. Y = ∑_1 ^ 100▒X_i, числа Xi хранятся в последовательных ячейках памяти, начиная с местоположения 100. Я использую набор инструкций IAS:

IAS instructions I think will be sufficient to complete this task

Я просто не могу этого сделать. Я даже не знаю, с чего начать, без реальных циклов или если заявления

1 Ответ

1 голос
/ 14 апреля 2020

У вас есть 4 различных возможных подхода, которые я напишу в x86, так как мои знания по IAS очень ограничены, но вы можете применять те же логики c

1 / грубая сила

xor eax, eax
mov ecx, 100

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

2 / В логе грубой силы c вы можете загрузить значение по адресу памяти (что, по-видимому, является тем, что вы хотите сделать? Я добавляю от 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 / A более эффективным способом, и, предполагая, что числа следуют друг за другом и начиная с 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 / hardcode n (n +1) / 2 в вашем регистре. (Равно 5050)

...