컴파일러가하는 일에 약간 퍼지 듯합니다. 가장 간단한 방법으로 c 컴파일러는 c 명령어로 파일을 가져 와서 특정 프로세서에서 실행하기에 적합한 어셈블리 언어 명령어로 변환합니다.
그러나 거기에는 많은 프로세서가 있으며 모든 프로세서 제품군에는 다른 어셈블리 명령어가 사용됩니다. C 컴파일러는 어떻게 대응할 수 있습니까? 대답은 주어진 컴파일러 (일반적으로)는 단일 출력 형식 만 지원한다는 것입니다. 따라서 x86 용 코드를 출력하는 컴파일러와 x64 용 코드를 출력하는 컴파일러, ARM, MIPS 용 코드를 출력하는 컴파일러 등을 가질 수 있습니다. 모두 C 언어 입력 파일을 가져 오는 동안 각각 대상에 맞는 적절한 어셈블러 명령어를 출력합니다.
이것은 컴파일러가 적절한 어셈블러로 변환 할 수있는 일반적인 c 명령어 (case, break, printf, scanf 등)를 의미합니다. 그러나 asm
명령어를 사용하면 컴파일러가 c-> 어셈블러 변환을 수행하지 말아야합니다. 사용자가 제공하는 특정 어셈블러 명령어를 정확하게 출력해야합니다.
이 모든 것이 귀하의 질문과 관련이 있습니까?
하나의 플랫폼 (예 : x86)에서 어셈블러 지침을 가져 와서 다른 플랫폼 (예 : ARM)에서 사용하려고하면 어떻게됩니까? 글쎄, 대부분 일은 그것이 작동하지 않는다는 것입니다. (가상의 예로서) add x, y
을 사용하려하고 프로세서가 u32.xadd x, x, y
을 예상하면, 실제로 혼란스러워지며, 당신의 어셈블러를 말도 안되는 것으로 취급 할 것입니다.
그럼 어떻게 수정합니까? 글쎄, 가장 현명한 계획은 C 코드에서 어셈블리 언어 사용을 중단하는 것입니다. 2 개의 숫자를 추가하려고하는 것 같습니다. c는 이미 그렇게 할 수있는 지침을 가지고 있습니다.
강조 : c 코드를 작성하고 컴파일러 출력 코드를 보내는 것이 거의 항상 더 나은 방법입니다. 인라인 어셈블리를 사용하려면 C 언어, 대상 프로세서의 어셈블리 언어 및 특정 컴파일러에서 사용하기로 선택한 두 인터페이스 사이의 인터페이스 규칙을 알고 있어야합니다. 각 컴파일러는 약간 다르게 처리합니다. 그 사실을 알고 올바른 시도가 필요합니다. 그리고 (당신이 발견 한 것처럼) 그것은 하나의 컴파일러/프로세서에서 또 다른 고통스럽게 움직이게 만듭니다.
그러나 을 사용해야하는 경우 먼저 해당 프로세서에 대한 어셈블러 지침을 알아야합니다. Google 검색은 이러한 지침에 대한 다양한 리소스를 제공해야합니다. 일단 배웠 으면 asm
명령을 업데이트하여 정확한 지침을 포함 할 수 있습니다.
ARM 칩에서 작업하고 있습니까? 유효한 레지스터 이름을 제공 할 칩 아키텍처 문서를 원할 것입니다. AX는 주어진 타겟 아키텍처에 맞지 않을 수 있습니다. 여기에서 시작할 수 있습니다. http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001m/QRC0001_UAL.pdf –
ARM 프로세서에는 x86 어셈블리 코드가 아니라 ARM 어셈블리 코드가 필요합니다. –
예. 나는 라즈베리 파이와 함께 일하고 있습니다. 형식이 잘못 되었습니까? 레지스터처럼? – Brian