我正在尝试将 Delphi 项目的一部分转换为C++Builder项目。我将问题简化为以下代码:
procedure Test; asm MOV EAX, OFFSET @test @test: db 00H end;
如果我试图编译这个代码以及几个变体,我会得到一个错误:[BCC 32费勒]单位1. cpp(21):E2451未定义符号'@test'有人能帮忙吗?
tuwxkamq1#
您的代码存在一些问题,如您无法在C++ asm中转发引用标签,但有一个例外(jmp指令)...内置帮助和在线帮助:
asm
jmp
建议标签的语法与Pascal中的语法相同...这是真的但是标签的用法非常不同!!!在某种程度上,它们几乎是无用的我仍然没有让它工作,即使经过15年以上,他们改变了它,因为您可以使用标签只用于跳转,也许调用,但没有其他...也许有一些指令或关键字允许使用标签,但还没有发现任何,因为所有的例子都是在Pascal语法,这在C环境中不工作。另一个问题是您使用test标签...您忘记了test是汇编指令,因此名称冲突!!!您仍然可以解决以下问题:1.重新排序代码,以便不需要前向引用这是可行的,因为jmp仍然工作,因为应该与标签,但你可以忘记简单的自我修改代码...1.**将局部asm变量转换为C局部变量**局部C变量可以直接从asm访问请注意,函数操作数不是这样,如果您需要它们,请先将它们复制到局部变量中1.**将寻址语法转换为C**你知道的
test
MOV EAX, OFFSET @test
在C++中,您必须使用LEA指令而不是OFFSET...只需创建一个断点,并查看OFFSET将返回什么(在我的情况下,总是0xFFFFFFFF而不是真实的地址),同时LEA获得正确的地址。
LEA
OFFSET
0xFFFFFFFF
把所有的放在一起你可以尝试这样的东西代替:
void asmtest() { BYTE a=0x00; asm { lea eax,a } }
如果你有一个非常讨厌的代码,你也可以把代码转换成完全汇编代码(非C++)并编译为asm代码...然后编译/链接的obj文件可以链接到您的C++项目中。BCB 5中的IIRC是一个选项,但多年未使用,因此该功能可能会被删除,但您仍然可以使用任何汇编程序进行编译(TASM,NASM...)borland总是与TASM兼容(因为它是内部使用的),所以我建议使用它来避免额外的问题...
l7wslrjt2#
你为什么要把汇编程序翻译成汇编程序呢?你展示的代码是在内存中定义一个字节,然后把它的内存地址返回给调用者。这可以也应该用原生C++编写,让编译器为你创建必要的汇编程序,即:
const char* Test() { static const char ch = 0; return &ch; }
2条答案
按热度按时间tuwxkamq1#
您的代码存在一些问题,如您无法在C++
asm
中转发引用标签,但有一个例外(jmp
指令)...内置帮助和在线帮助:
建议标签的语法与Pascal中的语法相同...这是真的但是标签的用法非常不同!!!在某种程度上,它们几乎是无用的我仍然没有让它工作,即使经过15年以上,他们改变了它,因为您可以使用标签只用于跳转,也许调用,但没有其他...
也许有一些指令或关键字允许使用标签,但还没有发现任何,因为所有的例子都是在Pascal语法,这在C环境中不工作。
另一个问题是您使用
test
标签...您忘记了test
是汇编指令,因此名称冲突!!!您仍然可以解决以下问题:
1.重新排序代码,以便不需要前向引用
这是可行的,因为
jmp
仍然工作,因为应该与标签,但你可以忘记简单的自我修改代码...1.**将局部asm变量转换为C局部变量**
局部C变量可以直接从
asm
访问请注意,函数操作数不是这样,如果您需要它们,请先将它们复制到局部变量中1.**将寻址语法转换为C**
你知道的
在C++中,您必须使用
LEA
指令而不是OFFSET
...只需创建一个断点,并查看OFFSET
将返回什么(在我的情况下,总是0xFFFFFFFF
而不是真实的地址),同时LEA
获得正确的地址。把所有的放在一起你可以尝试这样的东西代替:
如果你有一个非常讨厌的代码,你也可以把代码转换成完全汇编代码(非C++)并编译为asm代码...然后编译/链接的obj文件可以链接到您的C++项目中。BCB 5中的IIRC是一个选项,但多年未使用,因此该功能可能会被删除,但您仍然可以使用任何汇编程序进行编译(TASM,NASM...)borland总是与TASM兼容(因为它是内部使用的),所以我建议使用它来避免额外的问题...
l7wslrjt2#
你为什么要把汇编程序翻译成汇编程序呢?你展示的代码是在内存中定义一个字节,然后把它的内存地址返回给调用者。这可以也应该用原生C++编写,让编译器为你创建必要的汇编程序,即: