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
...

参考资料

  1. AVR Instruction Set Manual

AVR汇编(三):寻址方式的更多相关文章

  1. AVR之BOOTLOADER技术详解(转)

    源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...

  2. 一步一步pwn路由器之radare2使用全解

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 radare2 最近越来越流行,已经进入 github 前 25了 ...

  3. 成都国嵌-嵌入式linux必修实验手册…

    emouse收集整理,转载请注明: emouse的技术专栏 博客园:http://www.cnblogs.com/emouse/ CSDN:http://blog.csdn.net/haozi_198 ...

  4. C/C++中的预编译指令

    工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...

  5. C/C++中的预编译指令(转)

    reference:https://blog.csdn.net/sunshinewave/article/details/51020421 程序的编译过程可以分为预处理.编译.汇编三部分,其中预处理是 ...

  6. Samsung_tiny4412(驱动笔记02)----ASM with C,MMU,Exception,GIC

    /**************************************************************************** * * ASM with C,MMU,Exc ...

  7. 【Linux】进程的结构,创建,结束,以及程序转化为的进程的过程

    本文内容: 1.进程的结构 2.程序转化为进程的过程 3.进程的创建 4.进程的结束 背景知识: 1.进程是计算机中处于运行的程序的实体 2.进程是线程的容器 3.程序本身只是指令,数据以及组织形式的 ...

  8. Markdown 常用语言关键字

    Markdown 语法高亮支持的语言还是比较多的,记下来备用. 语言名 关键字 Bash bash CoffeeScript coffeescript C++ cpp C# cs CSS css Di ...

  9. ENGG1340 Computer Programming II

    课程内容笔记,自用,不涉及任何 assignment,exam 答案 Notes for self use, not included any assignments or exams Module ...

  10. AI降临,前端启用面壁计划

    作者:京东零售 郑炳懿 开篇: "在我们有生之年,你觉得会看到AI兵临城下的那一天吗?就像电影黑客帝国里面演的一样",Barry从红色的烟盒里取出一根烟发问道. "不可能 ...

随机推荐

  1. 2022-12-25:etcd可以完全替代zookeeper,原因是k8s用的etcd,不用担心不成熟。请问etcd部署在k3s中,yaml如何写?

    2022-12-25:etcd可以完全替代zookeeper,原因是k8s用的etcd,不用担心不成熟.请问etcd部署在k3s中,yaml如何写? 答案2022-12-25: 用户名:root 密码 ...

  2. 2020-12-25:MQ中,如何保证消息的顺序性?

    福哥答案2020-12-25:[稍微详细的答案:](http://bbs.xiangxueketang.cn/question/875)生产者保证消息入队的顺序.MQ 本身是一种先进先出的数据接口,将 ...

  3. 2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2,开始时机器人在其中的M位置上(M 一定是 1~N 中的一个)。如果机器人来到1位置,那么下一步只能往右来到2位置;如果机器人来到N位置,那么下一步只能往左来到 N-1 位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;规定机器人必须走 K 步,最终能来到P位置(P也是1~N中的一个)的方法有多少种?

    2021-02-14:假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2,开始时机器人在其中的M位置上(M 一定是 1~N 中的一个).如果机器人来到1位置,那么下一步只能往右来到2位置:如 ...

  4. 2022-02-26:k8s安装swagger,yaml如何写?

    2022-02-26:k8s安装swagger,yaml如何写? 答案2022-02-26: yaml如下: apiVersion: apps/v1 kind: Deployment metadata ...

  5. 2022-02-10:k8s安装mongo,yaml如何写?

    2022-02-10:k8s安装mongo,yaml如何写? 答案2022-02-10: yaml如下: apiVersion: v1 kind: Service metadata: labels: ...

  6. 浅谈如何使用 github.com/yuin/gopher-lua

    最近熟悉 go 项目时,发现项目中有用到 github.com/yuin/gopher-lua这个包,之前并没有接触过,特意去看了官方文档和找了些网上的资料,特此记录下. 本次介绍计划分为两篇文章,这 ...

  7. Solon v2.2.17 发布,Java 新的生态型应用开发框架

    相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...

  8. 2023-05-21:给定一个字符串 s 和一个整数 k 。你可以从 s 的前 k 个字母中选择一个, 并把它加到字符串的末尾。 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串。 输入:s

    2023-05-21:给定一个字符串 s 和一个整数 k .你可以从 s 的前 k 个字母中选择一个, 并把它加到字符串的末尾. 返回 在应用上述步骤的任意数量的移动后,字典上最小的字符串. 输入:s ...

  9. L1-025 正整数A+B (15 分)

    1.题目描述: 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空格分开.问题是A ...

  10. C#/VB.NET:如何从 PowerPoint 演示文稿中提取文本

    在学习或者日常工作中,有时我们需要把幻灯片的东西整理成文字,而从 PowerPoint 演示文稿中一张一张的整理手动复制粘贴,整个过程会非常费精力且耗时.那么怎么样才能比较轻松且快速地提取PowerP ...