移植旧程序集(_asm),以便在 x64 下编译

问题描述 投票:0回答:3

我正在移植一段包含汇编的旧代码。它无法在 Vis Studio 2010 下的 x64 上编译,并出现以下错误: 非标准扩展使用了“__asm”关键字,此架构 x64 不支持

在阅读了其他一些条目后,我现在很清楚我必须重写该代码才能使其可移植。我在移植一段代码时遇到了困难。我需要一些帮助。我如何重写这个块以使其在 x86 和 x64 下编译?

unsigned        tval= 0;
unsigned        AXr, BXr, CXr, DXr;
_asm{
    push eax
    push ebx
    push ecx
    push edx

    mov eax, tval
    mov ebx, 0
    mov ecx, 0
    mov edx, 0
    cpuid
    mov AXr, eax
    mov BXr, ebx
    mov CXr, ecx
    mov DXr, edx

    pop edx
    pop ecx
    pop ebx
    pop eax
 }

非常感谢您的帮助!

c++ assembly compilation 64-bit porting
3个回答
1
投票

汇编助记符

cpuid
使用
cpuid
指令提取处理器信息。看一下 这个 MSVC 页面 - 其中有一个 C++ 示例。

更新我用一些简单的C代码尝试了该功能 -

#include <stdio.h>
#include <intrin.h>

int main(void)
{
    int info[4] = {0};
    __cpuid(info, 0);
    printf("%X %X %X %X\n", info[0], info[1], info[2], info[3]);
    return 0;
}

程序输出:

1 68747541 444D4163 69746E65

0
投票

当您使用 MSVC 时,如果您想要直接替代 asm-block,请尝试:

int regs[4];
__cpuid( regs, tval );
AXr = regs[0];
BXr = regs[1];
CXr = regs[2];
DXr = regs[3];

您还需要:

#include <intrin.h>

0
投票

__asm {}代码也可以使用asmjit库替换。这可以用作 jit 编译器,也允许使用 x64 代码。 开源,请参见这里:https://asmjit.com/

© www.soinside.com 2019 - 2024. All rights reserved.