2013-07-25 1 views
0

우리가이불가능한 어셈블리 코드를 작성할 수 있습니까? 내 말 것을 말하여

xx xx xx xx xx xx xx xx xx xx xx ... 

바이트 스트림을 가지고 있다고 할 수 있습니다.

이제 디스어셈블러가 모든 스트림의 가능한 조합을 통과한다면 명령이 불가능하다는 어떤 시점에서도 불만을 제기합니까? 디스어셈블러가 가능한 모든 조합에 대해 LEGIT 출력을 제공하고, 그것이 무엇이든지 상관 없지만, 무엇이든지 상관없이 명령을 내뱉기를 원합니다.

이것이 가능합니까?

답변

8

물론 이것은 아주 자주 발생합니다. 코드에는 종종 데이터도 포함됩니다. switch 문에 대해 생성 된 종류와 같은 인라인 문자열 또는 테이블과 같습니다. 코드 대신 주소가 포함 된 점프 테이블. 디스어셈블러는 그러한 코드에서 심하게 넘어지는 경향이 있습니다. 그들은 보통 첫 번째 테이블 엔트리가 주소이지만 테이블이 얼마나 오래 있는지 알지 못합니다.

그러나 일반적으로이 코드는 맹 글링 된 어셈블리 코드를 생성하기 때문에 일반적인 프로세서에는 그렇게 많은 명령어가 없습니다. 이들은 거의 모든 바이트 값을 명령어에 매핑하는 경향이 있습니다. YMMV.

+0

+1 이것은 아마도 OP가 요구하는 것입니다. – m0skit0

3

이상한 질문, 확실하지 내가

아니, 수 ... 제대로 이해 만하고 있습니다. 모든 비트 조합이 유효한 명령어와 일치하는 것은 아닙니다. 지침에는 미리 정의 된 형식이 있습니다. 이 형식을 따르지 않으면 "잘못된 명령어"하드웨어 예외/트랩/인터럽트가 발생합니다.

또한 바이트 스트림이 너무 길면 모든 가능한 조합이 시간이 걸릴 수 있습니다.

3

일부 프로세서는 고정 길이 명령어를 사용하며 명령어에 나타날 수있는 모든 비트 조합은 잘 정의 된 의미를 갖습니다. 일부는 고정 길이 명령을 사용하지만 일부 비트 조합에는 정의 된 의미가 없습니다 (제조업체는 이러한 조합을 실행하려고 시도 할 경우 어떤 일이 발생할지 지정하지 않습니다). 두 경우 모두 어떤 코드가 실행될지를 결정하는 것은 상당히 쉽습니다.

다른 많은 프로세서에서 코드 바이트 시퀀스의 의미는 구문 분석을 시작하는 위치에 따라 다릅니다. 6502 프로세서 바이트 시퀀스 (어드레스 0xFFC0 시작) 실행 어드레스 0xFFC3 시작된 경우

A9 00 2C A9 01 85 73 ... 

FFC0: A9 00 -- LDA #$00 
FFC2: 2C A9 01 -- BIT $01A9 
FFC5: 85 73 -- STA $73 
FFC6: ... 

로 처리 될 수 있지만, 시퀀스

로 처리 될
FFC3: A9 01 -- LDA #$01 
FFC5: 85 73 -- STA $73 
FFC6: ... 

주소 0xFFC3에있는 A9 01이 "LDA # $ 01"명령인지 "BIT"명령에 대한 피연산자인지 확실하게 말할 수 없습니다. 실제로, 일부 실제 6502 코드에서 동일한 바이트가 두 가지 용도로 사용될 수 있습니다. BIT $ 01A9 명령어의 유일한 효과는 일반적으로 일부 플래그를 설정하는 것이므로 $ 2C 연산 코드는 다음 2 바이트를 건너 뜁니다. .

많은 프로세서에서 모든 가능한 바이트 코드에 대해 고유하게 정의 된 니모닉이 없습니다. 따라서 어셈블리 언어로 생성하는 유일한 방법은 명시 적으로 바이트 정의 지시문을 사용하는 것일 수 있습니다.예를 들어 6502에서 0x02, 0x12 및 0x22를 포함하여 특정 바이트 값을 실행하려고하면 다음 재설정 때까지 프로세서가 정지합니다. 이러한 동작은 유용하지 않으므로 정의 된 opcode가 할당되지 않습니다. 6502의 일부 파생물은 이러한 opcode를 실행할 때보다 유용한 연산을 수행하며, 특정 파생물을 대상으로하는 어셈블러는이를 생성 할 수있는 니모닉을가집니다. 그렇지 않으면 디스어셈블러의 공통적 인 동작은 0x02를 "??? (예 : "KIL")과 관련된 일반적인 의사 연산 코드를 가정합니다.

+0

+1 구문 분석을 시작할 위치에 대한 좋은 지적. – m0skit0

+0

BTW에는 0xA7과 같은 일부 opcode가 있습니다.이 opcode는 당일 6502 명의 어셈블러가 생성하지 않았지만 그럼에도 불구하고 유용 할 수 있습니다. 프로세서는 '101001xx' 형식의 모든 opcode를 0 페이지에서 무언가를로드하라는 요청으로 간주합니다. 어느 것도 'x'가 설정되지 않으면, 읽기 값은 Y 레지스터에 래치됩니다. 첫번째'x'가 설정되면, X 레지스터. 두 번째 경우 누산기. 결과적으로 두 x가 모두 설정되면 (opcode 10100111) 누적 기와 X 레지스터 모두에서 값이 래치됩니다. – supercat

관련 문제