所以说我有一个变量,它包含一个歌曲编号。 - > song_no
根据此变量的值,我希望调用一个函数。
说我有很多不同的功能:
FCN1 .... FCN 2 .... Fcn3
所以,例如, 如果song_no = 1,则调用Fcn1 如果song_no = 2,则调用Fcn2 等等...
我该怎么做?
答案 0 :(得分:0)
你应该在指令集中有比较功能(帖子建议你正在寻找汇编解决方案),结果通常设置为True位或在寄存器中设置一个值。但是你需要检查指令集。
代码应该类似于:
load(song_no, $R1)
cmpeq($1,R1) //result is in R3
jmpe Fcn1 //jump if equal
cmpeq ($2,R1)
jmpe Fcn2
....
希望这有帮助
答案 1 :(得分:0)
我不熟悉pic,但这些事情通常都是jump table。简而言之,将指针指向数组中的目标例程,并调用/跳转到由song_no
索引的条目。您只需要以某种方式计算数组中的地址,因此它非常有效。没有比较必要。
答案 2 :(得分:0)
详细说明Jens的回复,传统的12/14位PIC方式与从ROM中查找常量数据的方式相同,除了用RETLW返回一个数字,你跳到所需的例程去。通过将偏移量添加到程序计数器来执行跳转表中的实际跳转。
这些方面的东西:
movlw high(table)
movwf PCLATH
movf song_no,w
addlw table
btfsc STATUS,C
incf PCLATH
addwf PCL
table:
goto fcn1
goto fcn2
goto fcn3
.
.
.
不幸的是,这里有一些细微之处。
所有事情都认为你可能会更好地寻找一般的PIC16教程。其中任何一个都将清楚地解释数据/跳转表如何工作,更不用说从如何处理芯片的基础知识开始。坦率地说,这是一个特别复杂的架构,我建议继续使用“免费”高科技C编译器,除非你特别喜欢逻辑谜题或迫切需要性能。