本人初學每一款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
*********************************************************************
|