PIC程序集:使用变量调用函数

时间:2013-11-29 11:43:21

标签: function variables assembly pic

所以说我有一个变量,它包含一个歌曲编号。 - > song_no

根据此变量的值,我希望调用一个函数。

说我有很多不同的功能:

FCN1 .... FCN 2 .... Fcn3

所以,例如, 如果song_no = 1,则调用Fcn1 如果song_no = 2,则调用Fcn2 等等...

我该怎么做?

3 个答案:

答案 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)

我不熟悉,但这些事情通常都是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只有一个8位累加器,而跳转的地址空间是11位。因此,可以使用直接写入的低字节(PCL)和锁存的高字节PCLATH寄存器。一旦跳转,锁存器中的值将作为MSB应用。
  • 跳转表可能会跨页,因此手册会进入PCLATH。如果您知道该表将始终保持在256个指令页面内,则省略BTFSC / INCF。
  • 当要添加PCL时,ADDWF指令已经被读取并指向表。因此,0偏移量会跳转到第一个表项。
  • 与PIC18不同,每个GOTO指令适合单个14位指令字,而PCL寻址指令不是字节,因此偏移量不应乘以2。

所有事情都认为你可能会更好地寻找一般的PIC16教程。其中任何一个都将清楚地解释数据/跳转表如何工作,更不用说从如何处理芯片的基础知识开始。坦率地说,这是一个特别复杂的架构,我建议继续使用“免费”高科技C编译器,除非你特别喜欢逻辑谜题或迫切需要性能。