关于C51中“大小端存储”问题的详解

时间:2021-12-22 16:11:28

  1. Little-Endian(小端存储),即将低字节的数据存储于低地址中,Big-Endian(大端存储)反之。

  2. 小端存储称为Intel模式,大端存储称为Motorola模式

  3. C51中LCALL指令将下一指令的执行地址压入堆栈中(堆栈地址由低向高增长),先存入低字节地址,再存入高字节地址,亦即使用“小端模式(Intel模式)”;除此之外,C51中的其它指令和数据,均使用“大端模式(Motorola模式)”

The  -bit machine and has no instructions  bits. Multi-byte data are stored according to the following rules. 

The  LCALL instruction stores the address of the next instruction on the stack. The address is pushed onto the stack low-order byte first. The address is, therefore, stored in memory in little endian format.
All other -bit and -bit values are stored, contrary to other Intel processors, -bit addresses that are in big endian format.
Floating-point numbers are stored according to the IEEE- format and are stored in big endian format with the high-order byte stored first. 

--引用参考:Keil Cx51 User‘s Guide -> Appendix -> E. Byte Ordering.
--http://www.keil.com/support/man/docs/c51/c51_xe.htm

  4. Keil编译器不能按用户需求设置大小端的存储模式

SYMPTOMS
My hardware's set up for big endian, but the compiler seems to be storing things little endian. Is there a compiler option to reverse the way data is stored?

CAUSE
At this time, there is no functionality in any of the compilers to effect a "global" change in the way data is stored.

--引用参考:http://www.keil.com/support/docs/730.htm

  5. 8051系列MCU中,用C语言进行编程时,数据的存储模式由编译器(Compiler)决定,如Keil C51 Compiler 4.0版本开始使用“大端存储模式”,而较早前的编译器版本中使用的是“小端存储模式”。

Version 4.0 Differences
Home » Appendix » B. Version Differences » Version 4.0 Differences

Byte Order of Floating-point Numbers
Floating-point numbers are now stored in the big endian order. Previous releases of the C51 compiler stored floating-point numbers in little endian format. Refer to Floating-point Numbers for more information.

--引用参考:http://www.keil.com/support/man/docs/c51/c51_xb_ver4dif.htm

  6. 主流MCU架构关于endian的配置:

使用小端(Little- (including , 65C816), Z80 (including Z180, eZ80 etc.), MCS-, , DEC Alpha, Altera Nios, Atmel AVR, SuperH, VAX, 和 PDP- 等等;

使用大端(Big- and 68k, Xilinx Microblaze, IBM POWER, system/, System/ 等等。

支持配置endian的架构:如下架构有配置endian为大端、小端中任一种的功能, ARM, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC 和 IA- 等等。

--引用参考:http://smilejay.com/2012/01/big-endian_little-endian/

  --编者注:ARM架构中,可通过对功能寄存器进行设置,从而切换至Big-Endian或Small-Endian存储模式。