【问题标题】:How to translate this inline assembly code to x64 assembly如何将此内联汇编代码转换为 x64 汇编
【发布时间】:2014-10-20 16:01:31
【问题描述】:

我有以下带有内联汇编的 C++ 函数:

void getMemAddrFromBIOSbySMI(int& bResult, unsigned long& addr,unsigned long& dataLength){
    __asm {              
        mov eax, 0x000000E3               
        mov ebx, 0x00000001               
        mov ecx, 0xFAFAFAFA               
        mov edx, 0x000000B2              
        out dx,al               
        mov bResult, eax              
        mov addr,  ebx            
        mov dataLength, ecx        
    }

    if((bResult & 0x000000FF) == 0){
        bReSult = 1;        
    } 
    else { 
        bResult = 0;       
    }
}

我想让这段代码可以支持x64,但是VC++ x64不支持内联汇编,我不知道如何将这段代码翻译成x64汇编格式...

有人可以帮助我吗?

【问题讨论】:

  • 你首先想做什么?也许存在官方方式......
  • 嗨,Seva:我想在内核空间使用这段代码,但是 vc++ x64 不支持内联汇编,你知道有什么方法或编译器内部函数可以等效吗?
  • 构建仅程序集文件。使用ml进行编译。

标签: c++ assembly


【解决方案1】:

您可以使用编译器内在 __outbyte 写入端口。

【讨论】:

  • 嗨,肖恩:我知道,我也想要内核空间中的这段代码,但我不知道是否有任何方式或等效的 mov eax/ebx/ecx/edx 以及如何读取数据来自 eax/ebx/ecx/edx 通过编译器内在函数。你能给我一些例子或建议吗?非常感谢
【解决方案2】:

您可以使用__asm _emit 对 x64 指令进行编码。此外,由于在 x64 上,参数来自寄存器 RCX 和 RDX 需要在 MOV 之前保存,然后在访问参数时恢复。

【讨论】:

  • Hi Attila: 因为这个函数用于在内核空间发送 BIOS SMI 命令,所以,我必须在运行“out”命令之前将常量值填充到 eax/ebx/ecx/ebx 中,并且运行“命令”后从 eax/ebx/ecx/edx 获取值。如果在运行“out”命令之前无法使用eax/ebx,我该如何翻译这段代码才能在x64系统上正常运行?
猜你喜欢
  • 2013-04-15
  • 2019-11-29
  • 2019-11-30
  • 2021-08-16
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多