学习机器语言编程方面的资源?[关闭]


24

我是一名学生,从Java到C ++,再到C,都热衷于编程和热爱编程。我退回到了准系统,并认为可以进一步深入到Assembly。

但是,令我惊讶的是,很多人说它不如C快,而且没有用。他们建议学习如何编程内核或编写C编译器。我的梦想是学习以二进制方式(机器代码)编程,或者以裸机编程(以物理方式编程微控制器),或者编写BIOS或引导加载程序或类似性质的东西。

经过大量研究后,我听到的唯一可能是十六进制编辑器是我在这个时代和时代所能找到的最接近机器语言的东西。还有其他我不知道的事情吗?是否有任何资源可用于学习机器代码编程?最好在8位微控制器/微处理器上。

这个问题与我的相似,但是我首先对实践学习感兴趣,然后对理论有所了解。


2
到底是什么问题?如果您询问是否可以用机器代码进行编码,则答案可能是“是”。如果您要教程,那么a)清楚地说明您的问题是什么,但是b)这不是一个建设性的问题。
克里斯·

6
C不够金属吗?
Tom Squires

6
program bare metal每一次我踢我的服务器框中。创造奇迹!
yannis 2011年

7
是否曾经考虑过走得更远?破解您自己的CPU:opencores.org
SK-logic

3
@ SK-logic,是的,大约1小时后,机器代码编程将变得难以忍受。没错,一个更好,更有成效的想法是深入研究CPU实现。也有6502(虚拟版本visual6502.org谁拥有或渴望构建CPU的利用现代离散逻辑(),以及乡亲bradrodriguez.com/papers/piscedu2.htm
安杰洛

Answers:


27

人们不使用机器代码编程(除非他们是受虐狂)。他们使用(或开发)工具来生成机器代码(编译器或汇编器,包括交叉开发工具),或者使用库来生成机器代码(LLVM,libjit,GNU lightning等)。因此,有关机器代码生成,编译,优化器和微体系结构的资源也很重要。

通常,一个好的优化编译器会生成比您能做的更好的机器代码。您可能无法比好的优化器更好地编写200行汇编器代码。

如果您想了解机器代码,请先学习汇编。它非常接近机器代码。明智地使用它,仅用于不能使用C(或某些高级语言,例如Ocaml,Haskell,Common Lisp,Scala)进行编码的事情。好的方法通常asm是在C函数中使用指令(特别是GCC 扩展汇编功能)。读取汇编代码(由生成gcc -S -O2 -fverbose-asm)也可能会有所帮助。

Linux的装配方法文档的阅读是一件好事。

当前处理器的指令集架构(即芯片可理解的指令集)非常复杂。常见的是x86(32位模式下的典型PC),X86-64(64位模式下的台式PC),ARM(智能手机等),PowerPC等。它们都很复杂(由于历史和经济原因)原因)。也许首先学习一个假设的指令集,例如Knuth的MMIX更简单。


8
“人们不使用C(...)编程。他们使用现代语言,也许带有C后端”
Abyx 2011年

我绝对同意。而我目前的工作项目(MELT,见gcc-melt.org)转换为C的DSL
巴西莱Starynkevitch

我加了一些引用的ISA
巴西莱Starynkevitch

6
那些想要创建和组装的人呢?有一些学习机器代码的理由,尽管并不常见。
杰蒂2011年

我要说的是,它正在学习一种指令集体系结构(使用汇编助记符)。您很少会明确学习指令的确切编码(例如,NOP为0x90)。在编写汇编器或机器代码生成器时,许多人需要了解它。(同样,您很少需要认真学习Unicode的UTF8编码)。
Basile Starynkevitch 2011年

13

如前所述,学习汇编

汇编语言是用于计算机,微处理器,微控制器和其他可编程设备的低级编程语言。它实现了对给定CPU架构进行编程所需的机器代码和其他常量的符号表示。

所以大会是一个symbolic representation of machine code

