我正在尝试用汇编语言编写一个程序,以在汇编语言中切换 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/