.L3:
movslq %esi, %rdx /* sign extend counter<%esi> to 64bit %rdx */
addl (%rdi,%rdx,4), %eax /* res<%eax> += b<%rdi>[counter<%rdx>]; */
subl $1, %esi /* counter<%esi> -= 1 */
.L2:
testl %esi, %esi /* do counter<%esi> & counter<%esi> */
jns .L3 /* if result is no 0, jump to L3 */
В основном addl (%rdi,%rdx,4), %eax
- это когда вы обращаетесь к массиву (%rdi
) с индексом счетчика (%rdx
) и добавляете значение элемента в res (%eax
), 4
это просто умножение счетчика (%rdx
) для доступа к памяти, поскольку каждый адрес в массиве int
занимает 4 байта в памяти вашей системы.
Строка в основном говорит: res += MEMORY[addrssOf(b) + counter*4]
Кстати, я полагаю, вы хотите проверить, что size > 0
перед строкой int counter = size-1;
, а также, как P__J__
упоминается в его ответе, ваш res
может переполниться, так как имеет одинаковый тип каждого элемента в массиве, который высуммирование.