그래서 최근에 어셈블리 기술을 향상시키기 위해 C++에서 장난감 언어를위한 매우 간단한 컴파일러를 작성했습니다. 단일 패스를 실행하고 파싱 단계에서 코드의 일부를 나타내는 여러 개의 문자열 스트림 (즉, section .bss
, 다른 하나는 .data
및 .text
)을 직접 코드를 내 보냅니다. 그런 다음,이 문자열 스트림은 파일에 기록되며 NASM과 gcc를 사용하여 어셈블 링하고 링크합니다. 나는이 싱글 패스 접근 방식이 끔찍하게 비효율적이라는 것을 알고 있지만, 이것은 코드 생성 단계를 다른 무엇보다 이해하는 데있어 더 많은 연습이었다. 어쨌든, 원시 코드 대신 LLVM IL을 직접 내보내려면 코드를 수정하고 싶습니다. LLVM IL에 대한 입문 레벨 가이드가 있습니까? 아니면 조립 라인에 해당하는 IL 코드를 결정하는 도구입니까? 나는 보았고, 나는 단지 필요한 것보다 더 많은 정보 인 완전한 스펙을 발견했다.컴파일러를 x86 어셈블리에서 LLVM으로 이식하기
답변
LLVM IR 언어 참조는 available here입니다. 튜토리얼이 아닌 자세한 참조 페이지입니다. LLVM IR은 x86 어셈블리보다 고수준이고 일반이기 때문에 컴파일러가 x86을 방출하여 LLVM IR을 방출하는 것을 너무 어렵지 않아야하지만 x86 어셈블리와 LLVM IR간에 직접적인 1 대 1 대응은 없습니다.
공식 LLVM 설명서는 사용자를위한 최고의 출발점 인 detailed tutorial과 함께 제공됩니다. 간단한 고수준 프로그래밍 언어에서 LLVM IR에 이르는 장난감 컴파일러를 만드는 과정을 안내합니다. 이를 통해 LLVM의 주요 개념을 배우게 될 것이며 위에서 언급 한 언어 참조를 효과적으로 사용할 수있게 될 것입니다.
튜토리얼에 문제가 있으면 LLVM 버그 추적기 또는 메일 링리스트에보고하십시오. 이 자습서는 기능을 수행 할 것으로 예상되며보고 된 문제는 해결됩니다.
LLVM IR을 이해하기위한 또 다른 좋은 시작 리소스는 online demo page입니다. 이 도구를 사용하면 C 코드를 LLVM IR 온라인 (아무 것도 설치하지 않고)으로 컴파일 할 수 있으며 LLVM IR에서 기본 프로그래밍 구문을 표현할 수있는 방법을 이해하는 데 매우 중요합니다.
고마워요! 그 데모 페이지를 본 적이 없었습니다. 그게 바로 제가 찾고 있던 페이지입니다. – chameco
@chameco : 데모 페이지는 정말 유용합니다. 개인적으로 종종 Clang이 어떤 종류의 최적화를 수행 할 수 있는지 확인하기 위해 자주 사용합니다. 실제로 사람들이 조명을보고 코드에서 너무 낮은 레벨이되는 것을 피하는 데 도움이됩니다. –
다른 LLVM 타겟을위한 어셈블리 언어를 살펴 보도록하겠습니다. http://ellcc.org/demo –
- 1. x86 어셈블리에서 피연산자 크기가 충돌합니까?
- 2. TASM x86 어셈블리에서 문자열 읽기
- 3. 피연산자 크기가 x86 어셈블리에서 충돌합니다.
- 4. x86 어셈블리에서 바이트 배열 내보내기
- 5. x86 어셈블리에서 자체 수정 코드를 작성하는 방법
- 6. 각 명령어는 x86 어셈블리에서 얼마나 많이 컴파일됩니까?
- 7. x86 어셈블리에서 COM 개체 vtable 빌드
- 8. Protected Mode 키보드 액세스 (x86 어셈블리에서 사용)
- 9. x86 어셈블리에서 탭 언론을 잡는 방법은 무엇입니까?
- 10. 임베디드 x86 어셈블리에서 어레이를 사용하고 있습니까?
- 11. masm x86 어셈블리에서 DOS 인터럽트가 발생했습니다.
- 12. LLVM으로 컴파일하기위한 질문
- 13. Crenshaw의 "컴파일러를 만들어 봅시다": C 및 x86 어셈블러로의 변환?
- 14. (C++에 포함 된) x86 어셈블리에서 배열의 값을 변경하십시오.
- 15. x86 어셈블리에서 네트워크 카드에 쓰거나 읽는 방법은 무엇입니까?
- 16. x86 어셈블리에서 부동 소수점 숫자를 나누는 방법은 무엇입니까?
- 17. '모든 CPU'.NET 어셈블리에서 x86 CLR 강제 수행
- 18. x86-64 어셈블리에서 부동 소수점 숫자를 사용하는 방법은 무엇입니까?
- 19. GCC IR을 LLVM으로 변환 IR
- 20. 파일에서 어셈블리에서
- 21. x86 프로그램 인수 위치
- 22. Windows에서 Linux로 이식하기
- 23. xbox에서 창으로 이식하기 8
- 24. Windows에서 Windows로 이식하기
- 25. PHP 함수를 Ruby로 이식하기
- 26. DevC++에서 Linux로 이식하기
- 27. Ruby에서 Python으로 이식하기
- 28. SQLite에서 Redis로 이식하기
- 29. 리눅스에서 Windows로 이식하기, tm.sys
- 30. GPUJPEG 프로젝트를 Windows로 이식하기
일대일 매핑이 없습니다. 바로 가기가 없습니다. –
나는 이것을 깨닫는다, 나는 자료, cmp 및 조건부 점프 등을 예약하는 것과 같은 기본적인 것들을 방출하는 방법에 대한 지침을 찾고있다. – chameco
LLVM 워드 프로세서. 장난감 언어 용 컴파일러를 만드는 과정을 안내하는 (적어도 하나 이상의) 자습서가 있습니다. – Mat