2013-06-02 3 views
1

그래서, 방황하는 것을 계속하고 꽤 오픈 소스 어셈블러 명령 lexem analyzer (일부 TinyPG 구현, 어쩌면)가 필요하다는 것을 확신합니다.어셈블리 언어 파서 구현

내가 알고 싶은 것은, 내 애플 리케이션을 이해시킬 수있는 방법, 주어진 텍스트가 어셈블러 코드일지도 모른다는 것이다. 예를

mov ah, 37 

에 대한 는

bad my 42 

있는 동안은 안 수락해야합니다.

자기 구현에 대한 조언도 환영합니다. 왜냐하면 나는 "하드 코어"구현을 이해할 수 있을지 확신 할 수 없기 때문입니다.

+0

어셈블리 언어는 아키텍처에 따라 크게 다릅니다. 또한 동일한 아키텍처 내에서 다른 어셈블러는 실제 지침 이외의 다른 지시어를 사용할 수 있습니다. 귀하의 예제는 x86이므로 x86 만 탐지 할 수 있습니까? –

+0

전체 x86 패밀리가 아닙니다 (많은 차이가있을 것입니다). i8086 명령 분석기에 대한 계획 – user2380317

+0

최신 기계 아키텍처는 매우 복잡하며 다양한 지침을 제공합니다. 전통적으로 어셈블러에는 수작업 코드 파서가 있지만 시간이 지남에 따라 더 어려워집니다. 실제 파서 생성기를 사용하여 어셈블러 스타일에 대한 내 SO 응답을 참조하십시오. http://stackoverflow.com/a/1317779/120163 –

답변

1

정확하게 정확하게 식별하려면 행이 정규식과 일치하는지 확인하는 것이 좋습니다. 이것은 실제로 파일의 내용을 읽고 토큰을 식별하는 컴파일러의 첫 단계 인 스캐닝 단계와 매우 비슷합니다. 다음 단계 - 실제 구문 분석은 더 복잡합니다 (어셈블러에서는 그리 복잡하지 않지만).

정규식의 예는이 같은 것 두 가지 매개 변수

^[ \t]*((mov|xor|add|mul)[ \t]*([abcde][xhl]|[cd]s)[ \t]*,)|jmp[ \t]*([abcde][xhl]|[cd]s|[0-9A-F]*)[ \t]*$ 

최초로 확인 유효한 명령어 파라미터의 그 존재하고 상기 단일 PARAM 지침과의 대체 하였다 다른 매개 변수의 존재 - 두 번째 매개 변수로 유효한 숫자 상수를 포함합니다.

+0

첫 번째 열이 항상 비어있는 어셈블리 코드는 많이 상상할 수 없습니다. 라벨은 유용합니다! –

+0

당신은 맞습니다. 정규 표현식이 레이블을 처리하지 않는다는 것이 맞습니다. 그것은 시작을 의미하는 것입니다. 실제는 더 복잡합니다. –

3

일부 텍스트가 일부 언어 일 수 있는지 확인하는 가장 좋은 방법은 해당 텍스트를 구문 분석하고 응용 프로그램에 어셈블러를 포함시키고 호출하는 것입니다. 나는 접근법을 강력하게 추천한다 - 심지어 어셈블리 코드에 대해서도 입력은 당신이 생각하지 못했던 특별한 구문이나 구조를 포함 할 수 있으며, 결국 잘못된 음성을 내 보낸다.

이것은 특히 어셈블리 코드에서 그렇습니다. 렉싱 및 구문 분석은 다른 언어와 비교할 때 매우 저렴하며 두 번 수행하는 데별로 위험하지 않습니다.

멋진 정규식 패턴을 직접 만들려면 어쨌든 어셈블러의 첫 번째 단계를 복제해야합니다. 직접 디버깅해야합니다. 완벽하고 검증 된 솔루션을 사용하는 것이 좋습니다. .