打印

请教单片机汇编宏的调用问题

[复制链接]
2366|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
定义以下宏:
; 调用 LOAD_INT_TO_DPTR #0x1234
LOAD_INT_TO_DPTR macro INT_DATA
MOV  DPH,INT_DATA / 256
MOV  DPL,INT_DATA MOD 256
endm

; 一个无符号整形数加上一个无符号字节数,结果存在DPTR中
DOUBLE_CHAR_ADD_CHAR macro INT_DATA, CHAR_DATA
CLR C
LOAD_INT_TO_DPTR INT_DATA
MOV A,CHAR_DATA
ADD A,DPL
JNC Add_No_Carry ; 无进位转
INC DPH
Add_No_Carry:
MOV DPL,A
endm


以上宏,在主程序中调用一次OK,如果是调用两次时,出现在以下错误提示:

怎么解决??

相关帖子

沙发
不亦心| | 2009-9-15 09:09 | 只看该作者
把第二个宏定义的int_data去掉试试

使用特权

评论回复
板凳
wh6ic| | 2009-9-15 15:01 | 只看该作者
第二个宏里面的地址标号设置成一次性的了,两次调用此宏就会出现同名异址错误。改成 $ + 4 看看。

使用特权

评论回复
地板
不亦心| | 2009-9-16 00:14 | 只看该作者
对对,三楼说的极是!惭愧啊。
你把第二个宏定义改为
DOUBLE_CHAR_ADD_CHAR macro INT_DATA, CHAR_DATA,Add_No_Carry
CLR C
LOAD_INT_TO_DPTR INT_DATA
MOV A,CHAR_DATA
ADD A,DPL
JNC Add_No_Carry ; 无进位转
INC DPH
Add_No_Carry:
MOV DPL,A
endm

试试

使用特权

评论回复
5
因特网用户| | 2009-9-16 07:34 | 只看该作者
看手册  记得用@可以

使用特权

评论回复
6
冷漠| | 2009-9-16 08:58 | 只看该作者
呵呵,楼上3位都挺含糊。自己还没试验过,就让LZ先试试?
到底有没有一位肯定的说法?

使用特权

评论回复
7
冷漠| | 2009-9-16 09:05 | 只看该作者

书上写的很清楚,用LOCAL指令

本帖最后由 冷漠 于 2009-9-16 09:15 编辑

书上写的很清楚:用LOCAL指令

DOUBLE_CHAR_ADD_CHAR macro INT_DATA, CHAR_DATA
          LOCAL   Add_No_Carry      ; 这里加入LOCAL指令
                 CLR C
                 LOAD_INT_TO_DPTR INT_DATA
                 MOV A,CHAR_DATA
                ADD A,DPL
                JNC Add_No_Carry ; 无进位转
                INC DPH
Add_No_Carry :
                MOV DPL,A
                endm

使用特权

评论回复
8
新好男孩|  楼主 | 2009-9-16 14:16 | 只看该作者
非常感谢大家!问题已解决!是标号的问题。
这几天比较忙,没有及时的回复大家,不好意思!
我的做法是:
; 一个无符号整形数加上一个无符号字节数,结果存在DPTR中
ADD_DOUBLE_CHAR_AND_CHAR macro INT_DATA, CHAR_DATA
        CLR        C
        MOV        B,#0
        MOV        DPTR,INT_DATA
        MOV        A,CHAR_DATA
        ADD        A,DPL                ; 低字节相加
        MOV        DPL,A                ; 保存低字节和
        MOV        A,DPH                ; 取高字节
        ADDC        A,B                ; 和低字节的进位位相加
        MOV        DPH,A
        endm

调用:
        ; 计算数据首地址
        ADD_DOUBLE_CHAR_AND_CHAR #Serial_Receive_Buffer_START_ADDRESS, Serial_Receive_cont1

使用特权

评论回复
9
wh6ic| | 2009-9-16 14:40 | 只看该作者
本帖最后由 wh6ic 于 2009-9-16 14:46 编辑

就LZ要求其实太简单了,编译器本身就搞定的:

  mov     dptr, #INT_DATA + CHAR_DATA

看错了?CHAR_DATA是寄存器地址?那就麻烦点
  mov    a,#INT_DATA
  add     a,CHAR_DATA
  mov    dpl,a
  mov    a,#high INT_DATA
  addc   a, #00
  mov    dph,a

使用特权

评论回复
10
新好男孩|  楼主 | 2009-9-16 15:04 | 只看该作者
这样调程序不是更简更明了吗?
ADD_DOUBLE_CHAR_AND_CHAR #Serial_Receive_Buffer_START_ADDRESS, Serial_Receive_cont1
对比一下:
mov    a,#INT_DATA
  add     a,CHAR_DATA
  mov    dpl,a
  mov    a,#high INT_DATA
  addc   a, #00
  mov    dph,a

使用特权

评论回复
11
不亦心| | 2009-9-16 22:54 | 只看该作者
嗯,学习了、

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

136

帖子

0

粉丝