【问题标题】:Resource for Binary Programming二进制编程资源
【发布时间】:2012-12-24 05:27:39
【问题描述】:

我在整个互联网上搜索了二进制编程,人们似乎唯一愿意给出的回答是:“你为什么要使用二进制编程?” “这很愚蠢,使用汇编。” “你无法从中得到任何东西,学习没有意义。”

如果您是这些人中的一员,我很欣赏您的意见,但它并不能回答我的问题。

虽然我不打算真正尝试用二进制编程,但我知道的原因是:

  1. 我有兴趣了解汇编命令背后的二进制指令。

  2. 我正在设计一个生成随机二进制指令的实验。我希望它们是有效的二进制命令,并且我希望能够解释这些命令在运行时会做什么。

话虽如此,有人知道任何可以学习二进制编程的资源吗?

【问题讨论】:

    标签: assembly binary


    【解决方案1】:

    一般来说,汇编指令和机器代码(你称之为二进制)之间存在一对一的映射。您可以在您关心的任何机器的指令集架构文档中找到这些映射。流行的例子:

    1. Intel Software Developer Manuals,尤其是第 2A 卷和第 2B 卷。
    2. ARM Architecture Reference Manual
    3. THe MIPS Instruction Set
    4. 8051 Instruction Set Manual

    无论您想使用哪种架构,您都可以找到类似的文档。您可以使用这些手册中的信息来解码给定程序的机器指令并确定它们是如何从汇编源代码生成的,或者如果您愿意,也可以手动汇编您自己的程序。

    【讨论】:

      【解决方案2】:

      这是我学习二进制的内容: 1. 打开命令提示符并输入“debug”作为命令。

      1. 在“-”后键入“a”。
      2. 开始在汇编中编程(确保您使用的命令非常通用,例如移动寄存器。只执行一个命令。)
      3. 不输入任何内容,完成后按 Enter。
      4. 键入“d”以查看二进制文件是什么,并交叉引用多个程序。

      请注意,要使用实际的二进制程序进行编程,您需要一个十六进制编辑器。这是我使用的:

      http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm

      我学习更复杂的语言(如 c++)的另一个想法是与汇编相同,但在十六进制编辑器中打开它。

      【讨论】:

      • 感谢您的帮助。这绝对看起来很有用。
      • 谢谢,这是我所知道的最快的学习方式,也是学习需要学习的命令的最准确、最具体的方式,尽管您可能需要保留笔记本或文件笔记你学到的东西,并不是所有的命令都会在第一次清楚。 (在这种情况下,请更改命令的参数并重试)首先学习在原始二进制中进行数学运算可能是个好主意。
      【解决方案3】:

      指令集手册非常有用,并且假设您对计算机硬件架构有一定程度的了解。以下是一些示例文档:

      ARM:http://simplemachines.it/doc/arm_inst.pdf

      英特尔:http://www.intel.com/content/dam/doc/manual/64-ia-32-architectures-software-developer-vol-1-2a-2b-3a-3b-manual.pdf

      SPARC V9:http://www.sparc.com/standards/SPARCV9.pdf

      【讨论】:

      • 感谢您的帮助。这也很有价值。
      【解决方案4】:

      好吧,作为一个从二进制时代就开始这样做的老黑客:-)

      让我试着让它更具可读性。

      你描述的二进制就是所谓的机器码。

      为了更进一步,CPU 被硬编码以响应某些指令,例如(请注意,我目前没有任何参考资料)

      6502 机器代码中的值 A9 表示 LDA(在其他架构上这可能意味着不同)

      所以,如果你在 6502 CPU 上工作,那么序列 A920 意味着用十六进制值 0f 0x20 加载累加器。

      根据所讨论的 CPU 以及指令集的编码方式,数字中的不同位将导致 CPU(本质上是纯逻辑)执行不同的操作。

      并且,根据制造商的规格,不同的位位置指定每个操作是什么。

      例如,在 arm 处理器中,位 30 和 31 是分支说明符,而在 6502 中,它们是零页内存指示符。

      基本上,二进制指令特定于所讨论的 CPU,并且通常不能移植到另一个 CPU(或任何其他智能硅设备),因此移植和编写软件通常是一项非常困难的任务,除非你有非常深入了解您的编程芯片。

      除非你为英特尔这样的公司或芯片生产商工作,否则现在真的没有必要了解这些东西。但是,如果您是一个速度瘾君子,喜欢击打金属并榨取最后一滴性能,那么您仍然可以获得执行此类编程的工具。

      【讨论】:

        【解决方案5】:

        很好的答案。我只想为使用 linux 的人添加一个简单的脚本,它显示任何指令的二进制表示。您需要一份 NASM(但您可以轻松地对其进行编辑,以便它使用 GAS 或任何其他汇编程序)和 objdump:

        echo "$1" > testProgram.asm
        nasm testProgram.asm -o testProgram.out -f elf -g
        chmod 744 testProgram.out
        objdump ./testProgram.out -d -M intel | grep ' 0:'
        rm testProgram.out testProgram.asm
        

        这里有一些例子:

        blackbear@blackbear-laptop:~$ ./viewOpcode.sh "add ecx, 5"
           0:   81 c1 05 00 00 00       add    ecx,0x5
        blackbear@blackbear-laptop:~$ ./viewOpcode.sh "int 0x80"
           0:   cd 80                   int    0x80
        blackbear@blackbear-laptop:~$ ./viewOpcode.sh "fmul st0, st1"
           0:   d8 c9                   fmul   st,st(1)
        blackbear@blackbear-laptop:~$ ./viewOpcode.sh "andps xmm0, xmm1"
           0:   0f 54 c1                andps  xmm0,xmm1
        blackbear@blackbear-laptop:~$ ./viewOpcode.sh "movntq [edi], mm0"
           0:   0f e7 07                movntq QWORD PTR [edi],mm0
        blackbear@blackbear-laptop:~$ 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-17
          • 2012-08-24
          • 2011-09-18
          • 1970-01-01
          • 2020-06-01
          • 1970-01-01
          相关资源
          最近更新 更多