Ошибка недопустимого кода операции встроенного рабочего места IAR - PullRequest
0 голосов
/ 26 октября 2018

Я пишу этот код, цель состоит в том, чтобы вернуть ??? = ∑A ∙ B, когда A, B - 2 массива чисел длиной 8.

Когда программа получает команду RET, появляетсяошибка: «Недопустимый код операции найден по адресу 0X0».Я не могу понять, почему это происходит.

    #include <msp430xG46x.h>     ;define controlled include file

         ORG 1100h
Arr1     DW   2,0,4,2,6,5,1,1  
Arr2     DW   3,0,8,5,2,9,3,7  
Size     DW   8         ; Arr length

var1     DS32  1

         RSEG   CODE                  ; ORG   0x3100 - place program in 'CODE' segment in to Flash memory
         RSEG   CSTACK

Main    
         MOV   #Arr1,R5
         MOV   #Arr2,R6
         MOV   Size,R7
         CLR   R8
Loop      
          call #Func
          DEC  R7
          JNZ  Loop
L1        JMP  L1

Func      
          MOV  @R5,R10            ;Adding @R6, @R5 times to R8 
          CLR  R4
          ADD  @R6,R4
L2       
          DEC  R10
          JZ   Result
          ADD  @R6,R4
          ADC  R9
          JMP  L2
Result    
          MOV  R4,var1
          MOV  #2,R11
          MOV  R9,var1(R11)
          ADD  var1,R8
          INCD R5
          INCD R6      
          RET

;-------------------------------------------------------------------------------

          COMMON  INTVEC                  ; Interrupt Vectors
;-------------------------------------------------------------------------------

         ORG     RESET_VECTOR            ; POR, ext. Reset

         DW      Main

         END

1 Ответ

0 голосов
/ 26 октября 2018

1) Регистр SP не инициализирован, поэтому вы перемещаете память в 0x0000, что в зависимости от вашего MCU может быть чем угодно. Это портит и звонки, и звонки.

2) Ваш код заканчивается в сегменте стека, поскольку RSEG CSTACK идет после кода RSEG и перед вашим кодом.

Изменить

    RSEG   CODE                  ; ORG   0x3100 - place program in 'CODE' segment in to Flash memory
    RSEG   CSTACK

Main

до

     RSEG   CSTACK
     RSEG   CODE                  ; ORG   0x3100 - place program in 'CODE' segment in to Flash memory

Main     MOV     #SFE(CSTACK), SP
...