《程序是怎样跑起来的》第十章——通过汇编语言了解程序的实际构成
本地代码的指令中,代表其功能的英文缩写称为助记符。
汇编语言的源代码转换为本地代码称为汇编。本地代码转换为汇编语言称为反汇编。
汇编语言的源文件的扩展名为.asm(asm时assembler的缩写)
汇编语言程序的段定义指的是程序的命令和数据的集合组。
汇编语言的跳转语句在讲程序流程跳转到其他地址时需要用到该命令。
在前几章里我们了解到,计算机能直接运行的只有本地代码程序。而本地代码的真面目时罗列的数值集合,为了能容易理解一点,在本地代码中添加上表达其功能的英语缩写,这些缩写就被称为助记符。使用助记符的语言就是汇编语言。这样就可以通过查看汇编语言的源代码了解到程序的本质了,这和查课本地代码的源代码是同一级别的。
但即便是汇编语言也要编译为本地代码之后才能运行。负责转换代码的程序称为汇编器,和编译器时一样的道理。
另外,通过编译器可以输出汇编语言的源代码,汇编语言的源代码,使用转换成本地代码的指令和针对汇编器的伪指令构成的。伪指令负责把程序的构造和会汇编的方法指示给编译器(转换程序),但伪指令本身时没法汇编转换为本地代码的。
如上图,由伪指令segment和ends围起来的部分,是给构成程序的命令和数据的集合体加上名字构成的,称为段定义。一个程序有多个段定义构成。
在汇编语言中一行表示对CPU的一个指令,汇编语言指令的语法结构是操作码+操作数(也存在只有操作码没有操作数的指令)。
操作码表示指令动作,操作数表示指令对象。能使用何种形式的操作码由CPU来决定,如下:
本地代码加载到内存中才能运行。内存中存储着本地代码的指令和数据。CPU读出指令和数据,然后存储在寄存器中处理。
指令中最常使用的是对寄存器和内存进行数据存储的mov指令。mov有两个操作数,分别用来注定数据的存储和读出源。
栈存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累计,读出则反之。栈的push和pop指令只有一个操作数就是push的是什么和pop的是什么,而不需要指定内存地址。这种存储方式就是我们前面章节提到的后入先出LIFO。
最优化功能是编译器在本地代码上费尽工夫实现的目的是让编译后的程序运行速度更快文件更小。函数的参数是通过栈来传递的返回值是通过寄存器来返回的。
C语言中在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。其中全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数数内进行参阅。那么为什么局部变量只能在定义该变量的函数内进行参阅呢?是因为局部变量是临时保存在寄存器和栈中的。
本章后面还有一些对我们学习中的一些东西的理解,描述。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步