我正在尝试将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
是汇编指令,所以名称冲突
你仍然可以变通:
-
重新排序您的代码,这样您就不需要前向引用
这是可行的,因为
jmp
仍在使用标签,但您可以忘记简单的自修改代码。。。 -
将本地asm变量转换为C++本地变量
局部C++变量可以从CCD_ 6直接访问。请注意,函数操作数并非如此,如果需要,请先将它们复制到局部变量中。
-
将寻址语法转换为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;
}