【发布时间】:2016-12-07 11:08:47
【问题描述】:
另一个组装问题!
使用 Arduino,我必须在 Atmel AVR Assembly 中为我的计算机科学课程编写一个函数,该函数计算两个数组的点积并将其作为 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
我知道这有点像怪物......
由于某种原因,当我有数组字节 a[] = {7, 20, 19, 11, 4} 和字节 b[] = {132, 51, 0, 84, 30} 时,长度参数等于到 5(显然),它不会像预期的那样返回 2988。有谁知道出了什么问题?任何帮助将不胜感激!
【问题讨论】:
-
您可能想用 cmets 对您的代码进行一些注释。即使假设我们熟记指令集和 ABI,这也不能说明您的子程序的预期参数是什么。
-
为什么不使用 C 编译器? AVR 被设计成一个很好的编译器目标,所以编写一个接受 args 并返回结果的函数,并查看 gcc 的输出。
-
b[0]=132与程序集不匹配。乘法是有符号的,所以是 -124。
标签: arrays assembly arduino average avr