[其它应用] 51编译器区分位地址和字节地址

[复制链接]
2995|4
 楼主| 中国龙芯CDX 发表于 2023-3-12 21:10 | 显示全部楼层 |阅读模式
C51编译器如何区分位地址和字节地址?

其实是靠预定义实现的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者声明了P0端口地址位于0x80,后者说明了P0端口的bit0,即P0.0位于位地址空间0x80处。这2个0x80具有完全不同的含义,靠关键字sfr和sbit来区别。这样当程序被编译时,编译器会依此编译成相应的汇编语言。例如:
C51语句: P0 = 1;
P0声明为sfr,因此编译成:mov 80h,01h,将把0x01数据送入0x80单元,由于0x80单元物理上对应P0端口,因此,P0.0脚将输出高电平(其实是呈现高阻态,P0口独有的),其他.1-.7脚输出低电平。
C51语句: P0_0 = 1;
P0_0声明为sbit,因此编译成:setb 80h,这将把位地址空间的0x80地址的bit的值置1。这个位正是P0口的bit0,执行后,P0.0将输出高阻态。而P0.1-.7不会变化。
OKAKAKO 发表于 2023-11-12 19:24 | 显示全部楼层
靠预定义实现的
szt1993 发表于 2023-11-12 20:27 | 显示全部楼层
编译器会依此编译成相应的汇编语言。
绒兔星球 发表于 2025-8-30 15:03 | 显示全部楼层
51 编译器通过存储区和寻址方式区分位地址与字节地址。位地址位于 20H-2FH 字节地址的位(00H-7FH)及特殊功能寄存器中可位寻址的位;字节地址为整个存储空间地址。访问时,位操作指令(如 SETB)操作位地址,字节操作指令(如 MOV)操作字节地址,编译器会根据指令自动识别寻址类型。
樱花树维纳斯 发表于 2025-9-8 18:08 | 显示全部楼层
51 编译器通过存储区和寻址方式区分位地址与字节地址。位地址位于 20H-2FH 字节地址的位(00H-7FH)及特殊功能寄存器中可位寻址的位,用 bit 关键字定义。字节地址对应整个存储单元,用 sfr/sfr16 定义。访问时,位操作指令针对位地址,字节操作指令针对字节地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

339

主题

2677

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部