shouchengcheng
just do it

http://wenku.baidu.com/view/59fcb203a6c30c2259019ee6这里可以看到430的中断向量表是在0xffe0~0xffff中,其中0xfffe是 reset vector。所以如果是写汇编的话,一开始就是先要定义reset vector中的跳转地址。我用iar自己生成汇编项目,其文件如下:

#include "msp430.h"                     ; #define controlled include file

        NAME    main                    ; module name

        PUBLIC  main                    ; make the main label vissible
                                        ; outside this module
        ORG     0FFFEh
        DC16    init                    ; set reset vector to 'init' label

        RSEG    CSTACK                  ; pre-declaration of segment
        RSEG    CODE                    ; place program in 'CODE' segment

init:   MOV     #SFE(CSTACK), SP        ; set up stack

main:   NOP                             ; main program
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL  ; Stop watchdog timer
        JMP $                           ; jump to current location '$'
                                        ; (endless loop)
        END

 

汇编调用c程序中函数,参数传递

参数小于4个的时候从右到做依次放在R15、R14、R13、R12中,要注意的是这些寄存器都是2字节的,基本都能放下数据。大于4个的话,多出来的放在栈中,在栈中是一个参数占2字节,按从右向左的顺序压入栈中,采取的应该是大端模式。

参数压入栈之后,在将当前PC值压入,然后进入函数中。

 

中断是用reti进行返回跳转的,它和ret的唯一区别就是,具有回复SR的功能,所以在调用中断的时候,除了要压入PC,还要有SR。其顺序依次是,先压入PC,再压入SR。

 

posted on 2014-04-17 14:52  shouchengcheng  阅读(420)  评论(0编辑  收藏  举报