【问题标题】:Convert inline Intel ASM to AT&T ASM with GCC Extended ASM使用 GCC 扩展 ASM 将内联 Intel ASM 转换为 AT&T ASM
【发布时间】:2013-10-25 00:56:39
【问题描述】:

过去 2 天我一直在研究 AT&T 内联汇编,但我在转换这个时遇到了一些问题:

static char vendername[50] = {0};
_asm {
    mov     eax, 0
    cpuid
    mov     dword ptr [vendername], ebx
    mov     dword ptr [vendername+4], edx
    mov     dword ptr [vendername+8], ecx
}

这是我的尝试:

static char vendername[50] = {0};
__asm__(
    "movl $0,%%eax \n"
    "cpuid \n"
    "movl %%ebx, %[vendername] \n"
    "movl %%edx, %[vendername+$4] \n"
    "movl %%ecx, %[vendername+$8] \n"
    :"=r"(vendername) //user vendername as output
    :[vendername]"m"(vendername) //use vendername as input
    :"eax","ebx","edx","ecx" // clobbers those regs
);

此代码不起作用,gcc 给我以下错误:

error: undefined named operand ‘vendername+4’

error: undefined named operand ‘vendername+8’

如何将代码从 Intel 程序集转换为 AT&T 程序集?

【问题讨论】:

  • 您需要使用__asm__ __volatile__ 来确保优化器不会删除对CPUID 的调用。
  • 你不需要内联汇编。 MSVC 和 GNU 编译器已经有内置/包装器。 Intrinsics for CPUID like informations?

标签: gcc assembly x86 inline-assembly


【解决方案1】:

经验法则是,如果你曾经在内联 asm 中写过 mov,你可能做错了 :) 编译器可以自行为您加载/存储值,即。

int dummy;
union {
    char text[12];
    struct {
        int ebx;
        int edx;
        int ecx;
    };
} vendorname;
__asm__(
    "cpuid \n"
    : "=b" (vendorname.ebx), "=d" (vendorname.edx), "=c" (vendorname.ecx), "=a" (dummy)
    : "a" (0)
);

请注意,由于必须将 3 个双字解释为字符串,因此情况很复杂。

【讨论】:

  • 你确定这是正确的吗:“如果你曾经在 inline asm 中写过 mov,你可能做错了”。如果它的 not Extended ASM,我只能让一些 ASM 代码工作。在没有 Exteded ASM 的情况下,您似乎需要使用 mov
  • 当然,我的意思是扩展 asm,它应该保持很小,并且大部分时间可以使用输入/输出机制来描述,因此编译器在代码生成方面具有灵活性,而不是程序员硬编码mov甚至可能不需要。
  • 啊,谢谢。对其中一些基本问题感到抱歉。我是一名具有编程背景的安全人员,但我在某些领域缺乏专业知识。
【解决方案2】:

你可以这样做:

#include <stdio.h>

int main(int argc, char **argv) {
  static char vendername[50] = {0};

  __asm__ __volatile__ (
    "movl $0, %%eax\n"
    "cpuid\n"
    "movl %%ebx, %0\n"
    "movl %%edx, %0 + 4\n"
    "movl %%ecx, %0 + 8\n"
    :"=m"(vendername)
    :
    :"eax", "ebx", "edx", "ecx"
  );

  printf("%s\n", vendername);

  return 0;
}

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 2012-02-08
    • 2019-01-26
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多