GCC에서 x86 어셈블리의 Intel 구문을 사용할 수 있습니까?
저수준의 작은 프로그램을 작성하고 싶습니다. 일부 부분에서는 어셈블리 언어를 사용해야하지만 나머지 코드는 C / C ++로 작성됩니다.
따라서 GCC를 사용하여 C / C ++와 어셈블리 코드를 혼합하려면 AT & T 구문을 사용해야합니까 아니면 인텔 구문을 사용할 수 있습니까? 아니면 C / C ++와 asm (인텔 구문)을 다른 방식으로 어떻게 혼합합니까?
선택의 여지가없고 AT & T 구문을 사용해야한다는 것을 알고 있지만 확실히하고 싶습니다.
선택의 여지가없는 것으로 밝혀지면 AT & T 구문에 대한 전체 / 공식 문서를 어디서 찾을 수 있습니까?
감사!
별도의 어셈블리 파일을 사용하는 경우 gas에는 Intel 구문을 지원하는 지시문이 있습니다.
.intel_syntax noprefix
Intel 구문을 사용하며 레지스터 이름 앞에 % 접두사가 필요하지 않습니다.
인라인 어셈블리를 사용하는 경우 다음과 같이 컴파일 할 수 있습니다. -masm=intel
.intel_syntax noprefix
인라인 asm의 시작 부분에서 사용 하고로 다시 전환 .att_syntax
할 수는 있지만 제약 조건 을 사용 하면 중단 됩니다 m
. 메모리 참조는 여전히 AT & T 구문으로 생성됩니다.
ninjalj가 작성한대로 -masm = intel과 함께 인라인 어셈블리를 사용할 수 있지만 인라인 어셈블리를 사용하여 C / C ++ 헤더를 포함하면 오류가 발생할 수 있습니다. Cygwin에서 오류를 재현하는 코드입니다.
sample.cpp:
#include <cstdint>
#include <iostream>
#include <boost/thread/future.hpp>
int main(int argc, char* argv[]) {
using Value = uint32_t;
Value value = 0;
asm volatile (
"mov %0, 1\n\t" // Intel syntax
// "movl $1, %0\n\t" // AT&T syntax
:"=r"(value)::);
auto expr = [](void) -> Value { return 20; };
boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };
std::cout << (value + func.get());
return 0;
}
이 코드를 작성할 때 아래에 오류 메시지가 표시되었습니다.
g++ -E -std=c++11 -Wall -o sample.s sample.cpp
g++ -std=c++11 -Wall -masm=intel -o sample sample.cpp -lboost_system -lboost_thread
/tmp/ccuw1Qz5.s: Assembler messages:
/tmp/ccuw1Qz5.s:1022: Error: operand size mismatch for `xadd'
/tmp/ccuw1Qz5.s:1049: Error: no such instruction: `incl DWORD PTR [rax]'
/tmp/ccuw1Qz5.s:1075: Error: no such instruction: `movl DWORD PTR [rcx],%eax'
/tmp/ccuw1Qz5.s:1079: Error: no such instruction: `movl %eax,edx'
/tmp/ccuw1Qz5.s:1080: Error: no such instruction: `incl edx'
/tmp/ccuw1Qz5.s:1082: Error: no such instruction: `cmpxchgl edx,DWORD PTR [rcx]'
이러한 오류를 방지하려면 boost :: future 등 (하단)이 필요한 C / C ++ 코드에서 인라인 어셈블리 (코드의 위쪽 절반)를 분리해야합니다. -masm = intel 옵션은 다른 .cpp 파일이 아니라 Intel 구문 인라인 어셈블리가 포함 된 .cpp 파일을 컴파일하는 데 사용됩니다.
sample.hpp:
#include <cstdint>
using Value = uint32_t;
extern Value GetValue(void);
sample1.cpp: compile with -masm=intel
#include <iostream>
#include "sample.hpp"
int main(int argc, char* argv[]) {
Value value = 0;
asm volatile (
"mov %0, 1\n\t" // Intel syntax
:"=r"(value)::);
std::cout << (value + GetValue());
return 0;
}
sample2.cpp: compile without -masm=intel
#include <boost/thread/future.hpp>
#include "sample.hpp"
Value GetValue(void) {
auto expr = [](void) -> Value { return 20; };
boost::unique_future<Value> func { boost::async(boost::launch::async, expr) };
return func.get();
}
참고URL : https://stackoverflow.com/questions/9347909/can-i-use-intel-syntax-of-x86-assembly-with-gcc
'Programing' 카테고리의 다른 글
std :: function을 복사해야합니까? 아니면 항상 참조 할 수 있습니까? (0) | 2020.12.09 |
---|---|
Python3에서 __builtin__ 모듈은 어디에 있습니까? (0) | 2020.12.09 |
Node.js : process.env 변수에 대한 문서가 있습니까? (0) | 2020.12.09 |
Gradle 단일 따옴표와 큰 따옴표 (0) | 2020.12.09 |
PHP에서 HTTP 캐시 헤더를 사용하는 방법 (0) | 2020.12.09 |