c++ - 将 GCC/ATT 风格的汇编程序转换为 visual studio 汇编程序?

标签 c++ gcc assembly

我正在尝试重写这段代码以在 visual studio 中工作,但我显然不明白如何使用冒号的用途和 __volatile__ 的含义,

你能提供一些帮助吗:)?

__asm__ __volatile__ (
    "mov %0, %%edi\n"
    "xor %%eax, %%eax\n"
    "xor %%ecx, %%ecx\n"
    "dec %%ecx\n"
    "repne scasb\n"
    "sub %%ecx, %%eax\n"
    "dec %%eax\n"
:
: "m" (src)
: "memory", "%ecx", "%edi", "%eax");

谢谢!

最佳答案

这两个内联汇编器是完全不同的。 Visual Studio 内联汇编器更原始但更易于使用。在 VS 中:

  • 内联汇编语言不需要用字符串括起来;
  • 指令操作数按dest,src顺序;
  • C/C++ 变量按原样访问;
  • 等等

您的代码没有任何输出运算符(在第一个冒号之后),所以我看不出它有什么影响。但是假设 eax 寄存器最后要保存在 src 变量中。那么你想要这样的东西:

char* src;
...
__asm {
    mov   edi,src
    xor   eax,eax
    xor   ecx,ecx
    dec   ecx
    repne scasb
    sub   eax,ecx
    dec   eax

    mov   src,eax    // save result
}

顺便说一句,它看起来对我来说不是最佳选择。 eax 的所有业务都可以通过 而不是 ecx 来完成,如果我正确理解代码的话:

__asm {
    mov   edi,src
    xor   al,al
    xor   ecx,ecx
    dec   ecx
    repne scasb
    not   ecx

    mov   src,ecx    // save result
}

关于c++ - 将 GCC/ATT 风格的汇编程序转换为 visual studio 汇编程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27678797/

相关文章:

c++ - std::vector<A> error C2582: 'operator =' 函数在

C++11:传递值参数初始化中转换构造函数和转换函数之间的歧义?

c++ - 在 foreach 样式循环中将 unsigned int 设置为始终为零

c - 互斥锁定和解锁功能如何防止 CPU 重新排序?

assembly - 如何从汇编中的不同内存位置启动数组?

assembly - 有关 VGA 和 putpixel intel x86 asm AT&T 语法的帮助

c++ - 成员构造函数和析构函数调用的顺序

c++ - 如果我使用较新版本的 gcc 编译二进制文件,如何找到需要在客户端 linux 机器上安装哪些库?

c++ - 在 C++11 中将原子与 std::thread 一起使用

c - 我不小心换了一个shell命令。有什么办法可以恢复我的源代码吗?