assembly 移植旧程序集(_asm),使其在x64下编译

sshcrbum  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(182)

我正在移植一段包含程序集的旧代码。它无法在维斯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
 }

非常感谢你的帮助!

zujrkrfu

zujrkrfu1#

汇编程序助记符cpuid使用cpuid指令提取处理器信息。请看this MSVC page-它有一个C++示例。

UPDATE我用一些简单的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;
}

程序输出:

mjqavswn

mjqavswn2#

当您使用MSVC时,如果您希望使用一个直接替代的asm-block,请尝试:

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

您还需要:

#include <intrin.h>
im9ewurl

im9ewurl3#

__asm {}代码也可以用asmjit库来替换。这可以作为一个jit编译器来使用,并且允许使用x64代码。

相关问题