如何将AT& T样式汇编代码移到Visual Studio和Intel样式语法?

时间:2012-10-22 17:45:01

标签: assembly x86-64 intel att

我有一个非常专业的文件,用x86-64汇编为Linux编写,在GCC下编译。我需要将该代码移动到Visual Studio项目,并且mll64.exe希望程序集文件采用Intel格式。

我试图构建一个跨平台的DLL,但它不起作用:

  

15:47:19 cpudiag2> gcc -shared -o my.dll my.o

     

/ usr / bin / ld:my.o:针对“本地符号”重新定位R_X86_64_32S   制作共享对象时不能使用;用-fPIC重新编译   my.o:无法读取符号:错误值collect2:ld返回1退出   状态

     

15:47:19 cpudiag2> gcc -fPIC my.S

     

/usr/lib/gcc/x86_64-redhat-linux/4.1.2 /../../../../ lib64 / crt1.o:In   function`_start':(。text + 0x20):对'main'的未定义引用   collect2:ld返回1退出状态

然后我尝试让GCC从目标文件反编译成Intel语法,但这也不起作用。以下两个命令都导致AT& T语法中的反编译汇编代码。为什么呢?

  

objdump -d -M = intel my.o

     

gcc -S -masm = intel my.o

1 个答案:

答案 0 :(得分:3)

那里有各种混淆。

  1. 命名文件my.dll不会更改其格式
  2. 由于linux和windows上的库格式不同,你无法创建跨平台的dll
  3. -fPIC不会神奇地制作手写的asm PIC,它只适用于编译器生成的代码
  4. 要获取目标文件,您应该将-c切换到gcc(但在这种情况下这不会帮助您)
  5. gcc -S不会反汇编目标文件,而是用于从C代码生成程序集
  6. objdump -d -M=intel my.o应该可以工作,但它产生的东西不适合组装(尤其不适用于Windows,因为它使用不同的调用约定)
  7. 您最好的选择可能是将所述代码汇编到Windows对象文件(使用针对Windows的gcc / gas)并将其作为项目中的二进制文件(仅用于链接),并使用小胶水如果需要,调用约定转换的层。但是,不允许您编辑汇编源。