इंटेल सिंटैक्स में असेंबली कोड उत्पन्न करने के लिए आप gcc का उपयोग कैसे करते हैं?


151

gcc -Sविकल्प एटी एंड टी वाक्य रचना में विधानसभा कोड उत्पन्न होगा, वहाँ एक रास्ता इंटेल वाक्य रचना में फ़ाइलों को उत्पन्न करने के लिए है? या फिर दोनों के बीच धर्मांतरण का कोई तरीका है?


5
आप आसानी से LLVM-एम सी के साथ खोल में एक निर्देश में बदल सकते हैं: echo "packsswb mm0,[bp+si-0x54]" | llvm-mc-3.2 -x86-asm-syntax=intelदेता हैpacksswb -84(%bp,%si), %mm0
जानूस Troelsen

जवाबों:


198

क्या आपने यह कोशिश की है?

gcc -S -masm=intel test.c

अनटाइटेड, लेकिन मैंने इसे इस फोरम में पाया, जहां किसी ने दावा किया कि यह उनके लिए काम करता है।

मैंने बस इस पर कोशिश की MAC और यह विफल रहा, तो मैं अपने आदमी पृष्ठ में देखा:

   -masm=dialect
       Output asm instructions using selected dialect.  Supported choices
       are intel or att (the default one).  Darwin does not support intel.

यह आपके प्लेटफॉर्म पर काम कर सकता है।

मैक OSX के लिए:

clang++ -S -mllvm --x86-asm-syntax=intel test.cpp

स्रोत: https://stackoverflow.com/a/11957826/950427


इसके गलत फ़ाइल नाम att2intel.rew के बावजूद, वह सेड स्क्रिप्ट, इंटेल से एटीटी तक दूसरे रास्ते में परिवर्तित हो जाती है।
जोनाथन रेइनहर्ट

किसी को भी मैक के लिए एक समाधान है?
जोशुआ गाल

Clang वर्तमान में Intel सिंटैक्स का उपभोग नहीं कर सकता है। एलएलवीएम बग 24232 देखें : [X86] इनलाइन असेंबली ऑपरेंड्स .intel_syntax के साथ काम नहीं करते हैं । इसके अलावा, क्लैंग उपेक्षा करता है prefix/ noprefix(निश्चित नहीं है कि यह मायने रखता है कि क्या क्लैंग विधानसभा का उपभोग करता है)।
jww

17

The

gcc -S -masm=intel test.c

मेरे साथ काम करता है लेकिन मैं एक और तरीका बता सकता हूं, हालांकि इसका रनिंग जीसीसी से कोई लेना-देना नहीं है। निष्पादन योग्य या ऑब्जेक्ट कोड फ़ाइल को संकलित करें और फिर नीचे दिए गए अनुसार objdump के साथ Intel asm सिंटैक्स में ऑब्जेक्ट कोड को अलग करें:

 objdump -d --disassembler-options=intel a.out

यह मदद कर सकता है।


3
objdump -d -M Intel के समान
डेविड ong वोंग

5

मेरे पास CPP फ़ाइल में यह कोड है:

#include <conio.h>
#include <stdio.h>
#include <windows.h>

int a = 0;
int main(int argc, char *argv[]) {
    asm("mov eax, 0xFF");
    asm("mov _a, eax");
    printf("Result of a = %d\n", a);
    getch();
    return 0;
 };

यह कोड इस GCC कमांड लाइन के साथ काम करता है:

gcc.exe File.cpp -masm=intel -mconsole -o File.exe

यह * .exe फ़ाइल का परिणाम देगा, और इसने मेरे अनुभव में काम किया।

Notes:
immediate operand must be use _variable in global variabel, not local variable.
example: mov _nLength, eax NOT mov $nLength, eax or mov nLength, eax

A number in hexadecimal format must use at&t syntax, cannot use intel syntax.
example: mov eax, 0xFF -> TRUE, mov eax, 0FFh -> FALSE.

बस इतना ही।


मेरे फेडोरा पर काम नहीं करता है:$ gcc -S -masm=intel -mconsole a.c -o a.out gcc: error: unrecognized command line option ‘-mconsole’
d33tah

साइबरविन में काम करता है। असेंबली इंटेल के रूप में जाती है, .s फ़ाइल में इंटेल के रूप में बाहर आती है। यदि आप उपयोग करते हैं -o a.outतो आपको एक .s फ़ाइल नहीं मिलेगी।
ऑरवेलोफाइल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.