AVR汇编(三):寻址方式
AVR汇编(三):寻址方式
AVR具有多种寻址方式,在介绍具体的汇编指令之前,有必要对它们做一定了解。
前面介绍过,AVR将内存空间分为多个部分:寄存器堆、I/O空间、数据空间、程序空间。这些空间支持的指令和寻址方式都各不相同。
寄存器堆的寻址方式
AVR中寄存器堆的寻址方式分为3种:立即寻址、单寄存器寻址、双寄存器寻址。
立即寻址
所谓立即寻址,就是指操作数直接编码在指令中。需要注意的是,只有 R16 ~ R31 寄存器支持立即寻址。
例如:
ANDI R16, 0x01 ; R16 <- R16 & 0x01
单寄存器寻址

在单寄存器寻址方式下,操作数存放在目的寄存器 Rd 中。
例如:
INC R16 ; R16 <- R16 + 1
双寄存器寻址

在双寄存器寻址方式下,操作数分别存放在源寄存器 Rr 和目的寄存器 Rd 中。
例如:
ADD R16, R17 ; R16 <- R16 + R17
I/O空间的寻址方式
AVR中I/O空间具有独立的地址,范围为0x00~0x3F,支持直接寻址和位寻址。
直接寻址

在直接寻址方式下,操作数地址 A 直接编码在指令中。
例如:
OUT PORTB, R16 ; PORTB <- R16
位寻址
I/O空间中地址为0x00~0x1F的区域支持按位访问。
例如:
SBI PORTB, 2 ; PORTB.2 <- 1
数据空间的寻址方式
AVR中数据空间具有5种寻址方式:直接寻址、间接寻址、带前缀自减的间接寻址、带后缀自增的间接寻址、带偏移量的间接寻址。
直接寻址

在直接寻址方式下,操作数地址直接编码在指令中, Rd / Rr 指定目的寄存器/源寄存器。
例如:
LDS R16, 0X0100 ; R16 <- (0X0100)
间接寻址

在间接寻址方式下,操作数地址存放在 X / Y / Z 寄存器中。
例如:
LD R16, X ; R16 <- (X)
带前缀自减的间接寻址

在带前缀自减的间接寻址方式下,操作数地址存放在 X / Y / Z 寄存器中,并且在操作之前 X / Y / Z 先自减一。
例如:
LD R16, -X ; X <- X - 1, R16 <- (X)
带后缀自增的间接寻址

在带后缀自增的间接寻址方式下,操作数地址存放在 X / Y / Z 寄存器中,并且在操作之后 X / Y / Z 再自增一。
例如:
LD R16, X+ ; R16 <- (X), X <- X + 1
带偏移量的间接寻址

在带偏移量的间接寻址方式下,操作数地址由 Y / Z 寄存器和编码在指令中的偏移量 q 相加得出。
例如:
LDD R16, Y+2 ; R16 <- (Y + 2)
程序空间的寻址方式
AVR中程序空间具有5种寻址方式:常量寻址、带后缀自增的常量寻址、直接寻址、间接寻址、相对寻址,前两种寻址方式用于访问位于程序空间的常量,后三种用于程序跳转。
常量寻址

在常量寻址方式下,操作数地址(字节地址)存放在 Z 寄存器中, Z 寄存器中高15位指定字地址,最低位为0表示访问的是字的低位字节,1表示访问的是字的高位字节。
例如:
LPM R16, Z ; R16 <- (Z)
带后缀自增的常量寻址

在带后缀自增的常量寻址方式下,操作数地址(字节地址)存放在 Z 寄存器中,并且在操作之后 Z 寄存器自增一。
例如:
LPM R16, Z+ ; R16 <- (Z), Z <- Z + 1
直接寻址

在直接寻址方式下,程序接下来的执行地址(字地址) k 直接编码在指令中。
例如:
JMP FUNC ; PC <- FUNC
...
FUNC:
...
间接寻址

在间接寻址方式下,程序接下来的执行地址(字地址)存放在 Z 寄存器中。
例如:
IJMP ; PC <- Z
相对寻址

