读《程序是怎么跑起来的》第10章

本地代码的指令中,表示其功能的英语缩写称为助记符;汇编语言的源代码转换成本地代码的方式称为汇编;本地代码转换成汇编语言的源代码的方式称为反汇编;汇编语言的源文件的扩展名,通常是.asm格式;汇编语言程序中的段定义指的是构成程序的命令和数据的集合组;汇编语言的跳转指令,是将程序流程跳转到其他地址时需要用到该指令。使用助记符的编程语言称为汇编语言。不过,即使是用汇编语言编写的源代码,最终也必须要转换成本地代码才能运行。负责转换工作的程序称为汇编器,转换这一处理本身称为汇编。在源代码转换成本地代码这个功能方面,汇编器和编译器是同样的。用汇编语言编写的源代码,和本地代码是一一对应的。因而,本地代码也可以反过来转换成汇编语言的源代码。持有该功能的逆变换程序称为反汇编程序,逆变换程序称为反汇编程序,逆变换这一处理本身称为反汇编。

汇编语言的源代码,是由转换成本地代码的指令(后面讲述的操作码)和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。不过伪指令本身是无法汇编转换成本地代码的。由伪指令segmentends围起来的部分,是给构成程序的命令和数据的集合体加上一个名字而得到的,称为段定义。段定义的英文表达segment具有“区域”的意思。在程序中,段定义指的是命令和数据等程序的集合体的意思。一个程序由多个段定义构成。即使在源代码中指令和数据是混杂编写的,经过编译或者汇编后,也会转换成段定义划分整齐的本地代码。汇编语言指令的语法结构是操作码+操作数(也存在只有操作码没有操作数的指令)。操作码表示的是指令动作,操作数表示的是指令对象。操作码和操作数罗列在一起的语法,就是一个英文的指令文本。

 

指令中最常使用的是对寄存器和内存进行数据存储的mov指令。mov指令的两个操作数,分别用来指定数据的存储地和读出源。程序运行时,会在内存上申请分配一个称为栈的数据空间。栈有“干草堆积如山”的意思。就如该名称所表示的那样,数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺序进行。栈是存储临时数据的区域,它的特点是通过push指令和pop指令进行数据的存储和读出。往栈中存储数据称为“入栈”,从栈中读出数据称为“出栈”。32x86系列的CPU中,进行1pushpop,即处理32位(4字节)的数据。函数的参数是通过栈来传递,返回值是通过寄存器来返回的。函数内部利用的栈,在函数处理后会恢复到初始状态,因此局部变量的值也就被销毁了,而寄存器也可能会被用于其他目的。因此,局部变量只是在函数处理运行期间临时存储在寄存器和栈上。在汇编语言这一领域,如果不使用jmp指令,就无法实现循环和条件分支。

 

posted on 2019-03-28 21:51  笠侹凯树  阅读(109)  评论(0编辑  收藏  举报

导航