您现在可能会问:“好,那我该如何学习所有这些?” 我很高兴你问:

  1. 了解它是什么。它是非常低级的,它将使您对计算机有非常深入的了解。您可能想从Wikipedia开始,然后阅读此简短文章
  2. 学习吧!最好的读物可能是汇编语言汇编语言的技巧:循序渐进:Linux编程
  3. 获取编码!

我在读这个线程,我想我偶然发现了这个问题:programmers.stackexchange.com/a/82573/43388有什么性质的东西我可以找到教程吗?但是,我需要先学习汇编才能使过渡更容易。
AceofSpades 2011年

1
谢谢,我想我需要根据大众需求学习汇编。+1
AceofSpades 2011年

8

我强烈建议您重新考虑您的目标,这是为什么:

我首先在BBC微型计算机(型号B,32K)上学习了6502汇编语言。它有一个很棒的BASIC实现,其中包括一个宏汇编器。我们在学校里有它们,所以我写了各种各样的调皮程序,这些程序可以进行诸如直接屏幕缓冲操作等操作,以便在机器没有被使用10分钟的情况下,在整个屏幕(它们都联网)上遍历每个屏幕。 。这让我7年级的朋友们咯咯地笑了。

当我在家中获得Commodore 64时,我了解到它具有6510 CPU,它还运行6502汇编语言,但还带有一些有趣的功能。我必须购买一个汇编器(放在墨盒上)并通过BASIC调用程序。凭借编写畅销游戏的雄心壮志,我​​最终设法创建了几个演示,这些演示在中断时对视频显示硬件进行了位旋转,以制作有趣的彩条效果,并生动地表现出时髦的芯片音乐。令人印象深刻,但没那么有用。

然后,我得到了带有ARM2 CPU的Acorn Archimedes A310,因此我使用了与内置宏汇编器相同的,很棒的BASIC实现,与BBC Micro(相同)。我设法整理了一些游戏,这些游戏是由有风度的朋友提供的图形,以及一些基于正弦曲线的幻觉演示。两者都是很难编程的,错误的代码可能会使机器瘫痪(意外地使硬件复位寄存器跳闸,等等),如果我没有保存(到软盘!),则会丢失所有内容。

在大学,我被介绍给C ++,因此也被介绍给C。我能够用它来编程Sun / Solaris和其他一些大型主机。我不知道这些机器运行在什么CPU体系结构上-我从不需要使用汇编程序或读取机器代码,因为C ++工具赋予了我生产专业应用程序所需的能力。

加入Uni之后,我从事Windows和多种Unix版本的研究。C和C ++可以在所有这些机器上工作,而Java最终也可以。

然后,我使用带有DirectX的C ++和全面的调试工具链,在Windows和Dreamcast上工作。

