AVR汇编(七):位操作和MCU控制指令
位操作指令
SBI
/ CBI
SBI
指令用于设置I/O寄存器中的第 b
位, CBI
指令用于清除I/O寄存器中的第 b
位。
例如:
SBI DDRB, 5 ; PB5设为输出模式
CBI PORTB, 5 ; PB5输出低电平
移位
LSL
指令用于逻辑左移,低位补0。
LSR
指令用于逻辑右移,高位补0。
ASR
指令用于算术右移,高位补符号位。
ROL
指令用于循环左移,低位补 C
标志位,高位进入 C
标志位。
ROR
指令用于循环右移,高位补 C
标志位,低位进入 C
标志位。
例如:
LDI R16, 0x88 ; R16 = 0x88
LSR R16 ; R16 = 0x44
LSL R16 ; R16 = 0x88
ASR R16 ; R16 = 0xC4
SEC ; C = 1
ROR R16 ; R16 = 0xE2, C = 0
ROL R16 ; R16 = 0xC4, C = 1
SWAP
SWAP
指令用于交换寄存器的高低4位。
例如:
LDI R16, 0xA5 ; R16 = 0xA5
SWAP R16 ; R16 = 0x5A
BSET
/ BCLR
BSET
用于设置 SREG
寄存器中的第 s
位, BCLR
用于清除 SREG
寄存器中的第 s
位。
例如:
BSET 0 ; C = 1
BCLR 0 ; C = 0
BST
/ BLD
BST
用于将寄存器中的第 b
位保存到 T
标志位, BLD
用于将 T
标志位加载到寄存器的第 b
位。
例如:
LDI R16, 0xAA
BST R16, 1 ; T = 1
BLD R16, 0 ; R16 = 0xAB
SEx
/ CLx
形如 SEx
的指令用于设置 SREG
寄存器中对应的标志位,形如 CLx
的指令用于清除 SREG
寄存器中对应的标志位,这两条指令作用和 BSET
/ BCLR
指令相同。
例如:
SEC ; SREG = 0x01
SEZ ; SREG = 0x03
SEN ; SREG = 0x07
SEV ; SREG = 0x0F
SES ; SREG = 0x1F
SEH ; SREG = 0x3F
SET ; SREG = 0x7F
SEI ; SREG = 0xFF
CLI ; SREG = 0x7F
CLT ; SREG = 0x3F
CLH ; SREG = 0x1F
CLS ; SREG = 0x0F
CLV ; SREG = 0x07
CLN ; SREG = 0x03
CLZ ; SREG = 0x01
CLC ; SREG = 0x00
MCU控制指令
NOP
指令占用一个周期而不做任何操作。
SLEEP
指令用于进入睡眠模式。
WDR
指令用于复位看门狗。
BREAK
指令供调试系统使用,应用程序用不到。