这个问题的答案当然是“写一些汇编代码!”
但我可以这样做:我知道基本的x86语法,寄存器的类型以及如何使用它们,子程序等等。
当我参加汇编课程时,每个作业都有我们允许使用的最大指令数。如果我们过去了,那么我们就会失去分数 - 所以这教会我们有效地做事。你知道,如果你看到一个C程序在做这些事情的话,你可能会因为创建难以理解的代码而对这个人有所帮助。
对于C,可以建议“编写多线程程序”或“编写套接字服务器/客户端”。对于PHP,建议可能是“编写个人博客软件”。要学习语言的语法,通常建议使用“项目euler”。
所以我的问题是:
我可以在大会上写什么样的东西来磨练我的装配和效率技巧?例如,我可以在x86中执行项目euler问题,但这对我的程序集特定技能没有帮助。什么是我能做的项目创意只能用汇编程序编码?
我如何分析是否正在编写“好”代码?例如,使用C和套接字,网上有十亿个教程,我的好友列表中有十亿人可以查看我的代码,并且有十亿个关于它们的SO问题:因此更容易测量一个人的进步。
是否有现有的装配重型项目,我可以从中学习?或者为了提高效率,他们甚至为了[特定任务]而进入程序集的部分程序?
我应该阅读什么类型的书?那些经常看低级别事物的人的博客?
(最好是我可以在linux上的x86上做的事情。我认为这些概念会延续到其他架构。)
答案 0 :(得分:6)
好的答案。我还建议编写一个小编译器并让它为您编写汇编语言。这样,您可以考虑在汇编程序中执行不同的方法,例如传递参数,制作堆栈帧,组合地址表达式,数组索引,管理内存,条件,循环,try-catch等等。
答案 1 :(得分:3)
一种方法可能是从标准C库中选择函数(例如字符串函数,mem *())以在汇编中从头开始实现。构建基准测试工具来衡量代码的性能,看看是否可以与系统上提供的库的性能相等或更好。我不会认为反汇编系统库代码是作弊的(在你对它进行了重击之后),通常可以通过检查反汇编代码找到有用的技术。强烈建议阅读其他人的代码(可能从Linux内核源代码中的汇编代码开头。)
答案 2 :(得分:3)
汇编可以做许多C不能做的事情,优化器也不是魔术。也就是说,大多数有用的不需要你成为装配半神的东西都属于编译器,标准库和解释器运行时类别。
例如,Trampolines在所有这三个中都是有用的,并且你不能使用C来组成一个任意的调用栈。要编写更好的装配,请阅读此处的手册:
http://www.agner.org/optimize/
要查看专门用于汇编的程序和一个专注于优化的社区来对您进行基准测试:
答案 3 :(得分:2)
写什么:
编写一个简单的3D纹理映射渲染器。这是一个不错的项目,因为它不是超级复杂但不是超级琐碎。事实上你可以看到效果很好。
答案 4 :(得分:1)
如果双脚都适合你,请考虑改进分布式质量计算BOINC project的内环 - 如SETI@Home。 (Other projects here。)
在我的电脑上,每个SETI @ Home工作单元都需要几个小时来处理,并且几乎完全受CPU限制。通常,C / C ++编译器在安排并行浮点和整数运算方面并不出色,特别是对于每种CPU类型。特别有用的是优化,比如x86指令,以优化它实际运行的CPU的特定功能:SSE SSE2,80586,80686,Athlon等。那些仍在运行十年以上的硬件的人会欣赏这样的优化和现代硬件无疑也将在很大程度上受益。
答案 5 :(得分:1)
首先,如何定义“良好的汇编代码”?最快的代码,最符合ABI的代码,还是最容易阅读的代码?我认为“好”取决于整体目标,而你并没有真正告诉我们你想要使用汇编。
其他人建议编写软件光栅化器。我可以抓住它,但由于你已经知道x86助记符,你真的不需要编写更多的汇编代码。您需要的是更深入地了解机器如何工作。
我的建议是编写一个系统范围或用户空间模拟器。我为ARM920编写了一个系统模拟器,学到了很多东西,没有编写单个汇编助记符!好吧,它最终死得很慢,但我把它写成纯C语言的翻译。我现在知道ARM架构的大部分黑暗秘密,它让我对嵌入式计算机的工作方式有了新的认识。
请记住,外设可能很复杂。模拟CPU没有任何问题,但添加了简化的伪外设。如果你很好,你甚至可以为他们制作一个即插即用系统。
您可能想查看QEMU和DosBox来源以获得一些好主意,尽管他们使用的是JIT方案。我的翻译是gp2xemu。这是对GP2x的模拟器的尝试,但是由于文件太糟糕而导致我陷入困境。