2011-03-14 6 views
0

다른 아키텍처 용 컴파일러를 작성한다고 가정 해보십시오. 아키텍처의 엔디안이 다릅니다. 메모리 읽기 및 쓰기 명령어가 있음이진 변환 | 교차 컴파일

값 0xAA0xBB0xCC0xDD를 저장하려는 저장 명령어의 예를 들어보십시오. 이제 어셈블리를 작성하는 동안 아키텍처에 대해 서로 다른 두 가지 지침을 작성합니까? 빅 엔디안 st (reg), 0xDD0xCC0xBB0xAA

: 작은 엔디안

st (reg), 0xAA0xBB0xCC0xDD

아니면 동일한 명령, 즉, 같은 아키텍처에 대한 st, (reg), 0xAA0xBB0xCC0xDD을 작성하고 명령은 그것을 그 프로세서에 의해 구문 분석 할 수 있도록 시스템의 엔디안을 처리합니까?

내가이 질문을하는 이유는 서로 다른 엔디안의 아키텍처간에 코드를 변환해야 할 때 바이너리 변환기가 무엇을 할 것인지 모르겠다. 건축술 A에서, 당신은 건축술 B를 위해 당신이 st, (reg), YX로 그것을 개조합니까? 그렇다면 메모리 읽기는 어떻게됩니까?

메모리 읽기 및 쓰기를 고려하여 엔디안을 처리하는 방법을 알고 싶습니다.

답변

1

나는 당신의 질문을 완전히 이해하고 있는지 모르겠다.하지만 어셈블리 언어 코드 나 디스 어셈블 된 바이너리를 번역하고 싶다.

필자가 작업 한 모든 어셈블러는 상수의 엔디안을 정상적으로 처리합니다.

st (reg), 0xAABBCCDD 

을 그리고 적절한 연산 코드에 필요한 경우 어셈블러는 contstant를 스위 즐링 (swizzle)한다 : 즉, 0xAABBCCDD을 저장하려면, 당신은 쓸 것이다,라고하는 것입니다. 엔디안이 관심사가되는 곳은 하나의 작업을 사용하여 여러 단일 바이트 값을 저장하려는 위치입니다. 같은 opcode를 사용하여 짧은 null로 끝나는 문자열 "123"을 메모리에 쓰는 것과 같은 것입니다. 당신은 little- 대 빅 엔디안 시스템에 대한 올바른 순서로 그것을 메모리에 출력을 얻을 수 있도록 어셈블리 코드에서 그 정수를 스위 즐링 (swizzle)해야 :

st (reg), 0x31323300 // big-endian 
st (reg), 0x00333231 // little-endian 

안전한 방법은 단지 순서대로 바이트를 저장하는 것입니다 당신 그들을 원한다 :

stb (reg+0), 0x31 
stb (reg+1), 0x32 
stb (reg+2), 0x33 
stb (reg+3), 0x00 

그러나 그 대신에 4 가지 지시가 필요하다.

+0

그러면 어셈블리 모듈을보고 상수와 null로 끝나는 문자열을 어떻게 구별합니까? – n0nChun

+0

@ n0nChun, 나는 그것이 불가능하거나 적어도 어렵다고 확신한다. 프로그래머의 마음을 읽는 데는 꽤 많은 돈이 듭니다. –

2

Endianess는 메모리를 읽거나 쓰는 방법과 아무 관련이 없지만 메모리가 숫자로 해석 될 때 가장 중요한 바이트를 처음 또는 마지막으로 사용한다는 것을 의미합니다. 차이를 만드는 것은 산술의 구현 일뿐입니다.

바이너리 변환기가 존재하는 경우에도 아무 것도 변경되지 않으며 숫자를 다르게 해석하는 ADD, SUB 및 MUL과 같은 명령어입니다.

관련 문제