winnie 发表于 2009-3-31 13:57:14

为何宏程序只能调用一次,第二次调用调试通不过

c2h    equ   0x60   
    c2l   equ   0x61   
    bxs   equ   0x62   
   chenh   equ   0x63   
    chenl   equ   0x64    dianyaxi   equ0x71
    dianliuxiequ0x72
cheng16macro a,b
    movf      a,0
    movwf   c2l
    movlw   0x00
    movwf   c2h
    movf      b,0
    movwf   bxs
mul16
    clrf   chenl
    clrf   chenh
    incf   bxs,1
loop3
    decf   bxs,1
    btfsc    status,z
    goto   xy
    call   add16c
    goto   loop3
add16c
    movf      c2l,w
    addwf   chenl
    btfsc   status,c
    incf      chenh
    movf      c2h,w
    addwf   chenh,1
    retlw   0
xy
    nop
endm
只调用该程序一次,运行正常,当再调用时出现错误。
详细情况如下:
第一次调用
   movlw   0xf7         
   movwf   dianyaxi
   cheng16 0x22,dianyaxi
;调试运行正常。

第二次调用
movlw   0x38
movwf   dianliuxi
cheng16 0x23,dianliuxi
结果出现以下错误!
Error   D:\PROGRA~1\MPLAB\н¨ÎÄ~1\XV01.ASM 89 : Address label duplicated or different in second pass (MUL16)
Error   D:\PROGRA~1\MPLAB\н¨ÎÄ~1\XV01.ASM 93 : Address label duplicated or different in second pass (LOOP3)
Error   D:\PROGRA~1\MPLAB\н¨ÎÄ~1\XV01.ASM 99 : Address label duplicated or different in second pass (ADD16C)
Error   D:\PROGRA~1\MPLAB\н¨ÎÄ~1\XV01.ASM 107 : Address label duplicated or different in second pass (XY)

winnie 发表于 2009-3-31 13:57:29

每个宏里都有那四个地址标号,一个程序不允许两处有相同的地址标号,因为程序不知道你要跳转到哪一个。

我发现你的四个标号下的程序已经没有宏调用的参数。为什么不将那部分程序合为一个子程序,每次调用一下就行了。
页: [1]
查看完整版本: 为何宏程序只能调用一次,第二次调用调试通不过