【问题标题】:Choosing the right and learning assembler for compiler-writing选择正确的和学习编译器编写的汇编器
【发布时间】:2011-02-11 06:59:11
【问题描述】:

我正在编写一个编译器,并且我已经完成了它们在所有编译器书籍中向您展示的所有步骤(标记化、解析、语法树结构等)。 (请不要评论“编写编译器的资源”问题的链接!)。

我选择使用 NASM 和 alink 作为我的后端。

现在我的问题是:我找不到任何学习 NASM 和一般汇编的好资源。

关于 x86 汇编的 wikibook(德语)可怕。他们甚至没有解释他们在那里编写的代码,我目前什至无法得到简单的东西,比如将 1 加到 2 并输出结果。

  • 在哪里可以学习 NASM x86 汇编?

【问题讨论】:

  • 编译器没有理由输出汇编程序。让它输出您熟悉的语言,例如 C,然后使用 C(或其他)编译器生成最终的可执行文件。
  • 您的问题更像是“我在哪里可以学习 NASM x86 汇编?”正如你自己所说。请选择一个更好的主题,因为它与编译器完全无关。你考虑过 llvm 吗?
  • 对于奖励积分,请以正在编译的相同语言输出您的代码。然后编译。
  • @Neil:我对只翻译成 C 感到不舒服。我宁愿完全控制和优化我的语言,而不受其他编译器的限制。
  • @X A 编写您的 C 编译器的人可能比您更了解优化 - 您可以利用他们的专业知识。过去使用高级语言作为编译器输出已经成功完成了很多次。

标签: x86 nasm assembly


【解决方案1】:

除非您已经检查过,否则 NASM 手册是学习 NASM 的很好资源:http://www.nasm.us/doc/

NASM 和 GAS 的比较也有所帮助:http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html

Freenode se(r)ver 的 irc 频道 #asm 提供以下链接:

我还花了一些时间为你混搭了一个小小的 hello world:

bits 32
section .data
    greeting db "hello world", 10
section .text
global _start
_start:
    mov eax, 4 ; sys_write
    mov ebx, 1 ; stdout
    mov ecx, greeting
    mov edx, 12 ; greeting.length
    int 0x80 ; system call interrupt

    mov eax, 1 ; sys_exit
    mov ebx, 0
    int 0x80

将其组装成:

nasm -f elf -o example.o example.asm
ld -o example example.o -melf_i386

我自己用 python 编写了一个小型代码生成器。虽然我刚才把那东西放在中间了。最近我写了一些不同的工具,可能对任何处理装配的人有用。现在我也在寻求帮助.. 除了似乎我必须在那里做一些自助:x86 instruction encoding tables

我拥有的旧代码生成器位于http://bitbucket.org/cheery/g386/,直到我启动并运行新的基于表的代码生成器。

【讨论】:

    【解决方案2】:

    好吧,如果您愿意接受一本书作为参考。我在 80 年代学习 Pascal 时最喜欢的作家是 Jeff Duntemann。他最新的汇编书籍涵盖了 NASM。 http://www.duntemann.com/assembly.htm

    不确定您的目标是什么操作系统,但上述书籍针对 Linux 的事实应该不是问题,程序集结构是您感兴趣的。

    说实话,代码生成的实际汇编并不是最难的部分,恕我直言,我认为寄存器管理才是真正的学习所在。

    祝你好运!

    【讨论】:

      【解决方案3】:

      如果有人仍在寻找有关 NASM 的教程,请查看以下内容: http://cs.lmu.edu/~ray/notes/nasmtutorial/

      【讨论】:

        猜你喜欢
        • 2010-09-05
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多