小夏天的大西瓜 发表于 2025-3-28 21:48

单片机的寻址方式


指令由操作码和操作数组成,操作码通过指令指针PC找到,那么CPU是如何找到操作数的呢?

确定指令中操作数所在存储单元地址的方式,就是我们所说的寻址方式。对于只有操作码的指令,不存在寻址方式问题;对于双操作数指令来说,每一操作数都有自己的寻址方式。

例如,在含有两个操作数的指令中,第一操作数(也称为目的操作数)有自己的寻址方式;第二操作数(称为源操作数)也有自己的寻址方式。

指令中的操作数来源的规定:操作数只能是下列内容之一:

(1)CPU内某一寄存器名,如累加器A、通用寄存器B、堆栈指针SP、程序状态字寄存器PSW以及工作寄存器组R7~R0。

(2)存储单元。存贮单元地址范围由CPU寻址范围以及实际安装的存储器容量、连接方式决定。

(3)I/O端口号。在通用微机系统中,I/O地址空间与存储器地址空间相互独立;不过在单片机系统中,I/O端口地址空间往往与外存储器地址空间连在一起,不再区分。

(4)常数。常数类型及范围与CPU类型有关。

lvuu 发表于 2025-3-31 19:08

确实,指令的操作数可以来源于多种地方,如寄存器、内存、I/O 端口以及常数等,而 寻址方式 是计算机系统如何确定这些操作数存储地址的关键概念。

公羊子丹 发表于 2025-4-2 07:44

说得很详细!不同架构的 CPU 寻址方式也不一样,比如 CISC 和 RISC 处理器的指令格式就有差异。

周半梅 发表于 2025-4-2 07:45

8051 单片机的寻址方式挺特别的,除了直接、间接寻址外,还有位寻址,适合处理 I/O 操作。

帛灿灿 发表于 2025-4-2 07:46

STM32 这种基于 Cortex-M 的架构,主要是基于寄存器的操作,内存寻址相比 8 位单片机复杂不少。

童雨竹 发表于 2025-4-2 07:47

现代 MCU 还引入了寄存器映射 I/O(Memory-Mapped I/O),让 I/O 端口可以像访问内存一样操作,简化了寻址方式。

万图 发表于 2025-4-2 07:48

你提到的“目的操作数”和“源操作数”,在 x86 里一般是 mov dst, src 这种格式,但 ARM 指令格式就不同了。

Wordsworth 发表于 2025-4-2 07:49

现在很多高级语言编程时,开发者可能意识不到寻址方式的差别,但底层汇编优化时,选择合适的寻址方式能提升性能。

Bblythe 发表于 2025-4-2 07:50

在 DSP 处理器上,寻址方式可能还会涉及循环缓冲区和专用的地址计算单元,优化数据处理效率。

Pulitzer 发表于 2025-4-2 07:51

如果操作数是存储器数据,访问速度一般比寄存器慢很多,难怪现代 MCU 都倾向于更多使用寄存器寻址。

Uriah 发表于 2025-4-2 07:52

I/O 端口号寻址方式在 x86 里通过 IN 和 OUT 指令,但在 ARM 里基本都是内存映射,差别还是挺大的。

Clyde011 发表于 2025-4-2 07:53

你对 STM32 的寻址方式有研究吗?Cortex-M 处理器支持的位带操作(Bit-Banding)也是一种特殊的寻址机制。

dami 发表于 2025-4-2 10:10

搞汇编啊。
页: [1]
查看完整版本: 单片机的寻址方式