打印

PIC单片机汇编 运算方法

[复制链接]
2035|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hivince|  楼主 | 2013-3-25 23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
只前用习惯了C语言,现在必须要用汇编来进行一个程序,要用到两字节加减计算,但是汇编ADDWF,SUBWF命令,操作寄存器  F要小于等于127,但是我现在程序中,寄存器中的值可以大于127的,所以会出错。请问有什么方法可解决?
  如:
    TEM1H=0x88      被加(被减)高字节
       TEM1L=0x82      被加(被减)低字节
       TEM2H=0x85      加数(减数)高字节
       TEM2L=0x82      加数(减数)低字节
以上两字节+与-两字节,请给出程序,谢谢!
   

相关帖子

沙发
ayb_ice| | 2013-3-26 07:59 | 只看该作者
看C的反汇编不就知道了

使用特权

评论回复
板凳
hivince|  楼主 | 2013-3-26 11:22 | 只看该作者
方法不错,试了下!
这是C语言原文:
void main (void)

{              ROM1=200;
        ROM2=210;
        ROM3=ROM1+ROM2;
        ROM4=ROM2-ROM1;

}

编译出来的汇编是:
;TEST.C: 73: ROM2=210;
        movlw        (0D2h)
        movwf        (??_main+0)+0
        movf        (??_main+0)+0,w
        movwf        (_ROM2)
        line        74
       
l1870:       
;TEST.C: 74: ROM3=ROM1+ROM2;
        movf        (_ROM2),w
        addwf        (_ROM1),w
        movwf        (??_main+0)+0
        movf        (??_main+0)+0,w
        movwf        (_ROM3)
        line        75
       
l1872:       
;TEST.C: 75: ROM4=ROM2-ROM1;
        decf        (_ROM1),w
        xorlw        0ffh
        addwf        (_ROM2),w
        movwf        (??_main+0)+0
        movf        (??_main+0)+0,w
        movwf        (_ROM4)
        line        77
不大看得懂呀!(??_main+0)这是内部的什么地址吧!

使用特权

评论回复
地板
hivince|  楼主 | 2013-3-26 11:53 | 只看该作者
但是能看得出,没有进行>127的处理,加法是两个寄存器的数直接相加的,加后的值存入ROM3;减法是将ROM1-1后再进行与0FFH异或后相加,再存入ROM4,这数都大于127为什么没有进行处理而直接运算呢?这样结果应该是错的呀!

使用特权

评论回复
5
wh6ic| | 2013-3-26 13:29 | 只看该作者
你要将数据定义为有符号16位整数.
这部分完全可以交给C编译器解决,汇编一样可以调用C函数, 只要满足它的入口,出口条件

使用特权

评论回复
6
mcu5i51| | 2013-3-26 15:24 | 只看该作者
F 不大于127是指F的位置不大于127,而不是该位置的数值
一个例子就是变量 定义为地址100可以用
movlw 200
addwf 100,(0/1)
结果就是立即数200+(100)了就是100的原始数据

使用特权

评论回复
7
lu0754| | 2013-3-26 19:09 | 只看该作者
先用一个数对比,检查位标志很容易的

使用特权

评论回复
8
hivince|  楼主 | 2013-3-31 11:09 | 只看该作者
谢谢大家,的确是 mcu5i51 说的那样,F的地址不大于127,被误导啦!

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