2013-11-03 3 views
1

나는 나 자신을 가르치고/어셈블리에 대해 읽었습니다. 어셈블리에 관한 대부분의 책은 x86을 가리 킵니다. 코드의 모든 레지스터 이름은 "r"이 아닌 "e"로 시작합니다 (x86-64 에서처럼). 그러나 64 비트 Linux를 사용하며 x86-64를 언급하지 않기 때문에이 책에 어떤 가치가 있는지 궁금합니다.x86 자료를 사용하여 64 비트 OS에서 어셈블리를 학습 하시겠습니까?

잠깐 말하자면,이 리소스를 사용하여 x86-64를 배우는 것이 정말로 가치있는 일입니다. 또는 레지스터 이름 지정 규칙의 차이 외에도 다른 두 가지 차이점이있어 x86 자료를 학습하기가 어려울 수 있습니까?

+1

호출 규칙이 다르지만 다른 차이점은 실제로 중요하지 않습니다. – harold

+0

호출 규칙 외에도 32 비트 레지스터를 대상 레지스터로 사용하면 해당 64 비트 레지스터의 상위 32 비트가 항상 0으로 설정된다는 점을 기억해야합니다. 다른 문제도 있습니다. 모든 32 비트 명령어 (비교적 일반적인 명령어도 포함)가 유효한 64 비트 명령어는 아닙니다. 내 질문 (폐쇄적 인) http://stackoverflow.com/questions/11897116/how-to-convert-linux-32-bit-gcc를 참조하십시오. -inline-assembly-to-64-bit-code. – nrz

답변

4

64 비트 Linux는 32 비트 응용 프로그램을 실행할 수 있으므로 컴퓨터에 32 비트 응용 프로그램을 만들 수 있습니다. 이 방법으로 책과 예제 32 비트 코드가 완전히 유용합니다.

유일한 문제는 어셈블리 응용 프로그램이 일부 32 비트 공유 라이브러리에 동적으로 링크하는 경우입니다. 이 문제를 해결하려면 32 비트 호환성 레이어를 설치해야합니다.

Linux 시스템 호출 만 사용하는 어셈블리 프로그램은 실제로 32 비트 용으로 컴파일 된 공유 라이브러리 집합 인이 계층 없이는 정상적으로 작동합니다.

생각해 보면, 32 비트 코드를 쓰는 것이 프로그램이 더 많은 사람들에게 유용하기를 원한다면 여전히 좋습니다. 아직 32 비트 컴퓨터가 많이 있으며 곧 사라지지 않을 것입니다.

+1

또한 64 비트 어셈블러는 복잡한 호출 규칙 (스택 기반, 특수 스택 포인터 정렬 ...이 아닌) 때문에 배우기가 더 어렵다는 점도 알아야합니다. 따라서 32 비트를 작성하는 것은 초보자에게 분명 좋습니다. –

0

호출 규칙 및 스택 관리가 더 간단하기 때문에 실제로 32 비트에서 어셈블리를 배우는 것이 약간 쉽습니다.

64 비트에서 ABI에 대해 걱정할 필요가 있습니다. 뿐만 아니라 컨벤션은 모든 OS에 동일하지 않습니다. 예를 들어 Mac OS X의 ABI 규칙은 Windows의 규칙과 다릅니다 (레지스터는 동일하지 않으며 Windows에서는 4 개의 레지스터 만 사용함).

어셈블러 (as)와 함께 -arch i386을 사용하여 어셈블리 코드를 컴파일 할 수 있습니다. clang 또는 gcc를 사용하면 -m32를 사용할 수 있습니다 (적어도 Linux OS에서는 사용하지 않았기 때문에 Mac OS X에서 사용). 비트율이 다른 모듈 (32 비트 대 64 비트)을 연결할 수 없습니다.

프로그램을 64 비트 용으로 전환하거나 컴파일 할 준비가되면 스택을 처리 할 때 32 비트 대신 64 비트 워드를 푸시해야하지만 말을해야합니다.