寻找低级编程语言的学习资料

时间:2013-02-08 23:43:57

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

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

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

注意:我确实意识到这将是一项艰难,具有纪念意义和自虐的努力。你没必要告诉我。我会在学习材料的自我跋涉之旅中表现得比我没有的好。

第二个注释:我已经了解了很多关于操作系统,内核和I / O设备的内部工作方式,如果是抽象的,以及内存如何工作和分配,我已经掌握了扁平装配的基本知识。

我内心的怪人是不安的!

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

然而,这并不意味着固件blob是一些übergeek整天用十六进制代码猛烈抨击的结果,这些文件通常在工具链中开始,这些工具链支持与常规编程相当的工作流程:源代码是以某种更高级的语言生成的(但不一定是C或C ++之类的常见语言),并且代码被编译为二进制文件 - 固件文件。

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

答案 2 :(得分:1)

查找正在学习的CPU的查找处理器操作码。这些代码是将组装pnumonics转换为“hex”值的rosetta stone,并且是汇编器所做的很好的事情。然后绝望地使用它。我有很强的装配背景,并且在调试版本构建时偶尔也会偶尔使用它。但直接的操作码读写并不再那么有用了。我最后一次做这种事情的是在Color Gameboy上编写自修改代码,以便在HBlanks期间有效地调整填充。正如我所说的那样,非常,非常特别,在现代时候用讨厌的缓存阻碍它们。

答案 3 :(得分:0)

您是否尝试过这个名为“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