2011-11-04 56 views
4

我在互联网上搜索了二进制编程,人们似乎愿意给出的唯一答案是:“为什么要在二进制中编程?” “这很愚蠢,使用组装。” “没有什么可以摆脱的,学习没有意义。”二进制编程的资源

如果你是这些人之一,我感谢你的意见,但它不回答我的问题。

虽然我不上实际上是试图以二进制的计划我的理由知道打算是:

  1. 我在明知装配命令后面的二进制指令的兴趣。

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

这样说,有没有人知道任何资源可以学习二进制编程?

回答

6

通常情况下,汇编指令和机器代码(你称之为二进制)之间有一对一的映射关系。您可以在指令集体系结构文档中找到这些映射,了解您所关心的任何机器。流行的例子:

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

你就可以找到任何一个建筑,你要使用一个类似的文件。您可以使用这些手册中的信息来解码给定程序的机器指令,并确定它们是如何从汇编源生成的,或者可以根据需要手动组装自己的程序。

+0

谢谢你的信息,这绝对有价值! – Thallios

+0

@Thallios,祝你好运! –

2

这里就是我所做的学习二进制: 1.打开命令提示符,输入“调试“作为命令。

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

请注意,要编程实际的二进制文件,你需要一个十六进制编辑器。下面是我使用的一个:

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

另一个想法,我做学习更复杂的语言(如C++)是一样做组装,但在十六进制编辑器打开它。

+0

我感谢您的帮助。这绝对有用。 – Thallios

+0

谢谢,这是我知道要学习的最快的方式,也是学习需要学习的命令的最准确,最具体的方法,尽管您可能需要保留一个笔记本或文件记录您学习的内容,并不是所有的命令都会第一次清除。(在这种情况下,更改命令的参数,然后再试一次)并且学习以原始二进制数学方式进行数学可能是一个好主意。 – JAW1025

1

好吧,作为一个老黑客,因为二进制:-)的日子谁一直在做这个

让我尽量让这个有点更具可读性。

您描述的二进制文件就是所谓的机器码。

借此更进一步,CPU的是硬编码到特定的指令作出反应,作为一个例子(一个请注意我没有任何引用此刻手)

值A9在6502机代码意味着LDA(在其他体系结构上,这可能意味着不同)

因此,如果您在6502 CPU上工作,那么序列A920将意味着以十六进制值0f 0x20加载累​​加器。

根据所讨论的CPU以及指令集是如何编码的,数字中的不同位将导致CPU(它是纯粹的逻辑核心)执行不同的操作。

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

例如,在arm处理器中,位分支说明符,其中在6502中它们是零页存储器指示符。

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

除非你在像intel这样的公司工作,或者芯片生产商那么现在真的不需要知道这些东西。然而,如果你喜欢打击金属并挤压每一次性能的速度迷,那么你仍然可以使用这些工具来做这种编程。

1

重要的答案。我只是想为使用linux的人添加一个简单的脚本,它显示任何指令的二进制表示。你需要NASM的副本(但是,以便它使用煤气或任何其他汇编,你可以很容易地编辑)和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 

下面是一些例子:

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