【发布时间】:2018-10-26 08:06:19
【问题描述】:
我写这段代码,目的是为了返回???????????? = ∑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
【问题讨论】:
-
假设您在堆栈顶部没有正确返回地址的时间点执行
RET指令。使用调试器找出这可能是如何发生的。顺便说一句,你的乘法似乎不正确。如果A为 0 会怎样? (因为它有时会与您的测试数据一起使用)。 -
嗨迈克尔,谢谢,我会尝试查看退货地址。等我结束后,我会再次检查乘法。