2010-05-03 1 views
11

x86 어셈블러 작성에 관심이 있습니다. 인텔이 사용하는 구문을 사용하여 x86 어셈블리 니모닉 명령어를 해당 이진 머신 코드 명령어에 매핑하는 좋은 방법이 무엇인지 궁금합니다.어셈블러가 x86 명령어 연상 기호를 이진 머신 명령어에 매핑하는 방법은 무엇입니까?

+0

도 읽습니다. http://stackoverflow.com/questions/2546715/how-to-analysis-how-many-bytes-each-instruction-takes-in-assembly/2761248#2761248 – claws

답변

10

니모닉과 기계어의 물리적 매핑을 알고 싶습니까? 그렇다면 Intel IA32/IA64 reference manuals의 볼륨 2A & 2B는 x86 머신 코드의 이진 형식을 설명합니다.

위키피디아의 x86 instruction set page은 처음 소개 될 때 우선 순위를 정하는 데 도움이되는 모든 지침이 소개 될 때의 간단한 목록을 제공합니다.

그러나 어셈블리 코드 텍스트 파일을 구문 분석하여 프로그램에서 컴퓨터 코드를 작성할 수있는 시점에 도달하는 방법에 대해 질문하는 경우 기본적으로 컴파일러를 작성하는 방법을 이해해야합니다. lex 및 yacc 도구는 시작하기에 좋은 곳이지만 컴파일러를 작성하는 방법을 모르면 책을 얻어야합니다. 나는 Dragon book이 거기서 최고의 하나라고 생각합니다. 그러나 당신이 사용할 수있는 다른 책이 몇 가지 있습니다. 그래서 많은 추천이 있습니다.

+0

이 경우 완전한 컴파일러가 필요하지 않을 수 있습니다. 일종의 조회 테이블을 가진 간단한 두 개의 패스 어셈블러가 필요합니다. 항상 최선의 코드를 생성하는 것은 아니지만 작동하는 것을 얻을 수 있습니다. –

+0

@Nathan : 어셈블러 *는 본격적인 컴파일러입니다. 컴파일러는 다른 언어에서 opcode에 이르는 변환기 일뿐입니다. 전체 번역 프로세스를 계산하면 어셈블러와 컴파일러가 완전히 똑같은 일을하게됩니다. 다른 대부분의 언어는 복잡하고 어셈블리 언어는 간단하고 어셈블리는 적당한 중간 지점으로 작용합니다. 따라서 많은 컴파일러가 번역을 두 단계로 분리합니다. 어셈블리로 변환하고 어셈블러에서 실제로 opcode를 생성합니다. 어셈블러는 일반적으로 이로부터 이익을 얻지 못합니다. – cHao

+0

@cHao : 설명해 주셔서 감사합니다. 흥미로운 점은 :-) –

5

x86의 경우 지옥처럼 복잡합니다. 32 비트 프로세서가 도입 된 이후 다소 복잡해졌지만 그래. 아직도 고통.

여러분은 nasm (http://www.nasm.us)을보고 싶을 것입니다. 이것은 오픈 소스 32 비트 어셈블러입니다. 그들이 어떻게하는지보십시오. 또는 대신 사용하십시오. :)

2

단순한 일대일 매핑 일뿐입니다. 인텔 설명서는 모든 지침과 해당 인코딩을 설명합니다. 일치하는 코드 생성을 수행하기 위해 거대한 조회 테이블이나 이와 동등한 기능을 구축해야합니다.

+8

무언가는 당신을 보지 못했다고합니다. x86 인코딩. 단일 니모닉은 여러 opcode에 대응할 수 있으며, 각 opcode는 많은 접두사, 크기 우선 순위를 가질 수 있습니다 ... 그리고 나는 몇 가지 물건을 놓치고 있다고 확신합니다. – Bahbar

+0

매일 x86 어셈블리 코드를 작성합니다. 일대일이어야합니다. 그렇지 않은 경우 작성한 명령어에 대해 어떤 opcode가 생성되는지 어떻게 알 수 있습니까? 접두사, 특수 수정 자, 메모리 액세스 또는 등록 된 버전 등이 있기 때문에 어셈블리 파일에 각 명령어를 작성하면 어떤 기계 명령어가 방출되는지 알 수 있습니다. –

+0

가져 가겠습니다. 뒤로; 여러 개의 니모닉을 사용하여 동일한 기계 명령어를 생성하려는 경우에는 many-to-one이 될 수 있습니다. 어셈블러에 컨텍스트 감도를 구축하지 않는 한 일대 다 일일 수는 없습니다. 첫 번째 사례는 불필요한 작업이며, 두 번째 사례는 일반적으로 좋지 않은 생각 인 것처럼 보입니다. 따라서 답을 알려 드리겠습니다. –

관련 문제