然后,我从事了用于智能电视的基于ARM的芯片组的工作(2000年)。尽管我在ARM2方面的经验可能与这里有关,但这项工作是基于C的。我发现,我在阿基米德上完成的所有硬件工作都可以使用简单的位混合操作在C中完成。我的部分职责是将代码库迁移到Windows,Playstation 2,Linux,其他电视和移动芯片组。所有这些平台都可以使用C编译器(通常为GCC)和某种级别的API来写入底层计算机-嵌入式世界很少是内核O / S。除了编写引导加载程序和mini-BIOS之外,我再也不需要知道任何特定平台的完整机器代码,这两者在第一个可用的机会(在设置陷阱矢量,

下一项工作是在Windows上使用C ++,C#和JavaScript。没有机器码。

当前的工作是在各种平台上使用C ++,JavaScript,Python,LUA,HTML和其他语言。我不知道这些平台在运行什么机器代码,也不知道-编译器将我们的代码转换为所需的代码。如果崩溃,我会在调试器中或通过运行时诊断(异常,信号等)捕获错误。

为了娱乐,我在家里很少有空的时间上开发iOS应用程序。它使用Objective-C和跨多个芯片组工作的API。显然它们是基于ARM的,但是在开发中我从未见过任何机器代码。

虽然这是学习汇编语言的一项引人入胜的练习,但是现在有许多高级工具和语言可以使您的工作效率提高一个(或两个)数量级。

与JavaScript,Java,C#,C ++或ObjC之类的东西相比,出色的汇编语言/机器代码程序员可利用的工作机会微乎其微。

我建议您将其作为爱好/附带兴趣而不是主要目标。


6
这是一种爱好。我对事物的工作方式感兴趣,并在可能的情况下学会在最基本的水平上对其进行操作。+1
AceofSpades 2012年

6

我的建议?学习MIPS并学习如何构建(简单的)MIPS处理器。实际上比看起来容易。

与其他一些体系结构相比,MIPS的优势在于简单性。您不会陷入很多小细节,但是您仍将学习在其他体系结构中编写代码所需的所有大创意。

巧合的是,这是我(第三个)入门CS课的最后一个项目。如果需要,您可以阅读作业并以视频幻灯片的形式浏览讲座。

除其他外,我们确实介绍了如何将MIPS代码转换为二进制代码。我们甚至不得不在考试中解码一些(非常简单的)机器代码。

即使您不想覆盖所有内容,大多数讲座还是由学生最喜欢的一位讲师讲授的,而且很有趣。


非常感谢您提供的链接并解释我应该从哪里开始。+1
AceofSpades 2012年

6

我是一名学生,从Java到C ++,再到C,都热衷于编程和热爱编程。我退回到了准系统,并认为可以进一步深入到Assembly。

绝佳的选择。我从C跳到了汇编语言,然后降到更低的程度是一门大学的课程《计算机组织与设计》该书基于同名书籍

强烈推荐本书作为有关基本MIPS汇编的第一章,贯穿流水线和存储器体系结构的所有章节。更好的选择是围绕同一主题进行课程,或者在网上找到一些讲座。

另请参阅MARS MIPS Simulator,使您的手弄脏书写组件。


4

如果您想了解机器是如何完全工作的,为什么不将其降至最低水平并逐步提高自己的位置(例如C,C ++)?

我的意思是:为什么不在电路上构建自己的带有晶体管的4位加法器(如果要查找说明/教程,只需用Google来构建)?

之后,建立一台带有RAM的小型计算机,然后开始学习Assembly,并用它编写一两个程序。


如果原始海报从头开始构建计算机,则他将不得不定义(而不仅仅是学习)自己的程序集。
Basile Starynkevitch 2011年

@daniels我通过学习真正的低位加法来理解推理。+1
AceofSpades 2011年

从头开始构建计算机的另一种方法是学习一些旧的处理器(及其汇编语言),例如Z80或6502,但仍很容易理解。我猜您甚至可以使用模拟器。
乔治(Giorgio)2012年

@AceofSpades Minecraft中的redstone是轻松构建CPU和CPU组件(例如加法器)的一种好方法,我建议这样做。我已经开始在Minecraft中研究一些简单的机器,它极大地增进了我对计算机背后的理论和逻辑的理解。
亚伦

1

我为此准备了一套指令集,一个模拟器以及一些基础知识的教程,每节课一个指令或一个概念。只需键入程序,运行它,然后学习它的作用,然后继续下一课。

http://www.github.com/dwelch67/lsasim

我也有一些主流指令集的模拟器。任何一种或所有的方法都适合用来学习asm(如果您真的觉得必须学习x86,请最后学习它,并使用像我分叉的那样的模拟器,首先使用8088/86,然后继续前进)。在模拟器上学习有优点也有缺点,特别是入门时,一个主要优点是,您不会崩溃任何东西,并且拥有很高的知名度。首先进入嵌入式平台,微控制器等以学习新的指令集,您将克服看不到正在发生的事情的障碍,从而导致一长串的失败方法...



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.