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

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


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


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

  1. The 8051 is an 8-bit machine and has no instructions for directly manipulating data objects that are larger than 8 bits. Multi-byte data are stored according to the following rules.   
  2.   
  3. The 8051 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.   
  4. All other 16-bit and 32-bit values are stored, contrary to other Intel processors, in big endian format, with the high-order byte stored first. For example, the LJMP and LCALL instructions expect 16-bit addresses that are in big endian format.   
  5. Floating-point numbers are stored according to the IEEE-754 format and are stored in big endian format with the high-order byte stored first.   
  6.   
  7. --引用参考:Keil Cx51 User‘s Guide -> Appendix -> E. Byte Ordering.  
  8. --http://www.keil.com/support/man/docs/c51/c51_xe.htm  



4. Keil编译器不能按用户需求设置大小端的存储模式。
  1. SYMPTOMS  
  2. 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?  
  3.   
  4. CAUSE  
  5. At this time, there is no functionality in any of the compilers to effect a "global" change in the way data is stored.  
  6.   
  7. --引用参考:http://www.keil.com/support/docs/730.htm  



5. 8051系列MCU中,用C语言进行编程时,数据的存储模式由编译器(Compiler)决定,如Keil C51 Compiler 4.0版本开始使用“大端存储模式”,而较早前的编译器版本中使用的是“小端存储模式”。
  1. Version 4.0 Differences  
  2. Home » Appendix » B. Version Differences » Version 4.0 Differences  
  3.   
  4. Byte Order of Floating-point Numbers  
  5. 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.  
  6.   
  7. --引用参考:http://www.keil.com/support/man/docs/c51/c51_xb_ver4dif.htm  


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

  1. 使用小端(Little-endian)的架构:  
  2. 最常用x86架构(包括x86_64),还有 6502 (including 65802, 65C816), Z80 (including Z180, eZ80 etc.), MCS-48, 8051, DEC Alpha, Altera Nios, Atmel AVR, SuperH, VAX, 和 PDP-11 等等;  
  3.   
  4. 使用大端(Big-endian)的架构:  
  5.  Motorola 6800 and 68k, Xilinx Microblaze, IBM POWER, system/360, System/370 等等。  
  6.   
  7. 支持配置endian的架构:  
  8. 如下架构有配置endian为大端、小端中任一种的功能, ARM, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC 和 IA-64 等等。  
  9.   
  10. --引用参考:http://smilejay.com/2012/01/big-endian_little-endian/  

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


判断机器是大端存储还是小端存储的方法:

#include <stdio.h>
#include <stdint.h>

void judgeEndian() {
    uint16_t var = 0x0001;
    if (*(uint8_t *)&var == 0x01)
        puts("little endian");
    else
        puts("big endian");
}

int main() {
    judgeEndian();
    return 0;
}



你可能感兴趣的:(关于C51中“大小端存储”问题的详解)