将Delphi asm转换为C++Builder asm



我正在尝试将Delphi项目的一部分转换为C++Builder项目。

我将问题简化为以下代码:

procedure Test;
asm
MOV     EAX, OFFSET @test
@test:
db 00H
end;

如果我试图编译这个和几个变体,我会得到一个错误:

[BC32 Fehler]第一单元.cpp(21):E2451 Unfiniertes符号'@test'

有人能帮忙吗?

您的代码有一些问题,比如您不能在C++asm中转发引用标签,只有一个例外(jmp指令)。。。

内置帮助和在线帮助:

  • Embarcadero汇编程序语法

建议标签的语法与Pascal。。。这是真的但是标签的用法非常不同!!!在某种程度上,它们几乎毫无用处我仍然没有让它发挥作用,即使在15多年后,他们也改变了它,因为你只能使用跳跃和呼叫标签,而不能使用其他标签。。。

也许有一些指令或关键字允许使用标签,但还没有找到,因为所有的例子都是pascal语法,在C++环境中不起作用。

另一个问题是使用test标签您忘记了test是汇编指令,所以名称冲突

你仍然可以变通:

  1. 重新排序您的代码,这样您就不需要前向引用

    这是可行的,因为jmp仍在使用标签,但您可以忘记简单的自修改代码。。。

  2. 将本地asm变量转换为C++本地变量

    局部C++变量可以从CCD_ 6直接访问。请注意,函数操作数并非如此,如果需要,请先将它们复制到局部变量中。

  3. 将寻址语法转换为C++

    你知道吗:

    MOV     EAX, OFFSET @test
    

    如果没有在C++中执行您想要的操作,您必须使用LEA指令而不是OFFSET。。。只需创建一个断点,看看OFFSET将返回什么(在我的情况下,它总是0xFFFFFFFF而不是实际地址),而LEA获得正确的地址。

把所有东西放在一起你可以试试这样的东西:

void asmtest()
{
BYTE a=0x00;
asm {
lea eax,a
}
}

如果你有一个非常讨厌的代码,你也可以将代码转换为完全汇编代码(没有C++),并编译为asm代码。。。然后编译/链接的obj文件可以链接到您的C++项目中。BCB5中的IIRC是一个选项,但多年来一直没有使用它,所以这个功能可能会被删除,但你仍然可以使用任何汇编程序(TASM、NASM…)进行编译。borland总是与TASM兼容(因为它是内部使用的),所以我建议使用它来避免其他问题。。。

为什么要将汇编程序转换为汇编程序?您展示的代码是在内存中定义一个字节,然后将其内存地址返回给调用者。这可以而且应该用本机C++编写,而是让编译器为您创建必要的汇编程序,即:

const char* Test() {
static const char ch = 0;
return &ch;
}

最新更新