首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GCC扩展ASM将Intel ASM转换为AT&T ASM

用GCC扩展ASM将Intel ASM转换为AT&T ASM
EN

Stack Overflow用户
提问于 2013-10-16 18:50:39
回答 2查看 1.9K关注 0票数 1

在过去的两天里,我一直在学习AT&T内联装配,但是我在转换这个组件时遇到了一些问题:

代码语言:javascript
复制
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
}

以下是我的尝试:

代码语言:javascript
复制
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程序集?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-16 20:14:27

你可以这样做:

代码语言:javascript
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2013-10-16 19:44:38

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

代码语言:javascript
复制
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个dword解释为一个字符串,情况变得复杂了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19411410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档