在汇编时分支而不浪费存储空间或知道地址 - 8051

时间:2018-03-16 18:34:08

标签: assembly switch-statement function-pointers memory-address 8051

我目前正在为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空间时,系统可以跳转到每个函数的程序位置?

0 个答案:

没有答案