
МАС инструкция при dsPIC30F4013
Интересно ми е как се изпълнява следната инструкция - умножение с натрупване - МАС
Постановката е следната:
2 масива данни - започващи от адреси 0x0900 и 0x0D00 съответно в X и Y пространствата на контролера с стойности arr1[8]={1,2,3,4,5,6,7,8};
и arr2[8]={1,2,3,4,5,6,7,8}; и се тества как работи МАС инструкцията.
Програмката е следната:
_MyFunction:
mov #_arr1, W8 ; W8 = @arr1, point to a first element of array
mov #_arr2, W10 ; W10 = @arr2, point to a first element of array
clr A,[W8]+=2, W4 ,[W10]+=2, W5 ; clear ACCA ,fletch data from 0x0900 into W4 and inc pointer+2
; fletch data from 0x0D00 into W5 and inc pointer+2
DO #7,end6 ; do 7+1 times
MAC W4*W5, A , [W8], W4 ,[W10], W5 ; ACCA=ACCA+W4*W5
end6: nop
return
След нулирането на ACCA и извличането на първите данни : W4=1; W5=1; ACCA=0; W8=0x0902; W10=0x0D02 - О.К
След първи МАС: W4=2; W5=2; ACCA=2; W8=0x0904; W10=0x0D04

Защо АССА =2 ? 0+1*1=1
След втори МАС: W4=3; W5=3; ACCA=А; W8=0x0906; W10=0x0D06

Защо АССА =10 ? 1+2*2=5
След трети МАС: W4=4; W5=4; ACCA=1С; W8=0x0908; W10=0x0D08
В края на крайща се оказва че резултат се изменя като ACCA=ACCA+2*W4*W5 което не го пише в документацията. Ама може и аз да бъркам някъде та ако някой колега се е сблъсквал с подобен камък нека сподели