函数如何编码/存储在内存中?

时间:2014-08-15 23:58:38

标签: function memory encoding architecture computer-architecture

我理解数字和字母之类的东西是用二进制编码的,因此可以存储为0和1。

但是如何将函数存储在内存中?我不知道如何将它们存储为0和1,我也不知道如何将某些东西存储在内存中除了0和1以外的任何东西#39; S

2 个答案:

答案 0 :(得分:15)

事实上,它们作为0和1

存储在内存中

这是一个真实世界的例子:

int func(int a, int b) {
    return (a + b);
}

以下是编译器可能为该函数生成的32位x86机器指令的示例(以称为代码的文本表示形式):

func:
        push    ebp
        mov     ebp, esp
        mov     edx, [ebp+8]
        mov     eax, [ebp+12]
        add     eax, edx
        pop     ebp
        ret

了解每个指令的工作方式超出了本问题的范围,但这些符号中的每一个(例如add,pop,mov等)及其参数都被编码为1&0; s和0&# 39; S。 This table显示了许多英特尔指令以及它们如何编码的摘要。另请参阅标记wiki以获取文档/指南/手册的链接。


那么如何将代码从文本汇编转换为机器可读字节(又称机器代码)呢?例如,指令add eax, edxThis page显示了如何编码add指令。 eax edx 是一种称为寄存器的东西,处理器中用于保存信息以进行处理的物理点。计算机编程中的变量通常会在某些时候映射到寄存器。因为我们正在添加寄存器并且寄存器是32位,所以我们选择操作码000000001(另请参阅英特尔的官方instruction-set reference manual entry for ADD,其中列出了所有可用的表格)。

下一步是指定操作数。上一页的This section显示了如何使用示例"添加ecx,eax"这与我们自己非常相似。前两位必须是' 11'显示我们正在添加寄存器。接下来的3位指定第一个寄存器,在我们的例子中,我们选择 edx 而不是 eax ,这样就留下了' 100'。接下来的3位指定我们的 eax ,因此我们得到了

的最终结果
00000001 11100000

以十六进制表示的01 D0。可以应用类似的过程将任何指令转换为二进制。用于自动执行此操作的工具称为汇编程序


因此,通过汇编程序运行上面的汇编代码会产生以下输出:

66 55 66 89 E5 66 67 8B 55 O8 66 67 8B 45 0C 66 01 D0 66 5D C3

请注意字符串末尾附近的01 D0,这是我们的"添加"指令。将机器代码字节转换回文本汇编语言助记符称为反汇编:

 address | machine code  |  disassembly
   0:      55              push   ebp
   1:      89 e5           mov    ebp, esp
   3:      8b 55 08        mov    edx, [ebp+0x8]
   6:      8b 45 0c        mov    eax, [ebp+0xc]
   9:      01 d0           add    eax, edx
   b:      5d              pop    ebp
   c:      c3              ret    

地址从零开始,因为它只是.o,而不是链接的二进制文件。因此,他们只是相对于文件.text部分的开头。

你可以在Godbolt Compiler Explorer上看到你喜欢的任何你喜欢的功能(或者你自己的机器上任何二进制文件,新编译或不使用反汇编程序)。


您可能会注意到没有提及名称" func"在最终输出中。这是因为在机器代码中,函数由其在RAM中的位置引用,而不是其名称。编译器输出目标文件在其符号表中可能有func条目引用此机器代码块,但符号表由软件读取,而不是CPU硬件可以直接解码和运行的内容。 The bit-patterns of the machine code are seen and decoded directly by transistors in the CPU

有时我们很难理解计算机如何在低级别编码这样的指令,因为作为程序员或高级用户,我们有工具可以避免直接处理它们。我们依靠编译器,汇编器和解释器为我们工作。尽管如此,计算机所做的任何事情最终都必须在机器代码中指定。

编辑:解释从指令到操作码的精确转换过程。

答案 1 :(得分:0)

功能由指令组成,例如bytecodemachine code。指令是数字,可以二进制编码。

对此的一个很好的介绍是Charles Petzold的书Code

相关问题