bigavr ボード上の atmega1280 の次のアセンブリ コードがあります。
;Set PA3:0 to input without pull-up and PA7:4 to output and use PORTA7:4 for LED0-3.
.nolist
.include "m1280def.inc"
.list
.equ PORT, PORTA
.equ DDR, DDRA
.equ PIN, PINA
.equ temp, 0x10
.equ pa1, 0x11
.equ pa2, 0x12
.equ pa3, 0x13
.section .text
.globl main
.org 0x0000
rjmp main
main:
main_init_stack_ptr:
ldi temp, lo8(RAMEND)
out SPL, temp
ldi temp, hi8(RAMEND)
out SPH, temp
main_init_ports:
ldi temp, 0x0
out PORT, temp
ldi temp, 0xf0 ; 7654 3210 (PORTA index)
out DDR, temp ; oooo iiii (i/o state)
main_loop:
in temp, PIN
andi temp, 0x0f
rcall set_led0
out PORT, temp
rjmp main_loop
set_led0: ; PORT << 4: (1 & 2) | 3
rcall prepare_operands
and pa1, pa2
or pa3, pa1
sbrs pa3, 0
ret
sbr temp, 0b00010000
ret
prepare_operands: ; move inputs 1..3 to pa1..3
mov pa1, temp ; and shift/mask them the LSB
mov pa2, temp
mov pa3, temp
lsr pa1
lsr pa2
lsr pa2
lsr pa3
lsr pa3
lsr pa3
andi pa1, 0x01
andi pa2, 0x01
andi pa3, 0x01
ret
コードは論理演算を実行する必要があります。LED0: (PA1 ^ PA2) v PA3
しかし、私はそれがどのように機能するのか理解していません。私の仮定:私in temp, PIN
は入力ピンの値を読み取ることができます。PORTA1 と PORTA3 が有効化されている場合、PIN は を返し00000101
ます。さて、prepare_operands
これは変数 pa1、pa2、および pa3 に移動されます。pa1 の場合、右に 1 回シフトされます。したがって、pa1 には が含まれます00000010
。pa1 でaddi
操作が実行されますが、なぜですか? これはどのように作動しますか?