代码改变世界

《程序是怎样跑起来的》第十章

2019-03-28 22:29  薛肖肖  阅读(147)  评论(0编辑  收藏  举报

这一章用汇编语言讲述了程序的运行和结构。说实话有点难度,尤其是章详细了解释了很多代码,但是依然觉得好难。

首先我们先来了解汇编语言,汇编语言就是使用助记符的编程语言。本地代码是用十六进制的两位数字来表示的,而汇编语言和本地代码是一一对应的,汇编语言是为了我们读懂本地代码,因为助记符一般都是英文的缩写,比较容易懂得。从汇编语言转换为本地代码称为汇编转换工作由汇编器完成,逆变换依然成立。

大部分C语言编译器都可以将C语言编写的代码转换为汇编语言,然后转换为本地代码,进而使CPU读取C语言编写的代码。但是伪指令是不可能转换为本地代码的,伪指令是把程序的构造及汇编的方法指示给汇编器的,它也是汇编语言的源代码的组成部分(另一部分是转换成本地代码的指令)。就像我们不能运行伪代码一样,伪指令不会成为本地代码因为它是“伪”的,但是我们不能少了它。

汇编语言的语法是“操作码+操作数”。操作码是指令动作,是个动词;操作数是指令对象(指定了寄存器名、内存地址、常数等),毕竟要将对象指定明确;操作码和操作数书上都有介绍,好理解。运行时,CPU会从内存中把指令和数据读出,然后再将其存储在CPU内部寄存器中进行处理;因为CPU内部寄存器比内存运行速度更高。

mov指令是最经常使用的。mov指令是对寄存器和内存进行数据存储的指令;mov指令的两个操作数分别指定数据的存储地和读出源;其中【】引起来的内容会被解释为内存地址,然后会对该内存地址对应的值进行处理。

栈的push(入栈)和pop(出栈2)。push指令和pop指令中只有一个操作数(对象),栈的读写是由栈指针进行的,栈指针会自动更新栈。

函数调用机制。函数会临时储存在栈中,所以函数调用时会使用操作数来进行。函数内部的处理之前会将会恢复到函数调用前的状态,函数自己内部也有寄存器,为内部运行提供了可能。

全局变量的内存空间要始终确保,全局变量是在函数外部定义的变量,被源代码的任意部分使用;局部变量就是函数内部定义的变量了,被函数内部使用,被临时确保。

循环一般是for和if语句来实现的,循环处理要通过跳转语句(jmp一系列的指令),跳到循环的地方去;条件分支也是如此。jmp指令就相当于goto语句。

程序运行的方式。程序运行时可能会出现bug,因为读程序的计算机在将程序编译为本地代码时经过的汇编语言会将相同代码不同意义的语句编译错误,这是我们就要去进行合理的“锁定”,“锁定”就是在特定的范围内处理完成之前,处理不会被切换到其他函数中,在指定区域完成该完成的事情。来减少bug。