【问题标题】:How to print string in OS-neutral way?如何以与操作系统无关的方式打印字符串?
【发布时间】:2010-09-05 05:11:09
【问题描述】:

我正在尝试以与操作系统无关的方式打印字符串。例如,程序在 Windows 上的运行应该与在 *nix 上的运行方式相同。

这甚至可能吗?我假设由于底层架构是相同的(x86),所以方法是相同的。像调用中断一样简单吗?

这样做的原因是我正在尝试编写一个生成汇编代码的编译器 - 在其开发的早期阶段,只有少数功能存在 - 我希望能够测试生成的汇编代码在 Windows 或 *nix 中。以后,在生成相同代码的同时保持平台中立性是不可能的,但基本上我现在要做的就是打印一个字符串。

【问题讨论】:

    标签: assembly cross-platform x86 nasm


    【解决方案1】:

    你能链接到libc吗?如果你能做到这一点,你应该可以打电话给printf() 并完成它。示例程序可以在this link 找到。

    【讨论】:

    • 但是如何与libc platform-neutral 链接?
    • +1 - 我必须同意 - 您将无法使用独立于平台的中断来执行此操作 - 除非巧合或设计中断 INT 10h 都支持。或者,自己创建一个用于输出字符串的小型函数库,并根据平台调用相关的中断(如果 Linux 字符串输出是基于中断的)。
    • @George,我敢猜测大多数平台都有libc。例如,您运行程序的外壳很可能是用它构建的。
    • 2010 年了,为什么人们还在谈论操作系统服务的中断?
    • @siride:因为他在汇编中写作。真正的问题是 2010 年,为什么还有人在汇编中编写代码?
    【解决方案2】:

    不应将纯程序集视为可在操作系统之间移植。没有通用的方法可以通过程序集与系统服务进行交互。你甚至不应该假设类 Unix 操作系统之间的可移植性(POSIX 没有指定调用约定,尽管一些 x86 Unix 确实使用通用约定)。

    即使在高级语言中,调用约定在技术上也可能在完全相同的 CPU+OS 上从一个编译器到另一个编译器有所不同,尽管编译器通常使用为主机环境指定的任何约定。

    另请参阅x86 calling conventions 上的维基百科页面。

    【讨论】:

      【解决方案3】:

      为此,您需要编写类似于polyglot 的内容。

      【讨论】:

        【解决方案4】:

        抱歉,没人提过Java?

        【讨论】:

        • Java 如何回答这个问题?这是一个关于汇编语言的问题。
        • 通过进程内 JVM 推送字节码,在其他帖子中解决了 libc 平台中立性问题。
        • 我不是在写一个进程内 JVM - 我在写一个编译器。不过我明白你在说什么。但是使用 JVM 不是一种选择。
        猜你喜欢
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2015-08-27
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-24
        相关资源
        最近更新 更多