我刚学完汇编语言。但我无法理解我能实施什么(对于练习/像小项目)。如果它对任何人都有用的话会很棒。
答案 0 :(得分:55)
我最喜欢的爱好之一是逆向工程。
它需要扎实的汇编知识和使用反汇编程序/调试程序来完成编译代码。这允许您更改,理解和反转已编译的程序。每个新程序就像一个等待解决的难题!
例如,很多人在首次开始时会像Minesweeper这样的游戏进行逆转。
以下是Minesweeper中代码的关键部分的屏幕截图,我反过来了一段时间(右侧评论):
通过在rand()
函数的调用上放置断点并在callstack中向后退步来定位。经过一番挖掘后,很明显:
有了这些知识,就可以很容易地确定雷区内任何一个矿井的位置:
cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1);
然后,通过一个简单的循环和对ReadProcessMemory()
的一些调用,你得到了终极的扫雷黑客!
阅读手写组件比阅读机器生成的组件容易得多。现代编译器为代码做了一些神奇而疯狂的事情,有时很难遵循。所以,这肯定会推动你的装配知识!
有很多活动可以从中脱颖而出:
还有更多!
如果您有兴趣,我强烈推荐这本书:Reversing: Secrets of Reverse Engineering
答案 1 :(得分:15)
您可以了解操作系统如何在低级别工作(中断,虚拟内存等)。 首先编写一个可以完全访问硬件的引导加载程序,然后就可以开始使用保护模式,VGA编程等等。
两个好资源:
http://wiki.osdev.org/Main_Page
http://www.osdever.net/FreeVGA/home.htm
[编辑]
如果您想了解优化,请查看Agner Fog的网站:http://agner.org/optimize/。
[编辑]
复制自Simucal的评论:
您可能还想添加一个指向MikeOS的链接。它是一个用Assembly编写的小型操作系统,它被设计为一种学习工具,用于查看操作系统的简单工作方式。它有很好的评论代码和文档:http://mikeos.berlios.de
答案 2 :(得分:5)
这可能看起来很陈词滥调,但您可以尝试使用汇编在projectueler处回答一些问题。
答案 3 :(得分:5)
今天,汇编程序用于以下领域:
答案 4 :(得分:5)
优化。如果您在Windows上编程,请了解如何使用英特尔的VTune。在这里,您可以看到瓶颈所在。然后在汇编程序中重写这些例程。
由于大多数现代软件一直在变化,所以这更像是一种智力锻炼和自我满足感,使得在现实世界中获得更快的运行速度。
有一两个人在为运行时CPU定制的汇编程序中重写了许多核心C主机,memcpy,memset等。所以代码更大,因为它有额外的例程来利用CPU扩展,SSE等但速度更快。这些C原型通常最终出现在许多软件包中。因为大多数程序一直都在做内存。
答案 5 :(得分:4)
根据您学习装配的程度,您可以尝试为小型微处理器编写固件,甚至可以尝试为连接到计算机的小型设备编写固件。您还可以尝试在汇编中编写完整的软件应用程序,并为它们提供漂亮的GUI。
一般来说,根据我的经验,汇编在编写大量软件项目时并不那么有用,因为对于很多应用程序而言,速度并不重要(至少,不是在多核处理器时代)所以你可以做的有点受限。
答案 6 :(得分:3)
答案 7 :(得分:2)
您可以查找可以与并行端口连接的机器人或控制器,并编写一些很酷的键处理程序来控制它们。您还可以截取BIOS调用,如Int13 for Disk,并编写一些磁盘镜像工具,RAID驱动程序等。您可以连接一些传感器,如温度/振动/压力等,并进行一些数据采集。
答案 8 :(得分:1)
我想你可以试试code-golf
至少还有一个O.S.在汇编中为PC编写:MenuetOS。 (我不知道为什么。)他们可能想要贡献。
据我所知,在20世纪70年代早期发明C之前,大多数操作系统实际上是用直接组装编写的。我不建议这样做,但你可以写一个独立的程序,只是为了好玩。请注意,CPU将以16位模式启动,并且很难将其切换到32位。最好只用16位x86编写独立程序。您可以使用模拟器进行开发。
答案 9 :(得分:0)
至少你现在可以从gcc输出汇编程序:
gcc -c -S test.c -o test.asm
然后,您可以检查生成的C代码的输出以用于教育目的。
答案 10 :(得分:0)
如果您已经是高级编程语言的开发人员,汇编语言允许您创建优化的例程/函数。我不了解其他的,但Delphi,例如,允许您将汇编代码完美地集成到任何单元中,并处理函数参数等。
答案 11 :(得分:0)
如果它对任何人都有用,那就太棒了。
您已经熟悉了计算机的低级操作。能够读取程序集可以帮助您了解编译器的行为方式。
其他人可能会批评一些,因为它反映了一种两极化的观点。在一个糟糕的嵌入式项目之后的一天,我的导师告诉我:“如果有人为你工作,请在集会中写作,解雇他以保住自己的工作。”我同意他的看法。从程序化的角度来看,在汇编中编写太麻烦了。