... но поскольку оба массива имеют разные значения (массив 1 - dw
, а массив 2 - db
), я не уверен, как это учитывать
Ответ Эрика Эйдта объясняет, почему вы «продолжаете сталкиваться с ошибками запятых и операндов». Хотя вы можете вернуться к использованию меньших регистров (добавив префиксы размера операндов), мой ответ использует другой подход.
В наборе команд есть movzx
(перемещение с нулевым расширением) и movsx
(перемещение с sign extension) инструкции по работе с этими различными размерами. См. Ниже, как их использовать.
Я тоже внес несколько изменений.
Не упустите возможность упростить расчет:
((a[i] + 3) - (b[i] - 4))
эквивалентно (a[i] - b[i] + 7)
Ни один из этих массивов не является пустым, поэтому вы можете просто поместить условие l oop под его телом.
Вы можете обрабатывать массивы, начиная с конца, если это удобно. Операция суммирования не имеет значения!
segment .data
a dw 12, 14, 16 ; array of three values
b db 2, 4, 5 ; array of three values
n dw 3 ; length of both arrays
result dq 0 ; memory to result
segment .text
global main
main:
movzx rcx, word [n]
loop_start:
movzx rax, word [a + rcx * 2 - 2]
movzx rbx, byte [b + rcx - 1]
lea rax, [rax + rbx + 7]
add [result], rax
dec rcx
jnz loop_start
ret
Обратите внимание, что существуют дополнительные отрицательные смещения - 2
и - 1
, чтобы компенсировать тот факт, что l oop контролирует принимает значения {3, 2, 1}, когда {2, 1, 0} было бы идеально. Это не вводит дополнительный компонент смещения в инструкцию, поскольку упоминание массивов a и b фактически уже является смещением.
Хотя это помечено как x86 -64, вы можете записать все это, используя 32-битные регистры и не требуя префиксов REX. То же результат .
segment .data
a dw 12, 14, 16 ; array of three values
b db 2, 4, 5 ; array of three values
n dw 3 ; length of both arrays
result dq 0 ; memory to result
segment .text
global main
main:
movzx ecx, word [n]
loop_start:
movzx eax, word [a + ecx * 2 - 2]
movzx ebx, byte [b + ecx - 1]
lea eax, [eax + ebx + 7]
add [result], eax
dec ecx
jnz loop_start
ret