1

我已经开始阅读 Randall Hyde 的“组装艺术”来开始刺激我的味觉。我从这里下载并安装了 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 上。

4

2 回答 2

3

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

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

于 2013-02-02T16:25:34.700 回答
3

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

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

于 2012-06-05T09:17:45.000 回答