Endian 알아내는 프로그램 만들기

lacovnk의 이미지

Byte Endian을 알아내는 C프로그램을 작성하는 것이 시험문제로 나왔었다. 다음과 같이 짰는데.. 제대로 동작할지 모르겠다. 다행히 컴파일 경고는 나지 않는데, Big Endian인 machine이 없어서 테스트 할 수가 없다 orz

자료를 가리키는 포인터가 MSB를 가리키면 Big Endian, LSB를 가리키면 Little Endian이라는 정의에 따라 작성했다.

#include <stdio.h>
 
void
checkEndian()
{
    int data = 0x0000ffff;
    void* ptr = (void*) &data;
    char ch = *((char*)ptr);
 
    if((int)ch == 0x00){puts("Big Endian");}
    else {puts("Little Endian");}
 
}
 
int
main(int argc,char**argv)
{
    checkEndian();
    return 0;
}

다른 고급 레벨 프로그램에서는 어떻게 할 지 궁금하다. python은? php는? java는 JVM내에서 일정한 엔디안을 쓰는 것으로 알고 있는데, 그것과 달리 Hardware의 Endian을 알아낼 수 있는 방법이 있을까?

mach의 이미지

하드웨어에 따라서, 빅엔디언 또는 리틀엔디언 만 각각 제공하기도 하지만, 하드우에어중 HP의 PA-RISC와 PowerPC등은 빅/리틀을 둘다 지원합니다. 운영체제 제작자(시스템소프트웨어 제작자) 가 special register에 값을 세팅해서 모드를 변경할 수 있게 되어 있습니다.

보통 endian이 big/little인가를 바라보는 관점은 시스템(특히, 운영체제)의 수준에서 보는 것이 타당하다고 봅니다. 말씀하신대로 자바는 가상머신(가상 하드웨어로 볼 수도 있지요)이고, 항상 Big Endian으로 동작합니다. 자바가 x86윈도우 상에서 수행되건, HPUX에서 수행되건 간에 말입니다.

일단, 고급언어에서는 저수준 인터페이스(C로 제작된 라이브러리) 를 호출해서 얻을 수 있겠군요. 방금 만들어서 올리신 코드를 라이브러리화 해서 말입니다.


------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

ed.netdiver의 이미지

헉, register setting으로 endian을 바꿀수도 있군요.
전 여태 reset assert시점에서의 mode configuration pin 설정으로 endian을 선택할수 있고 그렇게 고정된 endian은 running중에 바꿀수 없는건줄 알고 있었습니다.
endian을 바꾸는 시점에 기존 memory에 있던 op code들은 모두 garbage가 될텐데, switching시점과 후를 정확히 잘라서 opcode byte order도 반대로 만들어주는 linker, locator가 필수겠군요.
화~ 어렵겠당.
저 좀더 자세한 설명좀 부탁드려도 될까요?^^;

\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

teiroops의 이미지

register setting으로 big/little 쉽게 바꿀 수 있었습니다.

반대로, register 값을 읽어내서 big/little인지 알아낼 수도 있었구요.