Satır içi derlemeyi -masm = intel ile ninjalj yazdığından kullanabilirsiniz, ancak satır içi derlemeyi kullanarak C/C++ üstbilgileri eklediğinizde hatalara neden olabilir. Bu, Cygwin'deki hataları yeniden üretmenin kodu.
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;
}
Bu kodu oluşturduğumda aşağıdaki hata iletilerini aldım.
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]'
o boost :: gelecekteki ve (alt yarısı) gibi gerektirir C/C++ kod satır içi montaj (kod üst yarısı) ayırmak gerekiyor Bu hataları önlemek için. -masm = intel seçeneği, diğer .cpp dosyalarına değil, Intel sözdizimi satır içi derlemesini içeren .cpp dosyalarını derlemek için kullanılır.
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();
}
Bazı işlevleri asm olarak yazarsanız, bunlar ayrı olarak derlenmiş bir dosyada olabilirler. YASM veya NASM'ye dayanak bağımlılıktan sakınmazsanız, istediğiniz sözdizimini kullanmak daha kolaydır. (Ama sonra senin asm, Windows ve Linux için farklı ABI'lerle, belki de assembler makroları ile uğraşmak zorunda.) [GNU assembler kılavuzu çevrimiçi] (https://sourceware.org/binutils/docs/as/) ve ayrıca Genellikle gcc/binutils ile yüklenir. ('olarak bilgi). –
Intel sözdizimi konusunda dikkatli olun, çünkü Clang'ın tümleşik derleyicisi bunun üzerine basar. Ayrıca bkz. [LLVM Issue 24232: Satır içi derleme işlenenler .intel_syntax ile çalışmaz] (http://llvm.org/bugs/show_bug.cgi?id=24232). Hata raporu, Clang'ın basit bir olumsuzlukla ilgili sorun olduğunu gösteriyor. – jww