在相对寻址方式下,程序接下来的执行地址(字地址)为 PC + k + 1, k 的范围为-2048~2047。
例如:
RJMP FUNC ; PC <- FUNC 汇编器会自动计算k的值
...
FUNC: ; FUNC与RJMP指令的距离不能超过-2048~2047
...
参考资料
AVR汇编(三):寻址方式的更多相关文章
- AVR之BOOTLOADER技术详解(转)
源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...
- 一步一步pwn路由器之radare2使用全解
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...
- 成都国嵌-嵌入式linux必修实验手册…
emouse收集整理,转载请注明: emouse的技术专栏 博客园:http://www.cnblogs.com/emouse/ CSDN:http://blog.csdn.net/haozi_198 ...
- C/C++中的预编译指令
工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...
- C/C++中的预编译指令(转)
reference:https://blog.csdn.net/sunshinewave/article/details/51020421 程序的编译过程可以分为预处理.编译.汇编三部分,其中预处理是 ...
- Samsung_tiny4412(驱动笔记02)----ASM with C,MMU,Exception,GIC
/**************************************************************************** * * ASM with C,MMU,Exc ...
- 【Linux】进程的结构,创建,结束,以及程序转化为的进程的过程
本文内容: 1.进程的结构 2.程序转化为进程的过程 3.进程的创建 4.进程的结束 背景知识: 1.进程是计算机中处于运行的程序的实体 2.进程是线程的容器 3.程序本身只是指令,数据以及组织形式的 ...
- Markdown 常用语言关键字
Markdown 语法高亮支持的语言还是比较多的,记下来备用. 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Di ...
- ENGG1340 Computer Programming II
课程内容笔记,自用,不涉及任何 assignment,exam 答案 Notes for self use, not included any assignments or exams Module ...
- AI降临,前端启用面壁计划
作者:京东零售 郑炳懿 开篇: "在我们有生之年,你觉得会看到AI兵临城下的那一天吗?就像电影黑客帝国里面演的一样",Barry从红色的烟盒里取出一根烟发问道. "不可能 ...
随机推荐
- SQL课设之报刊订阅管理
E-R图: 一些常用命令: 1.登录mysql 2.选择进入数据库 相关SQL代码如下: CREATE TABLE Administrator( Gname varchar(50)PRIMARY K ...
- 2023-03-25:若两个正整数的和为素数,则这两个正整数称之为“素数伴侣“。 给定N(偶数)个正整数中挑选出若干对,组成“素数伴侣“, 例如有4个正整数:2,5,6,13, 如果将5和6分为一组的
2023-03-25:若两个正整数的和为素数,则这两个正整数称之为"素数伴侣". 给定N(偶数)个正整数中挑选出若干对,组成"素数伴侣", 例如有4个正整数:2 ...
- 2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
2021-07-14:接雨水.给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 福大大 答案2021-07-14: 左右指针向中间移动.左指针是左边柱 ...
- Python潮流周刊#1:如何系统地自学Python?
这里记录每周值得分享的 Python 及通用技术内容,部分内容为英文,已在小标题注明.(本期标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 文章&教程 1.编程语言的错误处理模式 ...
- 【设计模式】使用 go 语言实现简单工厂模式
最近在看<大话设计模式>,这本书通过对话形式讲解设计模式的使用场景,有兴趣的可以去看一下. 第一篇讲的是简单工厂模式,要求输入两个数和运算符号,得到运行结果. 这个需求不难,难就难在类要怎 ...
- 关于SpringBoot AutoConfiguration
(1)如何导入的自动配置类 首先我们得从@SpringBootApplication注解入手. @SpringBootApplication public class SpringBootDemoAp ...
- 如何基于G6进行双树流转绘制?
1. 背景 业务背景:CRM系统随着各业务条线对线索精细化分配的诉求逐渐增加,各个条线的流向规则会越来越复杂,各个条线甚至整个CRM的线索流转规则急需一种树形的可视化的图来表达. 技术背景:在开发之前 ...
- Java(break、continue、label)
1.break break在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch语句中使用) 例如:循环输出10 ...
- 7-9 《Fibonacci 数列》
7-9 <Fibonacci 数列> 思路:吃过前面<序列求和>问题的亏 但还是要尝试一下循环大法 Fn=Fn-1+Fn-2 定义int型 aFn-1 , bFn-2 , cF ...
- WC2021及学长分享题目
部分题目见洛谷题单 动态更新. 标 * 为想做的题. hdhd: CF1214G Feeling Good CF1305F Kuroni and the Punishment AGC016F Game ...