Keil在debug时老是出现error 65: access violation at C:0x0002 : no 'execute/read' permission

源代码在这里
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
DB 5H,4H,6H,7H,1H,2H,3H,0H,8H,9H
START:CLR 00H
CLR C
MOV R7,#10
MOV R0,#30H
MOV A,@R0
LOOP:INC R0
MOV R2,A
SUBB A,@R0
MOV A,R2
JC NEXT
SETB 00H
XCH A,@R0
DEC R0
XCH A,@R0
INC R0
NEXT:MOV A,@R0
DJNZ R7,LOOP
JB 00H,START
SJMP $
END
都快被这搞无语掉了

你的Debug选项没有设置好,如图,把我画箭头的地方选项去掉,不要勾选.

另外,你的这个程序,DB指令是不可以放置到Main后面的,正常的做法,是放到整个程序的最后面.

追问

我试过把勾去掉了,去掉就跑不进这个程序了。我把DB放到后面不去掉那个勾,程序是能运行了,但是没有实现想要的功能。这段程序是要实现将地址30H到39H所存的数据进行排序放入这片单元,是一次考试时让我们读指令判定其实现的功能的,所有程序应该没问题。不过原题没有DB指令。我想看下程序跑的过程,所以自己加了BD指令,想请教一下是不是不能这么赋值啊?

追答

DB是定义常量伪指令,在在ROM里定义一段常量,记住,是在ROM里,而程序也是在ROM里存放的,所以,如果你把DB放在程序执行过程中,那么你所定义的DB就会被当作指令来执行了,而这个时候,就会出错误.

如果你要使用DB,第一,给这段常数加个标号,第二,放到程序最后面去,这样比较保险.
比如:

MOV DPTR,#TAB
MOV A,#01H
MOVC A @A+DPTR
..
..
..

ORG 7FFFH
TAB:
DB 01H,02H,....

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-01-23
我要是你的老师,会被你当场气死的。

MAIN:
DB 5H,4H,6H,7H,1H,2H,3H,0H,8H,9H

谁告诉你把常量放在MAIN标号后面的?把常量数组当做指令执行,你知道会产生什么后果吗?
你自己反查一下看看05 04 06 07 01 02 03 00 08 09被反汇编成了什么指令。追问

DB语句不是指示以标号为起始地址的单元里存放8位二进制数吗?而且还没接触过反汇编,才开始学