本人初学每一款CPU,首先都是要研究一下相应的汇编指令,感觉这样能够很快的体验到该CPU的硬件原理,对后续的学习很有帮助.许多人认为不然,感觉汇编繁琐,难用。其实这样不会对单片机内部有深入的了解,会一些基本的汇编在单步调试中很有用,还有调度的编写,操作系统的移植等。
下面是个led闪烁的汇编程序,注释用C写的,一目了然
*****************************************************************
//CPU:mega32
//编译器:iar #include <ioavr.h>
NAME main
PUBLIC main
ORG RESET_vect ;复位中断向量
RJMP main
ORG INT0_vect ;外部中断0中断向量
rjmp eint0
main ldi r16,0x99
out DDRD,r16
lds r1,DDRD
cli
ldi r16,high(RAMEND) ;取内部RAM最高地址的高位字节
out SPH,r16 ;放入SP的高位
ldi r16,low(RAMEND) ;取内部RAM最低地址的低位字节
out SPL,r16 ;放入SP的低位
;DDRD |= (1 << 7);//PD7置为输出
in r16,DDRD
sbr r16,1<<7
out DDRD,r16
;eint0_init();
call eint0_init
;sei();
sei
;while(1);
s: rjmp s
;#pragma vector = INT0_vect
;__interrupt void eint0(void) //INT0中断服务程序
eint0:
;PORTD ^= 1<<7;//PD7取反
in r16,PORTD
sbrs r16,7
ldi r17,1<<7
eor r16,r17
out PORTD,r16
reti
;void eint0_init(void)
eint0_init:
;DDRD &= ~(1 << 2);//INT0脚输入
in r16,DDRD
cbr r16,1<<2
out DDRD,r16
;PORTD |= (1 << 2);//INT0脚内部上拉电阻有效
in r16,PORTD
sbr r16,1<<2
out PORTD,r16
;SFIOR &= ~(1<<PUD);//允许全部上拉
in r16,SFIOR
cbr r16,1<<PUD
out SFIOR,r16
;MCUCR |= (1 << ISC01) | (1 << ISC00);//INT0下降沿触发
in r16,MCUCR
sbr r16,(1 << ISC01) | (1 << ISC00)
out MCUCR,r16
;GICR |= (1 << INT0);//使能INT0
in r16,GICR
sbr r16,1 << INT0
out GICR,r16
ret
END main
*********************************************************************
|