AVR汇编(三):寻址方式¶
AVR具有多种寻址方式,在介绍具体的汇编指令之前,有必要对它们做一定了解。
前面介绍过,AVR将内存空间分为多个部分:寄存器堆、I/O空间、数据空间、程序空间。这些空间支持的指令和寻址方式都各不相同。
寄存器堆的寻址方式¶
AVR中寄存器堆的寻址方式分为3种:立即寻址、单寄存器寻址、双寄存器寻址。
立即寻址¶
所谓立即寻址,就是指操作数直接编码在指令中。需要注意的是,只有 R16
~ R31
寄存器支持立即寻址。
例如:
单寄存器寻址¶
在单寄存器寻址方式下,操作数存放在目的寄存器 Rd
中。
例如:
双寄存器寻址¶
在双寄存器寻址方式下,操作数分别存放在源寄存器 Rr
和目的寄存器 Rd
中。
例如:
I/O空间的寻址方式¶
AVR中I/O空间具有独立的地址,范围为0x00~0x3F,支持直接寻址和位寻址。
直接寻址¶
在直接寻址方式下,操作数地址 A
直接编码在指令中。
例如:
位寻址¶
I/O空间中地址为0x00~0x1F的区域支持按位访问。
例如:
数据空间的寻址方式¶
AVR中数据空间具有5种寻址方式:直接寻址、间接寻址、带前缀自减的间接寻址、带后缀自增的间接寻址、带偏移量的间接寻址。
直接寻址¶
在直接寻址方式下,操作数地址直接编码在指令中, Rd
/ Rr
指定目的寄存器/源寄存器。
例如:
间接寻址¶
在间接寻址方式下,操作数地址存放在 X
/ Y
/ Z
寄存器中。
例如:
带前缀自减的间接寻址¶
在带前缀自减的间接寻址方式下,操作数地址存放在 X
/ Y
/ Z
寄存器中,并且在操作之前 X
/ Y
/ Z
先自减一。
例如:
带后缀自增的间接寻址¶
在带后缀自增的间接寻址方式下,操作数地址存放在 X
/ Y
/ Z
寄存器中,并且在操作之后 X
/ Y
/ Z
再自增一。
例如:
带偏移量的间接寻址¶
在带偏移量的间接寻址方式下,操作数地址由 Y
/ Z
寄存器和编码在指令中的偏移量 q
相加得出。
例如:
程序空间的寻址方式¶
AVR中程序空间具有5种寻址方式:常量寻址、带后缀自增的常量寻址、直接寻址、间接寻址、相对寻址,前两种寻址方式用于访问位于程序空间的常量,后三种用于程序跳转。
常量寻址¶
在常量寻址方式下,操作数地址(字节地址)存放在 Z
寄存器中, Z
寄存器中高15位指定字地址,最低位为0表示访问的是字的低位字节,1表示访问的是字的高位字节。
例如:
带后缀自增的常量寻址¶
在带后缀自增的常量寻址方式下,操作数地址(字节地址)存放在 Z
寄存器中,并且在操作之后 Z
寄存器自增一。
例如:
直接寻址¶
在直接寻址方式下,程序接下来的执行地址(字地址) k
直接编码在指令中。
例如:
间接寻址¶
在间接寻址方式下,程序接下来的执行地址(字地址)存放在 Z
寄存器中。
例如:
相对寻址¶
在相对寻址方式下,程序接下来的执行地址(字地址)为 PC
+ k
+ 1, k
的范围为-2048~2047。
例如: