【问题标题】:How to translate assembly code typed by {} into ()如何将{}输入的汇编代码翻译成()
【发布时间】:2022-12-20 10:40:09
【问题描述】:

首先...我完全是个菜鸟。我几乎什么都不懂。但是您将在下面看到的这段代码在 Visual Studio 中运行良好。我只需要使用简单的 g++ 命令将其编译为 .o 文件。

g++ -o fileName.o filename.cpp

我需要将写在括号{} 内的汇编代码翻译成写在括号() 内的汇编代码。当我试图编译下面的代码时,它崩溃了。编译器建议使用(而不是{

unsigned char decode5a[0x0dac];
unsigned char* srcbuf = new unsigned char[4000];
m_image = new unsigned char[4000];
unsigned char* dstbuf = m_image;

__asm
{
     lea eax, decode5a
     push srcbuf
     push dstbuf
     call eax
     add esp, 8
}

我试过类似的东西,但它也崩溃了。我想我传递的变量不正确。

__asm__(
     "lea eax, decode5a \n
     push srcbuf \n
     push dstbuf \n
     call eax \n
     add esp, 8 \n
");

【问题讨论】:

  • C 还是 C++? C++ 具有标准化的内联汇编。 C 没有。
  • 我更喜欢C++
  • 试试((void (*)(char *, char *))decode5a)(srcbuf, dstbuf)。这里不需要使用内联汇编。
  • @fuz 你能确切地告诉我应该如何将它附加到我的代码中吗?我不知道这段代码的作用:/
  • “你能确切地告诉我应该如何将它附加到我的代码中吗?”你应该用它来完全替换内联组件.它执行您显然打算让程序集执行的操作,但在 C++ 中。

标签: c++ c assembly inline-assembly


【解决方案1】:

下面是如何在 gcc 扩展内联汇编中编写它,但这仍然可能不起作用,具体取决于函数的作用。 特别是,函数修改的任何寄存器都必须在 clobbers 中列出。

__asm__(
     "push %1
"
     "push %2
"
     "call *%0
"
     "add $8, esp 
"
     : : "r"(decode5a), "r"(srcbuf), "r"(dstbuf)
     : "eax", "memory");

【讨论】:

  • 不正确:您调用的函数可能会破坏这没有考虑到的寄存器。
  • “内存”破坏是矫枉过正的,但是如何正确执行它的解释会更长,并且在 * 的某个地方已经有了答案。
  • 这不是矫枉过正。该函数可以访问任意内存。另请注意,内存破坏不考虑破坏的寄存器。
  • @fuz,是的,我打算写一些关于函数的假设/约束。
  • 它不工作。我收到此错误:too many memory references for add。我正在尝试使用以下命令编译我的文件:gcc -o TestApp.o TestApp.cpp。处理器是ryzen,64位。
最近更新 更多