【问题标题】:Looking for learning materials for low-level programming languages [closed]寻找低级编程语言的学习材料 [关闭]
【发布时间】:2013-01-24 20:18:02
【问题描述】:

我希望学习编写驱动程序和固件以及其他操作系统内容的裸机编程,但我终其一生都找不到任何好的学习材料来学习这些语言。我为 asm 找到的宝石很少而且相差甚远,而且我找不到任何关于直接十六进制编程的东西。当我说直接的十六进制时,我的意思是你可以在 Linux 内核的固件部分找到的那种东西。这是我在两个月的搜索中得到的最接近的结果:http://www.omnimaga.org/index.php?topic=6272.0,而本教程的信息太少,并且没有根据我的知识进行跟进。

TL;DR:我想学习十六进制。在哪里?

注意:我确实意识到这将是一项艰巨、巨大且受虐狂的努力。你不必告诉我。在这个自我鞭笞的旅程中,我会比没有学习材料做得更好。

第二点:我已经对操作系统、内核和 I/O 设备的内部工作原理(如果抽象的话)以及内存的工作原理和分配方式了解很多,而且我已经基本掌握了平面组装。

我内心的极客是不安分的!

【问题讨论】:

标签: assembly operating-system hex low-level-code


【解决方案1】:

好吧,如果您想知道如何用十六进制编程 x86 处理器,您需要的所有信息都在 Intel Software Developer Manuals 中。最具体地说,您需要第 2 卷中的所有信息。第 2 章涵盖一般指令编码,第 3 章和第 4 章涵盖所有特定指令。

【讨论】:

  • 天哪,谢谢!我需要一个好的操作码参考
【解决方案2】:

如果这让你内心不安的极客感到失望,我很抱歉,但我认为你误解了这些固件 blob 的目的以及它们的创建路径。

Linux 中存在的固件文件是需要上传到接口适配器的大量内容,并将由该适配器上存在的任何智能执行。通常这些是高度特定的 ASIC,需要将固件作为二进制 blob 上传有几个潜在原因:ASIC 生产商不想透露芯片的确切内部工作原理,或者不愿意(或能够) 与用户共享源代码或必要的工具。

但是,这并不意味着固件 blob 是某些 übergeek 整天疯狂地输入十六进制代码的结果,这些文件通常在工具链中开始它们的生命,这些工具链支持与常规编程相当的工作流程:源代码以某种高级语言(但不一定是 C 或 C++ 等常见语言之一)生成,并且该代码被编译为二进制文件 - 固件文件。

所以,虽然这可能是一个巧妙的技巧,让人们在夏天的第一次烧烤时惊叹不已,但“编程十六进制”的实际应用几乎不存在,如果你真的想深入,汇编已经足够深入了.由于现在编译器技术的进步,即使大多数微控制器开发都不再使用汇编代码,所以最好的办法是挖掘旧的 DOS 软件,在那里你会发现很多用汇编代码编写的应用程序。

【讨论】:

    【解决方案3】:

    查找您正在研究的 CPU 的处理器操作码。这些代码是将汇编 pnumonics 转换为“十六进制”值的罗塞塔石碑,并且是汇编器所做的大量工作。然后绝望地使用它。我在汇编方面有很强的背景,并且在调试发布版本时仍然偶尔会使用它。但是直接操作码读写不再那么有用了。我最后一次做这种事情是在 Color Gameboy 上编写自我修改代码,以便在 HBlanks 期间有效地填充调色板。正如我所说的,非常非常专业化,在现代没有用,因为讨厌的缓存会挡道。

    【讨论】:

      【解决方案4】:

      您是否尝试过这个名为“Linux Assembly Tutorial”的文档

      http://docs.cs.up.ac.za/programming/asm/derick_tut/

      例如,它有一个“hello world”,内容如下(逐字复制):

      section .data
          hello:     db 'Hello world!',10    ; 'Hello world!' plus a linefeed character
          helloLen:  equ $-hello             ; Length of the 'Hello world!' string
                                         ; (I'll explain soon)
      
      section .text
          global _start
      
      _start:
          mov eax,4            ; The system call for write (sys_write)
          mov ebx,1            ; File descriptor 1 - standard output
          mov ecx,hello        ; Put the offset of hello in ecx
          mov edx,helloLen     ; helloLen is a constant, so we don't need to say
                           ;  mov edx,[helloLen] to get it's actual value
          int 80h              ; Call the kernel
      
          mov eax,1            ; The system call for exit (sys_exit)
          mov ebx,0            ; Exit with return code of 0 (no error)
          int 80h
      

      (我得到这个的谷歌查询是:https://www.google.co.uk/search?q=how+to+write+drivers&oq=how+to+write+drivers

      【讨论】:

        猜你喜欢
        • 2011-02-22
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 2011-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多