8051单片机汇编LCALL为什么跳转不到子程序?解决办法(新手问题)

文章讲述了在使用51单片机进行编程时,可能会遇到KeilC51报accessviolation错误,原因是默认未设置外部RAM且堆栈设置超出范围。解决方案是调整堆栈设置。此外,对于新手在用汇编编写子函数并尝试单步执行时,可能会发现无法进入子函数,这是因为KeilC51的单步执行会直接跳过LCALL。解决方法是在子函数中设置断点,通过F5运行至断点或使用F11单步进入子函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 如果是你自己创建的工程,使用Keil C51模拟器,运行程序时发现Keil的Command窗口持续报错:
    error 65: access violation at I:0xC2 : no ‘write’ permission
    则可能时用Keil创建的AT89C51工程默认不会设置外部RAM,而AT89C51内部RAM只有0x80的大小,设置堆栈MOV SP, #0C0H的话,则程序越界了,可以MOV SP, #3FH

  2. 如果你是第一次写8051汇编程序,写了一个汇编函数,然后在复位中断里用LCALL/ACALL/CALL等命令调用了它,然后单步执行,但是按F10时发现怎么也进不去子函数。那不是你程序写错了,而是Keil C51的单步执行和C语言的一样,遇到LCALL它就知道是一个函数,就自己跳过去了,此时你需要在子函数设置一个断点,然后按F5直接运行并进入断点,或者F10单步执行时在CALL DELAY这里改按F11,进入子函数,这样才能继续单步进子函数。我找这个问题找了几个小时才发现是这样的,在网上搜完全没搜到结果。

例如:如果用汇编写了一个子函数

	ORG 0H
	LJMP RESET
	
	ORG 23H
	RETI

RESET:
LOOP:
	CALL DELAY
	LJMP LOOP
	
DELAY:
	NOP
	RET

END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值