【问题标题】:HLA Hello, World - Assembler ErrorHLA 你好,世界 - 汇编错误
【发布时间】:2012-06-05 00:29:52
【问题描述】:

我已经开始阅读 Randall Hyde 的“装配艺术”来开始刺激我的味蕾。我从 here 下载并安装了 HLA 1.38(我需要 64 位支持),并按照那里列出的文档和上面的书中的描述编写了 Hello, World 程序。

program helloWorld;
#include ("stdlib.hhf");
begin helloWorld;
    stdout.put("Hello, World!", nl);
end helloWorld;

当我运行hla helloWorld.hla 时,我收到以下错误消息: helloWorld.asm:66: Error: ambiguous operand size or operands invalid for 'push'

有问题的装配线如下:

pushd   0       ;/* No Dynamic Link. */

由于我对汇编语言非常了解,我不知道如何使这项工作发挥作用。我假设我的 gas 版本和 HLA 1.38 之间存在差异。所以问题仍然存在:现在呢?

编辑:我尝试只编译“程序”、“开始”和“结束”指令(消除它与标准库有关的可能性),并使用实际上什么都不做的程序得到相同的结果。

我使用的是 64 位 CrunchBang Linux。

【问题讨论】:

    标签: assembly gnu-assembler hla


    【解决方案1】:

    如果你想学习汇编程序,我真的建议你放弃 HLA 和这本糟糕的书。通常,您希望使用汇编程序以便完全控制生成的代码。 HLA 将其带走。而且,如果您想要一种更高级的语言而不用担心寄存器分配以及推送和弹出,那么还有更好的选择。

    至于您的问题,HLA 生成的 asm 似乎不是 GAS 的有效语法。由于它主要针对 Windows,因此 Linux 似乎没有经过很好的测试。您可以尝试在文件顶部添加“.intel_syntax noprefix”,或者将 $ 添加到所有立即数(例如 0),但我怀疑不会有简单的修复。

    【讨论】:

    • HLA 旨在充当从高级语言到汇编语言的“训练轮”,而不是替代它们。感谢您深入了解可能的修复方法。我会看看能做些什么。
    • 我同意伊戈尔的观点。除了你早就知道的东西之外,HLA 不会教你任何有用的东西。
    • 还有一个替代方案:fasm。这可以汇编 64 位代码,并且不需要链接器。我经常使用它来交叉汇编 Linux 上的 64 位 Windows(!) 可执行文件。我引用自己的话:“汇编程序正在绳索上跳舞。英特尔想隐藏绳索所在的位置。”。对于 hla 来说更是如此。 Randall Hyde 在记录 Windows 系统调用方面做得非常出色。这足以成为永恒的名声。没那么多。
    【解决方案2】:

    以防万一其他试图闯入 Assembly 的人偶然发现此线程:对于熟悉高级语言并希望在第一天不跳水的情况下更接近机器的人来说,HLA 是一个很棒的中间步骤。

    然而,正如 Tom 所说,它不能替代实际的汇编语言。即,一旦您对 HLA 和一些汇编命令感到满意,然后转向真正的汇编语言。这将远不那么令人生畏(个人经历)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2020-08-14
      相关资源
      最近更新 更多