从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。