2020-03-19から1日間の記事一覧

アセンブリでLチカ

p.110 今わかっている範囲でLチカをしてみる。 .org 0 ldi r16, high(ramend) out SPH, r16 ldi r16, low(ramend) out SPL, r16 ; ldi r16, 0xff out DDRB, r16 ; ポートBのIOを全部OUTにして、 back: ldi r16, 0b00000010 out PORTB, r16 ; PB1からHを出力…

CALL命令とスタック

pp.86ff. ATmega328Pのデータシートを見るとSPの初期値はRAMENDになっているので初期化は不要かもしれない。 .org 0 ;;;;スタックポインタを初期化する ldi r16, high(ramend) ; RAMの末尾アドレス(16ビット)の上位バイトを、 out SPH, r16 ; スタックポイン…

分岐先アドレスの確認

p.83 BREQ命令を例にして分岐先アドレスを確認してみる。EQはif equal。 .org 00 ; ldi r16, 1 breq here ldi r16, 1 ldi r16, 1 ldi r16, 1 ldi r16, 1 ldi r16, 1 here: ldi r16, 1 ldi r16, 1 ldi r16, 1 breq here ldi r16, 1 ldi r16, 1

BRNE命令を使ったn重ループ

pp.78-80 .org 0 ; ldi r30, 0 ldi r31, 1 ; ldi r18, 2 ; r18を最外ループカウンターとして使う。 loop3: ldi r17, 3 ; r17を中間ループカウンターとして使う。 loop2: ldi r16, 4 ; r16を最内ループカウンターとして使う。 loop1: add r30, r31 ; 何かに何…

BRNE命令を使ったループ

pp.76-78 NEはif not equal。この方法だと255回までループできる。 .org 00 ; ldi r16, 5 ; r16をカウンターとして使う。 ldi r17, 0 ldi r18, 1 again: add r17, r18 ; 何かに何かを加算して、 dec r16 ; カウンターをデクリメントして、 brne again ; カウ…