《程序是怎么跑起来的》读书笔记(10)-- 汇编语言让你知道真正的程序是什么

汇编语言和本地代码是一一对应的

计算机cpu能直接解释运行的只有本地代码程序,用c语言编写的源代码,需要通过各自的编译器编译后,转换成本地代码
但是如果直接打开本地代码只能看到数字的罗列,如果直接使用这些数值来进行编写程序,因为就产生了一种想法,那就是在本地代码中,附带上表示其功能的英语单词缩写

例如,加法运算add,比较运算cmp,这些缩写被称为助记符,使用助记符的语言被称为汇编语言。
即使是汇编语言编写的源代码,也需要转换成本地代码才能运行,负责转化工作的叫做汇编器。
本地代码也可以反过来转换成汇编语言的源代码,这种叫做反汇编程序。

c语言和本地代码并不是一一对应的,所以很难对c语言的源代码进行反编译,完全还原到原始的源代码是不太可能的。
反编译和反汇编被叫做反向工程。

汇编语言的语法是操作码+操作数

操作码是指令动作,操作数是指令动作,操作数是指令对象。
操作码相当于动词,操作数相当于宾语。至于操作码是什么样的,这是有cpu决定的。
intel的cpu包含各种计算的存储的寄存器。

java 堆内存heap和栈内存stack

栈是存储临时数据的区域,通过push和pop指令进行数据的存储和读出。
用java的数组举例子:
实际的数组对象实际被存储在堆内存中,如果引用该数组对象的数组引用变量是一个局部变量,那么会被存储在栈内存

当一个方法执行时,每个方法都会建立自己的内存栈,方法里定义的变量会被逐个放入栈内存里,方法执行结束,内存栈也被自然销毁。
但是创建对象会被放在heap中,以便于反复利用,堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象可能被另一个引用变量所引用,这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的来记回收器才会在合适的时候回收他。

请牢记:
当定义并初始化一个数组后,在内存中分配了两个空间,一个用于存放数组的引用变量stack,一个用于存放数组本身heap

发表评论

电子邮件地址不会被公开。