2012-02-19 11 views
48

Küçük, düşük seviyeli bir program yazmak istiyorum. Bunun bazı bölümlerinde montaj dilini kullanmam gerekecek, ancak kodun geri kalanı C/C++ üzerine yazılacak. Ben, montaj koduyla C/C++ karıştırmak için GCC kullanacaksanızGCC ile x86 montajının Intel sözdizimini kullanabilir miyim?

Yani, & T sözdizimi AT kullanmak gerekir yoksa Intel sözdizimini kullanın olabilir mi? Ya da C/C++ ve asm (intel sözdizimi) başka bir şekilde nasıl karıştırırsınız?

Belki şansım da yok ve & T sözdizimi AT kullanması gerektiğini fark, ama emin olmak istiyorum ..

Ve tam bulabilirsiniz hiçbir seçim, orada ortaya çıkarsa/AT & T sözdizimi ile ilgili resmi belgeler?

Teşekkürler! Intel sözdizimi kullanır ve kayıt adlarıyla önce% öneki gerekmez

.intel_syntax noprefix 

:

+0

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). –

+0

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

cevap

61

ayrı montaj dosyalarını kullanıyorsanız, gaz Intel sözdizimi destekleyecek bir yönetmeliğe sahiptir.


satır içi montaj kullanıyorsanız, sen -masm=intel

çalışabilir .att_syntax ile satır içi asm başında .intel_syntax noprefix kullanma ve geri geçiş ile derlemek, ancak herhangi m kullanırsanız kıracak kısıtlamaları. Bellek referansı hala AT & T sözdiziminde üretilecektir.

+1

Teşekkür ederim, ninjalj !!!!!! – Hlib

+12

Montaj bölümünüzün sonunda AT & T standardını iade etmeyi unutmayın. .att_syntax noprefix' bunu yapar. Aksi halde, derleyici AT & T formatında derleyici tarafından oluşturulan derleme kodunu Intel formatı olarak yorumlamaya çalışacaktır. – ugoren

+7

@ugoren: '-masm = intel' derleyicinin Intel sözdizimi üretmesini sağlıyor.Satır içi montaj için gerçekten ihtiyacınız var, aksi takdirde "m" bellek kısıtlamaları çalışmayacak. .intel_syntax noprefix'ı geri almak için – ninjalj

4

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(); 
} 
İlgili konular