基本的汇编语言语法
汇编语言、本地语言与源代码关系
内存与程序的关系
CPU的执行特性
函数执行的时候执行的方式,参数,返回值,栈清理等
第一章对CPU做了一个概要的介绍。
-
CPU负责的就是解释和运行最终转换成机器语言的程序内容
-
CPU能直接识别和执行的只有机器语言(汇编语言和机器语言是一一对应的)。汇编语言使用助记符这样对人类友好
-
CPU和内存是由许多晶体管组成的电子部件,通常称为IC集成电路
-
CPU通常可以分成:寄存器、控制器、运算器和时钟
-
寄存器可以用来暂存指令、数据等处理对象
-
控制器负责把内存上的指令、数据等读入寄存器,并根据指令的执行结果来控制整个计算机
-
运算器负责运算从内存读入寄存器的数据
-
时钟负责发出CPU开始计时的时钟信号
-
不同CPU其构造、内部寄存器等的种类数量,数值范围都是不同的
-
不同平台的CPU可能需要不同的编译器,其能解释的机器语言种类也不同
-
内存是通过一个个的引脚模拟二进制进行数据存取的
-
数据类型(char、int...)其实是表示了在内存中如何占据内存的,通过制定书籍类型,也就实现以特定字节数为单位来进行读写
-
数据的删除并不见得数据就真正被抹除了,实际上常常仅仅是“逻辑”上被删除了
-
磁盘中存储的程序,必须要加载到内存后才能运行。这是因为CPU需要通过程序计数器来读取内存地址。同时,磁盘速度慢
-
磁盘缓存是把磁盘中数据存储到内存中的方式
-
虚拟内存把磁盘的一部分假想为内存。但由于CPU实际能执行的还是内存中数据,所以在真正运行的那个时间点上,数据还是需要被swap到内存中来。
-
虚拟内存通常分:分页、分段式。WIN用分页
-
WIN的分页大小是4KB
-
很多时候程序执行过程中看到硬盘灯一直在闪,可能就是因为在进行SWAP
-
扇区是对磁盘进行物理读写的最小单位
-
Win在逻辑方面对磁盘进行读写的单位是扇区的整数倍簇。
-
不同的的文件是不能存储在同一个簇中的。不管多么小的文件都会占用一簇的空间。这样看起来好像会有些浪费,但这其实也存在存取速度,处理机制等有影响
-
操作系统把硬件的管理抽象化,程序员就可以不用注意和硬件交流的不同区别,比如文件是操作系统对磁盘空间的抽象
-
驱动程序提供了同硬件进行基本输入输出的功能
-
Java虚拟机会把字节码变换成CPU适用的本地代码
-
BIOS(Basic input/output system)会确认硬件是否正常运行。没问题的话引导程序会把在硬盘等记录的OS加载到内存中运行
-
静态链接:static link,表示内存中会同时存在一个函数的多个备份
-
动态链接:Dynamic Link,则是共享的
-
DLL通常由.lib的导入库和实际的DLL文件组成
-
可执行文件中并没有指定变量和函数的实际内存地址,而是分配的虚拟的内存地址,在程序运行时候会转换成实际的内存地址。链接器会在EXE文件的开头追加转换内存地址所需的必要信息,这个信息称为再配置信息
-
再配置信息成为了变量和函数的相对地址。相对地址表示的是相对于基点地址的偏移量。
-
各变量的内存地址就可以用相对于变量组起始位置的基点偏移量来表示;各函数。。。
-
各组(再配置信息、变量组、函数组)基点地址是在程序运行时分配的
-
此外,当程序加载后还会额外产生两个组,堆和栈
-
因此内存中的程序就是由:用于变量的内存、用于函数的内存、堆、栈的内存(不考虑系统加载所需)
-
栈中队数据进行存储和清理的代码是由编译器自动生成的,不需要程序员参与
-
栈清理:函数调用完后需要执行栈清理操作,该命令是在程序编译时候由编译器自动附加到程序中的。编译器默认将处理附加在函数调用方。这样就会导致清理部分的代码会重复出现在函数调用处。通过_stdcall:可以将这个操作放到被调用函数方,节省一点内存
-
函数的返回值是通过寄存器而非栈来返回的,参数是通过栈传递
-
程序启动后,根据时钟信号,控制器会从内存中读取指令和数据。通过对这些指令加以解释和执行,运算器就会对数据进行运算,控制器根据该运算结果来控制计算机(其实控制通常指:书籍运算外的处理比如输入输出、显示等)
-
机器语言级别的程序是通过寄存器来处理的
(通过汇编程序可以看出:)
mov eax, dword ptr [pbp - 8]
add eax, dword ptr [ebp -0Ch]
-
通过汇编语言描述程序,在多线程处理中,其中每处理一行都可能在下一个运行就切换到其他线程(函数)中
-
程序运行时,操作系统会把程序加载到内存中,同时将程序计数器(寄存器的一种)设定为程序的起始位置,程序运行中,CPU每执行一个指令,程序计数器的值就会自动加1.(如果有if、while等就可能不是+1了,可能是任意值)
-
控制器会根据程序计数器的数值,从内存中读取命令并执行。也就是说,程序计数器决定着程序的流程
-
机器语言的程序称为本地代码,计算机只能运行本地代码
-
编译器可以把源代码转换成本地代码
-
编译器除去和编程语言种类,和CPU类型也有关
-
编译器转换生成的本地文件还需要通过链接来生成可以运行的可执行文件
-
函数的调用处理也是通过把程序计数器的值设定成函数的地址来实现
-
函数的调用需要在完成函数内部的处理后,处理流程再返回到函数的调用点(函数调用指令的下一个地址)
-
call指令会把调用函数后要执行的指令地址存储在名为栈的贮存内
-
return指令会把保存在栈中的地址设定到程序计数器中
-
CPU的处理其实是通过很简单的mov、add、jum等数据转送、运算、跳转、call/return指令完成的
网友评论