计算机是怎么区分数据和指令的
程序计数器(PC)的引导
CPU通过程序计数器(PC)获取下一条指令的地址。PC指向的内存单元内容被自动视为指令,由控制单元解码并执行。指令执行后,PC会更新为下一条指令的地址(顺序或跳转),从而确保指令流的连续性。指令的语义决定数据访问
指令本身包含操作码和操作数。操作码指明操作类型(如加法),而操作数可能直接包含数据或指向数据的地址。例如,LOAD R1, [0x1000]会从地址0x1000读取数据到寄存器R1,此时该地址的内容被视为数据。内存保护机制(现代系统)
现代计算机通过内存管理单元(MMU)和操作系统协作,将内存划分为代码段和数据段。代码段标记为可执行但不可写,数据段标记为可读写但不可执行。这种硬件级保护防止数据被意外执行(如防范缓冲区溢出攻击)。架构差异
冯·诺依曼架构:指令和数据共享同一存储器,依赖上下文区分。
哈佛架构:指令和数据存储于独立存储器,物理分离(如多数微控制器),从硬件层面避免混淆。
动态自修改代码的例外
极少数情况(如自修改代码或JIT编译),程序可能将数据作为指令执行。此时,CPU仍按PC指向的地址处理内容为指令,需确保目标内存具有可执行权限。