【问题标题】:Moving the program to the stack [Assembly 80x86]将程序移至堆栈 [Assembly 80x86]
【发布时间】:2013-07-05 01:40:50
【问题描述】:

您好,提前致谢!

我正在处理一个汇编项目,我需要将我的程序代码移动到堆栈中,并从那里继续程序的流程。

这意味着程序将从代码段开始,并在运行时移动到堆栈段。它会在那里执行给它的任务(现在,让它无限循环)。

我尝试了一些想法:

PUSH word [cs:jump]
MOV cx, sp
PUSH SS
PUSH SP
MOV BP, SP
ADD word [word BP], 2
JMP FAR [BP]
jump:
JMP cx

这可以编译,但不起作用。

汇编语言是英特尔针对 80x86 的 16 位汇编。 汇编器是 nasm。

感谢所有的帮助。

【问题讨论】:

  • 需要将程序移到堆栈中吗?这是一个非常不寻常的需求。您的问题很可能可以通过其他方式解决。 [在现代处理器上,您也可能会遇到麻烦:堆栈区域通常被标记为“不可执行”,因此即使您将程序移到那里,您实际上也可能无法执行它。您似乎使用的是纯 x86,因此执行保护可能不适用]。
  • 我见过一个示例程序可以在 80x86 的程序集上执行此操作,问题是它是为 tasm 而不是 nasm 编写的。我似乎无法正确“转换”它。
  • 我找到了为tasm制作的程序:P286N IDEAL DOSSEG MODEL small STACK 100H CODESEG start: push [word cs:exit + 4] push [word cs:exit + 2] push [word cs:exit ] push ss push sp mov bp, sp add [word bp], 2 jmp[dword bp] exit: mov ah, 4CH mov al, 0 int 21H END start

标签: assembly stack


【解决方案1】:

我假设您正在使用默认 bin 输出格式编译代码以生成 .COM 文件。如果是这样,您需要注意 .COM 文件在内存中以 100h 的偏移量加载。您需要通过在代码开头添加 ORG 指令来让汇编器意识到这一点。

ORG 100h

完成此操作后,您的代码应该可以按预期工作。如果没有 ORG 指令,汇编器假定起始地址为 0,因此 jump 内存引用将关闭 100h 字节。

有关详细信息,请参阅NASM documentation

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2011-01-26
    • 2018-09-09
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多