【问题标题】:How to use intrinsics for inline assemby in C++?如何在 C++ 中使用内部函数进行内联汇编?
【发布时间】:2012-11-17 08:49:01
【问题描述】:

我尝试在 VS2005 中将 C++ 工具移植到 x64。问题是,代码包含内联汇编,64 位编译器不支持。我的问题是,如果有更多的努力来用清晰的 c++ 编码或使用内在函数。但在这种情况下,并非所有汇编函数都可用于 x64,对吗?比方说,我有一个简单的程序

#include <stdio.h>

void main()
{
   int a = 5;
   int b = 3;
   int res = 0;

    _asm
    {
       mov eax,a
       add eax,b
       mov res,eax
    }

    printf("%d + %d = %d\n", a, b, res);
}

我必须如何使用内在函数更改此代码才能运行它?我是汇编程序新手,不了解它的大部分功能。

更新:

我按照 Hans 的建议进行了更改以使用 ml64.exe 编译程序集。

; add.asm

; ASM function called from C++

.code
;---------------------------------------------
AddInt PROC,
    a:DWORD,    ; receives an integer
    b:DWORD     ; receives an integer
; Returns: sum of a and b, in EAX.  
;----------------------------------------------
    mov  eax,a
    add  eax,b
    ret
AddInt ENDP
END 

ma​​in.cpp

#include <stdio.h>

extern "C" int AddInt(int a, int b);

void main()
{
    int a = 5;
    int b = 3;
    int res = AddInt(a,b);

    printf("%d + %d = %d\n", a, b, res);
}

但结果不正确5 + 3 = -1717986920。我想,指针出了点问题。我哪里做错了?

【问题讨论】:

  • 这个例子是典型的你的问题还是只是你问题的一个非常简单的例子?我会尽力删除汇编程序并用 C/C++ 替换它。对于几乎所有示例,性能都相当(可能更好,因为现代 C 编译器比人类聪明得多)
  • 在我的项目中有很多组装零件,所以这是一个普遍的问题
  • 内在函数不包含任何 C 编译器都可以生成的普通指令。只有 SSEx 集中的特殊说明。您需要一个用于此代码的汇编程序 ml64.exe
  • 您链接汇编器生成的 .obj 文件。不,它不再是内联的。
  • @HansPassant 让您的评论成为答案。我认为没有更好的选择。

标签: c++ visual-c++ 64-bit inline-assembly intrinsics


【解决方案1】:

VC 中的 64 位目标不支持内联汇编。

关于非内联代码中的错误,乍一看,代码看起来不错。我会查看从 C++ 生成的汇编代码 - 看看它是否与 addInt 过程匹配。

编辑:需要注意的两件事:

  1. extern addInt :proc 添加到您的asm 代码中。
  2. 我不知道过程接受参数的汇编语法。参数通常根据您的调用约定通过堆栈指针(sp 寄存器)提取,在此处查看更多信息:http://courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html

【讨论】:

  • 在调试时我发现两个变量的值相同,在设置注册之前
  • 嗯,我的汇编函数的两个参数可以通过关键字ecx和edx调用。一切都很好。有关详细信息,请参阅link。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 2019-03-14
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
相关资源
最近更新 更多