C 51における「サイズエンドストレージ」の問題の詳細について

3447 ワード

1.Little-Endian(スモールエンドストレージ)は、ローバイトのデータをローアドレスに格納し、Big-Endian(大エンドストレージ)は逆にします.
2.小端記憶をIntelモード、大端記憶をMotorolaモードと呼ぶ.
3.C 51のLCALL命令は次の命令の実行アドレスをスタックに押し込み(スタックアドレスは低から高へ増加)、まず低バイトアドレスを格納し、それから高バイトアドレスを格納し、すなわち「小端モード(Intelモード)」を使用する.それ以外に、C 51の他の命令とデータは、いずれも「大端モード(Motorolaモード)」を使用する.
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.   
  •   

  • 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.   
  • 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.   

  • 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.   
  •   

  • --参照:Keil Cx 51 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言語でプログラミングを行う場合、データの記憶モードは、Keil C 51 Compiler 4.0のバージョンから「大端記憶モード」が使用されるようにコンパイラ(Compiler)によって決定されるが、以前のコンパイラバージョンでは「小端記憶モード」が使用されていた.
    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-endian)を使用したアーキテクチャ:
  • で最も一般的なx 86アーキテクチャ(x 86_64を含む)、6502(including 65802,65 C 816)、Z 80(including Z 180,eZ 80 etc.)、MCS-48,8051、DEC Alpha、Altera Nios、Atmel AVR、SuperH、VAX、PDP-11などがある.  

  •   
  • 大端(Big-endian)を使用したアーキテクチャ:
  • Motorola 6800 and 68 k,Xilinx Microblaze,IBM POWER,system/360,System/370など.  
  •   

  • endianの構成をサポートするアーキテクチャ:
  • 以下のアーキテクチャには、endianを大端、小端のいずれかに構成する機能、ARM、PowerPC、Alpha、SPARC V 9、MIPS、PA-RISC、IA-64などがある.  

  •   
  • --参照: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;
    }