我从哪里开始组装?

时间:2010-09-16 12:03:06

标签: assembly

嘿,我可以用C语言编程,在Python和Pascal中有点编程,我真的想学习汇编。我18岁就读完了高中,编程是我的爱好,因为学校工作肯定不是一个很大的挑战。

我已经下载了一些关于大会的书籍:大会艺术,初学者大会,完整初学者大会和Wrox专业汇编语言。我还下载了FASM,MASM和HLA编译器。

现在有几个问题。

  1. Assembly for Complete Beginners中的示例适用于MASM,如果我在模拟器中运行它们,有人告诉我如果我不使用它就会损坏我的电脑,如果是,我应该使用哪个模拟器使用?

  2. 此外,开发人员如何使他们的汇编代码可移植?我在这个主题上找到的唯一信息是编写病毒,因为用汇编编写的病毒必须是可移植的。

  3. HLA究竟是什么?它是真实的东西还是只是一个伪装成装配的HLL来帮助教导初学者装配?

  4. 除了明显的vxheaven和cracker网站之外,汇编社区在哪里?

  5. 我最近读了很多,但我觉得有人正在学习拉丁语,但永远不会去梵蒂冈与其他讲拉丁语的人见面。我的朋友都用Java编程,但似乎并不关心C或C ++,他们认为他们可以使用Java来实现一切。我正在英特尔上运行Windows 7和Ubuntu 10.0.10。我现在只编程了大约一年......我是否过早进入装配?我想学习装配的理由:

    1. 想要了解有关CPU如何工作的更多信息。
    2. 寻找挑战。
    3. 想学习编写高效的代码。
    4. 想要写更小更快的程序。
    5. 想要在掌握装配后了解有关OS dev的更多信息。
    6. 如果我掌握装配,学习更多HLL会更容易。
    7. 申请其他人不具备的工作时,想要提供一些东西。
    8. 对AVR感兴趣,例如Arduino,它使用C而不是汇编,但想了解更多有关AVR的信息。
    9. 感谢。 Ť

4 个答案:

答案 0 :(得分:6)

1)你不能真正“破坏”你的系统,而不是运行汇编程序。比如说,C语言。在现代操作系统中,最糟糕的情况是你最终会崩溃你的过程。不过,可能会更容易从汇编代码中崩溃您的流程。如果你想从模拟器中获得有用的东西,请查看Bochs或QEMU - 而不仅仅是提供沙箱,它们有很有用的调试工具。不过没有vm你会没事的,用常规调试器在你的常规操作系统上编写+测试代码。

2)你没有,真的。您可以跨越操作系统(但使用相同的CPU)进行移植,就像您为C操作一样,但是跨CPU组装只是没有意义(如果您想这样做,您可能也可以使用C或.NET或Java字节码)。

3)许多火焰战争的主题。取决于你如何看待它......汇编程序实际上只是一个处理汇编语言的编译器。有很多装配风味,有些比其他更高;大多数可用于x86的都支持宏。 HLA增加了一个很多的宏支持和许多人不喜欢的语法,以及一个大的标准库。不是我的一杯茶(我宁愿使用“真正的”HLL),但在我的书中,它仍然是汇编语言。

4)http://www.asmcommunity.net/board/http://board.flatassembler.net :) - 远离IRC频道。另外,远离usenet alt.lang.assembly,它几乎被一些卑鄙的人摧毁。

至于你学习集会的几个理由:

  

6.如果我掌握装配,学习更多HLL会更容易。

不一定,如果你在深入研究HLL之前“做太多”,它甚至会更难。我发现一些机器架构知识可以导致编写更好的软件,但前提是你要学会不要一直关注微小的无关细节。

  

7.申请其他人不具备的工作时,想要提供什么。

不一定会帮助你,因为大会在大多数职位上完全无关紧要。哎呀,你冒着对“哦,他永远不会完成任务,迷失无用的微观优化”这种偏见的偏见。

答案 1 :(得分:1)

这里......

  • x86不理想:
    • 很少有3-op指令(lea通常用作3-op add IIRC)。我喜欢3-op说明。
    • x86机器代码非常与实际在CPU上运行的微操作不同。完成了大量的预处理;你看到的程序集几乎没有告诉你CPU是如何工作的。
    • 很多装配建议(“这条指令更快”)有点陈旧。显然,你可以通过二进制翻译x86到x86来更快地制作一些古老的x86应用程序,以摆脱缓慢的指令。
  • 汇编不一定会教你写“更快的代码”。当有人说“哦,这个$ large_function很慢,所以我会在汇编中自己编写”,通常它会变慢。 读取汇编并发现慢速位非常有用;然后你可以调整代码来看看有什么帮助编译器(即使它很简单,“哦,GCC没有注意到该函数调用的结果是不变的”)。
  • 程序集可能会让你编写更小的代码(人类在代码高尔夫方面非常擅长),但最大的节省空间通常是因为你不需要包含C运行时。人类也可以逃避不遵守呼召惯例。
  • 操作系统很大程度上不是用汇编语言编写的(这是我挖掘一个关于在汇编中编写整个操作系统的人/人的轶事,只是为了发现它更慢)。有几位,其中最大的是引导加载程序(在x86上,它仍处于16位“实模式”)。我知道有人将东西编程到他的引导加载程序中;这听起来很有趣(但你可能想在VM中运行它,如果只是为了你可以同时使用互联网)。
  • 大会可能无法帮助你完成大部分工作(但正如我不适合想要在我的简历中查看$ list_of_languages的地方一样,我不会为一个让我失望的地方工作,因为我'我做了一些业余爱好者大会。)
  • 装配不可携带。即使使用相同CPU的系统也经常使用不同的ABI(例如“经典”Mac OS与Mac OS X)。

大多数CS课程倾向于使用RISCy(ARM,MIPS,SPARC)。我开始使用M68K,在某些时候选择了一些PPC,并在大学学习了ARM。如果您想使用电话/嵌入式设备或ARM,ARM可以相当干净并且可能非常有用;有关ARM可以做的有趣事情,请尝试SheevaPlug或类似的。

我从来没有在微控制器上做过任何事情,但听起来类似于使用ARM开发板(可能是我在整个CS课程中最有趣的事情)。

答案 2 :(得分:0)

正如你提到的那样。 8,我鼓励你使用AVR,因为它是学习和使用汇编程序的一个很好的平台。

为什么?

因为在我的电脑上,我不只是在模拟器中运行一些自编的汇编程序 我想不出电脑的常规程序,用汇编程序编程比用现代的复杂语言编程更有意义。

AVR或其他微控制器(μc)相关编程非常接近硬件,填充寄存器,移位组等。
在μc中,您可以立即获得结果(闪现一些领导!是的。)。此外,μc程序往往很短,速度可以从有效的编程中获益。

答案 3 :(得分:0)

优化汇编语言已成为过去。现代C / C ++编译器和处理器在优化编写良好的C代码方面非常有效。他们非常了解订购指令的所有技巧,因此它们可以最大化并行执行并最有效地利用缓存。这很难手工完成。如果这是一个问题,大多数编译器也可以选择优化大小。

如果您确实想要使用汇编程序,可以查看GNU汇编程序。它是合理的跨平台,但组装本质上不是跨平台。您编写汇编语言是因为您想要执行编译器可能不知道的一些非常具体的硬件技巧。

如果我是你,我想要进入低级别,我肯定会深入研究图形硬件。使用现代GPU可以做到与魔术接近。

或者学会擅长C ++。查看boost.org或游戏编程网站。它将为您提供充足的挑战和所需的全部速度。