我目前正在为8051处理器创建代码,每次执行典型的分支例程(执行的函数都是根据变量值确定)时,会使用大量的空间。我会用代码和评论来解释。
我的典型分支代码遵循以下格式:
nextround:
acall getuserinput
mov A,uservalue
cjne A,#option1,skipoption1 ;uses 3 bytes and 2 clock cycles for each cjne
acall function1
ajmp theend
skipoption1:
cjne A,#option2,skipoption2
acall someotherfunction
acall function2
ajmp theend
skipoption2:
....
theend:
ajmp nextround
在发现jmp命令存在后,我想尝试利用它,这样我就不会为每个选项浪费3个额外的存储字节和2个额外的时钟周期。
这是我到目前为止的想法:
nextround:
acall getuserinput
mov A,uservalue
anl A,#7h ;limit options to 8
mov DPTR,#processingspace
xch A,DPH ;set A=data pointer high and DPH=our value
add A,DPH ;add the two together
mov DPH,A ;so that we have 256 bytes available per option
clr A
jmp @A+DPTR
ajmp nextround
processingspace:
;system jumps here if uservalue is 0
现在,具有挑战性的部分是使用单词分配地址的最后一部分。
对我来说最简单的方法是做这样的事情:
processingspace:
;system jumps here if uservalue is 0
setb P1.1
nop ;add 253 nops
value1:
;system jumps here if uservalue is 1
因为然后nops添加必要的填充以使代码在内存中正确定位。
不使用" org"指令,是否有一种更有效的方法,当系统根据用户选择调用并且不浪费太多rom空间时,系统可以跳转到每个函数的程序位置?