Ответ от @Peter Cordes является всеобъемлющим и точным в отношении использования сдвигов для деления. Однако для выполнения вашей задачи («для вычисления суммы только тех значений в области данных, которые делятся на 8») вам на самом деле не нужно делить на 8. Вам просто нужно проверить, действительно ли число делится на 8.
Вы, вероятно, знаете, что младшие три бита любого числа, которое делится на 8, будут равны нулю в его двоичном представлении, так же как любое число, делимое на 1000, будет иметь свои последние три цифры как ноль в десятичной дроби. И, как повезет, это включает в себя отрицательные числа в двоичном виде - еще один перк арифметики дополнения 2. Итак, ваша задача сводится к проверке, равны ли все три младших бита каждого числа нулю. Если они есть, то число делится на 8; если нет, то это не так.
Инструкция, которую вы ищете для достижения этой цели, TST
. Эта инструкция эффективно выполняет побитовую операцию И над своими аргументами и устанавливает флаги состояния в соответствии с результатом, но затем отбрасывает сам результат. Это как ANDS
без регистра назначения. Используя TST
со значением 0x7 (двоичное число 111) в качестве одного аргумента, результат будет нулевым, если другой операнд делится на 8, и ненулевым в противном случае; поэтому нулевой флаг будет установлен, если другой операнд делится на 8, и будет очищен в противном случае.
Например:
loop
; (somehow obtain the next number in r4 here)
TST r4, #0x7
BNE loop ; If the value in r4 is not divisible by 8, continue
ADD r5, r5, r4 ; Add the value in r4 to the sum in r5
B loop
Этот пример явно неполон (загрузка значений в r4 не реализована, а конечная ветвь безусловна), но, надеюсь, это даст вам возможность начать.