Delphi asm到C++ Builder asm的转换

lvjbypge  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(175)

我正在尝试将 Delphi 项目的一部分转换为C++Builder项目。
我将问题简化为以下代码:

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

如果我试图编译这个代码以及几个变体,我会得到一个错误:
[BCC 32费勒]单位1. cpp(21):E2451未定义符号'@test'
有人能帮忙吗?

tuwxkamq

tuwxkamq1#

您的代码存在一些问题,如您无法在C++ asm中转发引用标签,但有一个例外(jmp指令)...
内置帮助和在线帮助:

建议标签的语法与Pascal中的语法相同...这是真的但是标签的用法非常不同!!!在某种程度上,它们几乎是无用的我仍然没有让它工作,即使经过15年以上,他们改变了它,因为您可以使用标签只用于跳转,也许调用,但没有其他...
也许有一些指令或关键字允许使用标签,但还没有发现任何,因为所有的例子都是在Pascal语法,这在C环境中不工作。
另一个问题是您使用test标签...您忘记了test是汇编指令,因此名称冲突!!!
您仍然可以解决以下问题:
1.重新排序代码,以便不需要前向引用
这是可行的,因为jmp仍然工作,因为应该与标签,但你可以忘记简单的自我修改代码...
1.**将局部asm变量转换为C
局部变量**
局部C变量可以直接从asm访问请注意,函数操作数不是这样,如果您需要它们,请先将它们复制到局部变量中
1.**将寻址语法转换为C
**
你知道的

MOV     EAX, OFFSET @test

在C++中,您必须使用LEA指令而不是OFFSET...只需创建一个断点,并查看OFFSET将返回什么(在我的情况下,总是0xFFFFFFFF而不是真实的地址),同时LEA获得正确的地址。

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

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

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

l7wslrjt

l7wslrjt2#

你为什么要把汇编程序翻译成汇编程序呢?你展示的代码是在内存中定义一个字节,然后把它的内存地址返回给调用者。这可以也应该用原生C++编写,让编译器为你创建必要的汇编程序,即:

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

相关问题