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ストレージモードに切り替えることができます.
マシンが大端ストレージか小端ストレージかを判断する方法:
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.
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.
4.Keilコンパイラは、ユーザーのニーズに応じてサイズ端のストレージモードを設定できません.
SYMPTOMS
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
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)を使用したアーキテクチャ:
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;
}