1

我试图在 PIC16F84 的汇编中模拟 IF() .... ELIF .... ENDIF,但它似乎不适用于多种用途。我试图在两个地方使用这样的东西,但是它给出了一些标签重复的错误。不应该在标签中替换宏中的参数吗?(真实姓名中的姓名:)

_f macro name
  btfsc EQUAL,0
  goto true_name
  goto false_name
  true_name:
endm

_lse macro name
  goto next_name
  false_name:
endm

_ndif macro name
  goto next_name
  next_name:
endm

;; usage example
_f label1
  ...
_lse label1
  ...
_ndif 
4

3 回答 3

1

我认为一个人可以做得更好。这是一些可以嵌套五层的 if-else-endif 宏。不幸的是,我无法将 if1、if2.. 的定义做得像我想要的那样好,因为汇编程序不接受“#ifndef if#v(lvl)”,因此它们所代表的宏将嵌套级别限制为五个深的。这些符号计算给定嵌套级别的 If 数量,因此可以附加唯一标签。包括一个废话的例子。

xIf macro L,R,A

#ifndef lvl
lvl=0
#endif
lvl=lvl+1

#ifndef if1
if1=0
if2=0
if3=0
if4=0
if5=0
#endif

if#v(lvl)=if#v(lvl)+1

    movf    R,A
    xorlw L
    bnz   _false_#v(lvl)_#v(if#v(lvl))
    endm 

xElse macro
    bra  _end_#v(lvl)_#v(if#v(lvl))
_false_#v(lvl)_#v(if#v(lvl)):
    endm

xEndIf macro
_end_#v(lvl)_#v(if#v(lvl)):
lvl=lvl-1
    endm

    xIf 123,STATUS,A
        clrf    TMR3H,A
        xIf 75,STATUS,A
            clrf    TMR3H,A
        xElse
            setf    TMR3L,A
        xEndIf
    xElse
        setf    TMR3H,A
    xEndIf
于 2012-10-25T01:34:53.280 回答
0

不要使用从一个宏到另一个宏的跳转,这是危险的

无需使用唯一标签。 在 MPLAB 下有两种方法可以做到这一点:

1) 使用 LOCAL 指令的情况

_f macro name
 LOCAL true_name
      btfsc   EQUAL,0
      goto    true_name
      goto    name  
true_name:
endm

2)以$为当前内存地址指针的情况。

_f macro name
      btfsc   EQUAL,0
      goto    $+1
      goto    name
endm
于 2011-03-29T19:47:54.527 回答
0

我用 MPLAB 变量解决了这个问题,这是一个测试寄存器和文字之间相等性的示例:

_f_equal_literal macro register,literal,name
    movlw literal
    subwf register,0
    btfss STATUS,2 ;bit indicating result is zero
    goto _false#v(name)
    endm

_lse macro name
    goto _next#v(name)
_false#v(name):
    endm

_ndif macro name
_next#v(name):
    endm

请注意,我没有使用goto _true#v(name)and_true#v(name):标签,您只需要弄清楚是否需要btfssor btfsc

您可以有一个_lse_ndif宏,也可以有多个用于_f语句的宏。

GJ的解决方案没有next标签,所以真分支会执行假分支。


您需要为每个 if-else-endif 构造定义一个变量。如果变量名称描述了 if-else-endif 的用途,它甚至可能很有用。

例子:

变量 testing_something=123

_f_equal_literal some_register,some_value,testing_something
                ...       

_lse testing_something
                ...        

_ndif testing_something
于 2011-03-31T10:35:05.643 回答