Другой вопрос сборки!Как вычислить 16-разрядное точечное произведение двух массивов, содержащих 8-битные значения?
Используя Arduino, я должен написать функцию в сборке Atmel AVR для моего класса информатики, которая вычисляет произведение точек двух массивов и возвращает его как 16-разрядное целое число. Массивы имеют одинаковую длину и каждый содержит набор 8-битных значений. Предполагается, что функция должна принимать в этих двух байтовых массивах и байт, представляющий длину массива в качестве аргументов. Я могу использовать инструкции ветвления и т. Д.
Вот то, что я до сих пор:
.global dot
dot:
mov r18,r22
mov r19,r23
movw r26,r18
mov r30,r24
mov r31,r25
ldi r18,lo8(0)
ldi r19,hi8(0)
jmp exit_if
compute:
ld r25,Z+
ld r22,X+
muls r22,r25
movw r22,r0
clr r1
add r18,r22
adc r19,r23
exit_if:
mov r25,r30
sub r25,r24
cp r25,r20
brlt compute
movw r24,r18
ret
Это немного уродства я знаю ...
По какой-то причине, когда у меня есть массивы БАЙТОМ [] = {7, 20, 19, 11, 4} и байт b [] = {132, 51, 0, 84, 30}, аргумент длины равен 5 (очевидно), он не возвращает 2988, как и предполагалось. Кто-нибудь знает, что происходит не так? Любая помощь была бы искренне оценена!
Возможно, вы захотите немного комментировать свой код комментариями. Даже если предположить, что мы знаем наизусть набор инструкций и ABI, это не показывает, каковы ожидаемые аргументы вашей подпрограммы. –
Почему бы не использовать компилятор C? AVR предназначен для хорошей цели компилятора, поэтому напишите функцию, которая принимает аргументы и возвращает результат, и посмотрите на вывод gcc. –
'b [0] = 132' не соответствует сборке. Умножение подписывается, поэтому вместо этого -124. –