打印

汇编高手请帮忙!

[复制链接]
2491|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yulindee|  楼主 | 2010-2-21 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yulindee 于 2010-2-21 17:36 编辑

下面是我用C写的一个中断服务程序编绎出来的汇编,一进中断会把这什么多寄存器入栈呢!不是入A,X吗?这些寄存器哪里介绍呢!给点写汇编的资料也可以。。。



(0119) void SR_C(void)
(0120) {
_HALL_ISR_C:
    0964: 08       PUSH  A
    0965: 5D D0    MOV   A,REG[0xD0]
    0967: 08       PUSH  A
    0968: 5D D3    MOV   A,REG[0xD3]
    096A: 08       PUSH  A
    096B: 5D D4    MOV   A,REG[0xD4]
    096D: 08       PUSH  A
    096E: 5D D5    MOV   A,REG[0xD5]
    0970: 08       PUSH  A
    0971: 51 31    MOV   A,[__r0]
    0973: 08       PUSH  A
    0974: 51 30    MOV   A,[__r1]
    0976: 08       PUSH  A
    0977: 51 2F    MOV   A,[__r2]
    0979: 08       PUSH  A
    097A: 51 2E    MOV   A,[__r3]
    097C: 08       PUSH  A
    097D: 51 2D    MOV   A,[__r4]
    097F: 08       PUSH  A
    0980: 51 2C    MOV   A,[__r5]
    0982: 08       PUSH  A
    0983: 51 2B    MOV   A,[__r6]
    0985: 08       PUSH  A
    0986: 51 2A    MOV   A,[__r7]
    0988: 08       PUSH  A
    0989: 51 29    MOV   A,[__r8]
    098B: 08       PUSH  A
    098C: 51 28    MOV   A,[__r9]
    098E: 08       PUSH  A
    098F: 51 27    MOV   A,[__r10]
    0991: 08       PUSH  A
    0992: 51 26    MOV   A,[__r11]
    0994: 08       PUSH  A
    0995: 51 25    MOV   A,[__rX]
    0997: 08       PUSH  A
    0998: 51 24    MOV   A,[__rY]
    099A: 08       PUSH  A
    099B: 51 23    MOV   A,[__rZ]
    099D: 08       PUSH  A
(0121) // PRT1DR=~(PRT1DR&0X40);
(0122)  hall_position_isr( );
    099E: 7C 06 39 LCALL _hall_position_isr
    09A1: 18       POP   A
    09A2: 53 23    MOV   [__rZ],A
    09A4: 18       POP   A
    09A5: 53 24    MOV   [__rY],A
    09A7: 18       POP   A
    09A8: 53 25    MOV   [__rX],A
    09AA: 18       POP   A
    09AB: 53 26    MOV   [__r11],A
    09AD: 18       POP   A
    09AE: 53 27    MOV   [__r10],A
    09B0: 18       POP   A
    09B1: 53 28    MOV   [__r9],A
    09B3: 18       POP   A
    09B4: 53 29    MOV   [__r8],A
    09B6: 18       POP   A
    09B7: 53 2A    MOV   [__r7],A
    09B9: 18       POP   A
    09BA: 53 2B    MOV   [__r6],A
    09BC: 18       POP   A
    09BD: 53 2C    MOV   [__r5],A
    09BF: 18       POP   A
    09C0: 53 2D    MOV   [__r4],A
    09C2: 18       POP   A
    09C3: 53 2E    MOV   [__r3],A
    09C5: 18       POP   A
    09C6: 53 2F    MOV   [__r2],A
    09C8: 18       POP   A
    09C9: 53 30    MOV   [__r1],A
    09CB: 18       POP   A
    09CC: 53 31    MOV   [__r0],A
    09CE: 18       POP   A
    09CF: 60 D5    MOV   REG[0xD5],A
    09D1: 18       POP   A
    09D2: 60 D4    MOV   REG[0xD4],A
    09D4: 18       POP   A
    09D5: 60 D3    MOV   REG[0xD3],A
    09D7: 18       POP   A
    09D8: 60 D0    MOV   REG[0xD0],A
    09DA: 18       POP   A
    09DB: 7E       RETI  
(0123) }
沙发
god_like| | 2010-2-21 19:01 | 只看该作者
不懂汇编的只能帮顶了

使用特权

评论回复
板凳
yulindee|  楼主 | 2010-2-22 15:16 | 只看该作者
难道大家都是用C写的程序!怎么没人啊!

使用特权

评论回复
地板
xiaoxin1986| | 2010-2-23 12:42 | 只看该作者
可能大家放假都还没回来

使用特权

评论回复
5
PSoC_Rock| | 2010-2-24 17:17 | 只看该作者
这就是汇编和C的区别. 不知道你用的是ImageCraft编译器还是HiTech的编译器?HiTech的要好很多.

我看你这中断程序象是马达控制采集Hall信号, 如果要快的话,直接用汇编写中断服务程序. 短小精悍.

使用特权

评论回复
6
jxin| | 2010-2-25 09:50 | 只看该作者
这些入栈的内容可以从mp文件里找到吧, 看看那里面是什么内容?

使用特权

评论回复
7
yulindee|  楼主 | 2010-2-26 12:44 | 只看该作者
to:5楼

     我用的编绎器是desngier安装包自带的一个编绎器!主要是想问一下这里的[r+0],这些寄存器分配在存储器的哪个地方?

使用特权

评论回复
8
PSoC_Rock| | 2010-3-3 13:49 | 只看该作者
to:楼主

[__R0],...~[__RX],[__RY],[__RZ] 是虚拟寄存器,具体定义在那里可以参考.mp文件:
下面是一个.mp文件中的例子:
              virtual_registers   00E2   000B =     11. bytes (rel,con,ram)

       Addr  Global Symbol
      -----  --------------------------------
       00E2  __rZ
       00E3  __rY
       00E4  __rX
       00E5  __r7
       00E6  __r6
       00E7  __r5
       00E8  __r4
       00E9  __r3
       00EA  __r2
       00EB  __r1
       00EC  __r0
它的作用只类似51MCU中的R0~R8,可以作为运算的中间变量寄存器. 其实它在哪并不重要,重要的是你的中断程序(用C写的)里有没有使用其中的寄存器,如果使用了,不作现场保护将导致你的中断程序破坏其他程序;如果没有使用,则这个现场保护就变成了冗余占用了执行关键中断程序之前的许多宝贵的时间.
      如果你自己用汇编编写中断就没有这个问题了. 毕竟编译器有的时候还不能完全象人一样去判断事物,为了可靠不出错,它也就只好牺牲一些效率了。

使用特权

评论回复
9
PSoC_Rock| | 2010-3-3 13:54 | 只看该作者
抱歉,
[__R0],...~[__RX],[__RY],[__RZ] 应该是小写:
[__r0],[__r1],...[__rX],[__rY],[__rZ]

使用特权

评论回复
10
yulindee|  楼主 | 2010-3-4 16:12 | 只看该作者
那就明白了!谢谢版主!

使用特权

评论回复
11
虎虎生威| | 2010-3-6 16:49 | 只看该作者
抱歉,
[__R0],...~[__RX],[__RY],[__RZ] 应该是小写:
[__r0],[__r1],...[__rX],[__rY],[__rZ]
PSoC_Rock 发表于 2010-3-3 13:54
;P

使用特权

评论回复
12
happytiger2010| | 2010-3-7 14:08 | 只看该作者
看来这很多高手啊

使用特权

评论回复
13
llljh| | 2010-3-8 21:06 | 只看该作者
还是版主牛

使用特权

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

本版积分规则

12

主题

100

帖子

0

粉丝