assembly - _SFR_IO8(0x04) 是做什么的?调压器

标签 assembly mapping port avr microprocessors

我正在尝试用汇编语言编写一个程序,以在汇编语言中切换 Arduino MEGA2560 的板载 LED。

为此,我只需将引脚(本例中为 13,即 PB7)的方向指示为输出,然后将该引脚设置为高或低。

据我了解,有两个寄存器与此问题相关。一个是端口方向寄存器(DDRB)和引脚状态寄存器(PORTB)

所以我试图了解这些寄存器有什么数字或地址,以便我可以在汇编中为它们分配值。我进入了定义这些常量的 C++ 库 (iomxx0.h) 例如 DDRB 的定义方式如下:

#define DDRB    _SFR_IO8(0x04)
#define DDB7    7
#define DDB6    6
#define DDB5    5
#define DDB4    4
#define DDB3    3
#define DDB2    2
#define DDB1    1
#define DDB0    0

我很好奇寄存器的地址是否为0x04? 如果是这种情况,_SFR_IO8() 在做什么?

最佳答案

这是一个宏。如果您好奇,可以在标题中找到它的定义:

#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)

#ifndef __SFR_OFFSET
/* Define as 0 before including this file for compatibility with old asm
   sources that don't subtract __SFR_OFFSET from symbolic I/O addresses.  */
#  if __AVR_ARCH__ >= 100
#    define __SFR_OFFSET 0x00
#  else
#    define __SFR_OFFSET 0x20
#  endif
#endif

此外,

#define _SFR_IO_ADDR(sfr) ((sfr) - __SFR_OFFSET)
#define _SFR_MEM_ADDR(sfr) (sfr)

在 AVR 上,您可以使用通常的内存读/写或输入/输出指令来访问 SFR。但是,地址取决于访问方法。这些宏的存在可以帮助您做到这一点。在你的例子中,0x04 是 IO 地址,0x24 是内存映射地址。

关于assembly - _SFR_IO8(0x04) 是做什么的?调压器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58465812/

相关文章:

emacs - 在 Emacs 中,如何将 Ctrl-Key 设置为 Vim 的 LowerCaseKey,以及如何将 Alt-Key 设置为 Vim 的 HigherCaseKey?

performance - 在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或and?

winapi - 实用恶意软件分析 - 实验 5.1 问题 11 功能 sub_100036C3

vim - 在 Vim 中使用 latex-suite 映射 <C-j> 的问题

sockets - 网络发现应用程序使用哪个端口

networking - Ambari 1.6.1 hadoop端口8088没有网站

ruby-on-rails - 无法连接到本地主机 :3000 for Rails but 127. 0.0.1:3000 有效

linux - 从预编译的 Linux 内核模块中删除对 __gnu_mcount_nc 的引用

assembly - 如何在汇编中将正数转换为负数

asp.net-mvc - 使用 ValueInjecter 在具有不同属性名称的对象之间进行映射