2012-05-10 3 views
2

어셈블리에서 계속 읽었습니다. 내가 프로그래밍 언어에 대해 이해 한 것에서 볼 때, 컴파일러 (어셈블러 ... 두 곳 사이의 미묘한 차이가 있음을 알고 있습니다.)가 객체 코드를 생성합니다. 컴퓨터 언어의 비우호적 인 슬픈 지시어 무효. 이 객체 코드는 프로세서에 의해 해석되며, 그 후에 링커는이를 실행 가능하게 만듭니다. 나는 각 프로세서가 올바른 어셈블리를해야한다는 것을 알고 있습니다. 예. .386, .486, .586 나를 괴롭히는 것은 MASM을 통한 DOS 프로그램 실행과 NASM 또는 GAS가없는 Linux를 통한 동일한 프로그램 실행 사이의 차이점입니다. 소스 코드가 오브젝트 코드로 컴파일 된 경우이 시점에서 크로스 플랫폼이 아닙니까? 나는 델처럼 윈도우를 리눅스처럼 쉽게 듀얼 부팅 할 수있다. 내가 여기서 무엇을 놓치고 있니?Linux, Windows에서 실행중인 어셈블리

또한 개체 코드를 볼 수있는 방법을 찾고 있으므로 이퀄 타임 디버거를 통해 실행을 해독 할 필요가 없습니다. 필자가 작성한 소스 코드에 대한 Directive machine code Directive. 리눅스에서 objdump와 같은 결과를 낼 수있는 방법이 있습니까?

+1

[게시물에 서명 또는 태그 라인을 추가하지 마십시오.] (http://stackoverflow.com/faq#signatures). – meagar

+0

DOS는 (16 비트) 리얼 모드로 실행되며 이는 32 비트 Windows/Linux에서 사용되는 보호 모드와 매우 다릅니다. 그것은 매우 다르므로 다른 아키텍처 (ARM과 MIPS와 같은)로 간주 될 수 있으므로 더 이상 플랫폼이 아닙니다. Windows는 DOS 바이너리를 실행하기 위해 특별한 하드웨어 호환 모드 (가상 모드)를 사용하지만 최신 (x86_64) 시스템에서도 더 이상 가능하지 않습니다. – hirschhornsalz

+2

어셈블리의 중요성은 어셈블리가 저수준이지만 여전히 OS. 그리고 낮은 레벨이기 때문에 OS와 완전히 다른 가장 낮은 수준의 호출 메커니즘을 사용하여 OS와 상호 작용해야합니다.또한 어셈블리는 종종 OS 자체에 따라 완전히 다르게 배치되는 자체 프로세스를 위해 메모리에 직접 액세스합니다. 당신은 DOS와 리눅스에서 커맨드 라인 인수에 필요한 다른 어셈블리 소스를 보았을까요? – Linuxios

답변

9

최신 "x86"칩은 DOS에서 사용되는 16 비트 명령어 세트와 리눅스의 다양한 버전에서 사용되는 32 비트 및 64 비트 명령어 세트를 최소한 3 가지 이해합니다. & 리눅스.

칩이 동일하고 동일한 모드에서 실행 중일 수 있지만 프로그램이 호스트 운영 체제와 상호 작용하여 서비스 (예 : 입력/출력)를 얻는 방식은 상당히 다릅니다.

가장 간단한 프로그램을 제외한 모든 프로그램은 일반 작업 (문자열 연산, 형식화 된 입력 및 출력, 수학, 중요하지 않은 네트워킹 등)을 지원하는 추가 객체 코드의 외부 라이브러리를 사용하는 경향이있어, 처음부터 다시 써야합니다. 그러나 사용 가능한 라이브러리의 정확한 수집과 호스트와의 요청 및 상호 작용 방법은 호스트 운영 체제에 따라 다릅니다. .DLL의/.so가 이미 시스템에있을 것으로 예상되는 (동적 연결) 대신 응용 프로그램 (정적 연결)을 사용하여 라이브러리를 패키지 할 수 있지만 기본 원시 운영 체제 서비스를 요청할 때의 차이점을 여전히 수용해야합니다 .

또한 java 및 .net과 같은 일부 체계는 실제 프로세서에서 직접 실행하는 대신 가상 컴퓨터 또는 시뮬레이트 된 프로세서에서 실행되는 개체 코드를 만듭니다. 가상 시스템 엔진 및 지원 라이브러리가 호환 가능한 형식으로 제공되는 경우 어느 정도까지는 이식성이 있습니다.

objdump의 mingw 버전은 Windows에서 실행되며 Windows 실행 파일을 처리하며 Linux와 유사한 의미로 Windows 프로그램을 작성하기위한 도구 모음의 일부입니다. 또한 리눅스에서 실행되고 윈도우 파일을 처리하는 크로스 버전이 있습니다. 다른 방법으로 가고, WINE 호환성 레이어는 Windows에서 많은 윈도우 실행 파일을 실행할 수 있습니다 - 당신은 그것에 대해 명시 적으로 테스트 할 수 있습니다. 그러나 posix 인터페이스에 대해 C로 작성하거나 (또는 ​​어셈블리와 함께 OS 함수에 많은 래퍼를 사용하는 경우) gnu 도구의 linux 및 cross 또는 mingw 버전으로 빌드 된 하나의 코드베이스를 가질 수 있어야합니다. 두 운영 체제 용 바이너리를 비교적 효율적으로 생성 할 수 있습니다.

+0

와우, 감사합니다. 이것은 나의 연구 방향을 제시해 주었다. – Ccorock

관련 문제