我开始经历兰德尔海德的“大会艺术”,开始磨砺我的味觉。我从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. */
由于我和汇编语言一样绿,我不知道如何使这项工作。我假设我的汽油版本和HLA 1.38之间存在差异。所以问题仍然存在:现在是什么?
编辑:我尝试只编译'program','begin'和'end'指令(删除它与stdlib有关的可能性),并使用一个实际上没有任何效果的程序获得相同的结果。 / p>
我在64位CrunchBang Linux上。
答案 0 :(得分:3)
如果你想学习汇编程序,我真的建议放弃HLA和这本名字很糟糕的书。通常,您希望使用汇编程序,以便您可以完全控制生成的代码。 HLA把它带走了。如果你想要一个更高级别的语言来打扰寄存器分配和推送和弹出,那么有更好的选择。
至于你的问题,似乎HLA生成的asm不是GAS的有效语法。由于它主要针对Windows,因此看起来Linux的测试不是很好。您可以尝试在文件顶部添加“.intel_syntax noprefix
”,或者将$添加到所有立即值(例如0),但我怀疑不会有一个简单的修复。
答案 1 :(得分:2)
以防其他任何试图闯入大会的人偶然发现这个问题:对于那些熟悉高级语言并希望在第1天没有天鹅潜水的情况下更接近机器的人来说,HLA是一个很棒的中间步骤。 / p> 但是,正如汤姆所说,它并不是实际汇编语言的替代品。一旦你对HLA和汇编的一些命令感到满意,那么就转向真正的汇编语言。它将不那么令人生畏(个人经历)