gpt4 book ai didi

delphi - Delphi标签地址

转载 作者:行者123 更新时间:2023-12-02 15:16:06 27 4
gpt4 key购买 nike

我正在用 Delphi pascal 进行简单的 PIC18 MCPU 助记符模拟。是的,我打算使用 Delphi IDE。我可以模拟任何 asm 指令,但它会停在标签处。在某些情况下我需要知道Delphi标签的地址。是否有可能将标签转换为指针变量?

就像我的例子一样?

procedure addlw(const n:byte); //emulation of mcpu addlw instruction
begin
Carry := (wreg + n) >= 256;
wreg := wreg + n;
Zero := wreg = 0;
inc(CpuCycles);
end;

procedure bnc(p: pointer ); //emulation of mcpu bnc instruction
asm
inc CpuCycles
cmp byte ptr Carry, 0
jnz @exit
pop eax //restore return addres from stack
jmp p
@exit:
end;

//MCPU ASM 代码的仿真

procedure Test;
label
Top;
var
p: pointer;
begin
//
Top:
addlw(5); //emulated mcpu addlw instruction
bnc(Top); //emulated mcpu bnc branch if not carry instruction
//
end;

最佳答案

不,您不能以这种方式与标签交互。由于您正在模拟其他所有内容,因此您也可以模拟汇编器标签,而不是试图强制 Delphi 标签执行它们不适合的操作。

假设您可以使用这样的代码而不是您编写的“汇编器”代码(现在不用担心如何实现它):

procedure Test;
var
Top: TAsmLabel;
begin
//
DefineLabel(Top);
addlw(5); //emulated mcpu addlw instruction
bnc(Top); //emulated mcpu bnc branch if not carry instruction
//
end;

我认为语法看起来很相似。运行该代码后,您将希望 Top 引用下一条指令,即调用 addlw 的指令。

在假设的函数 DefineLabel 中,该地址对应于返回地址,因此编写 DefineLabel 将其返回地址存储在给定参数中:

type
TAsmLabel = Pointer;

procedure DefineLabel(out Result: TAsmLabel);
asm
mov ecx, [esp] // copy return address
mov [eax], ecx // store result
end;
<小时/>

请注意,此代码会损坏堆栈。您的 bcn 函数将其返回地址留在堆栈上,因此当进位标志最终被设置时,您会在堆栈上留下先前返回地址的痕迹。如果你没有首先得到堆栈溢出,当你到达包含函数的末尾时,你会得到奇怪的结果。它会尝试返回,但不会去找调用者,而是会找到 bnc 的返回地址,然后跳回代码中间。这一切都假设代码中没有任何其他与堆栈相关的引用。如果有,那么即使调用 bnc(Top) 也可能会出现问题,因为 Top 的相对位置会发生变化,并且您将结束从堆栈中读取错误的值。

关于delphi - Delphi标签地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739318/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com