通过阅读程序《程序是怎样跑起来的》第10章,我对于汇编语言的知识有了一定的了解。通过阅读,我认为汇编语言是介于程序员所编写的高级语言和CPU能读懂的机器语言之间的以供深入了解计算机运行原理,同时可以直观看到程序运行问题所在的语言。因为汇编语言是为机器语言添加助记符,如此可以让程序员读懂本地代码的含义。但CPU终归只认识机器语言,因此汇编语言依然需要转变为本地代码,这一过程叫做汇编,相反本地代码转为汇编语言就叫做反汇编了。汇编/反汇编这一过程是通过汇编器(程序)进行的,但是汇编语言转变为本地代码的过程也并非容易的,这一过程需要提供转变为本地代码的指令与解读(构造、方法)汇编语言的伪指令提供给汇编器进行汇编,而高级语言到汇编语言的过程是通过高级语言的编译器来实现的,至此三者关系清晰明了。
其中汇编语言也有其固定的的语法格式:操作码+操作数。如书中所例:Give me money中Give就是操作码,me和money就是操作数。当然汇编语言的操作码也是专有字符的,如mov、and、push、pop、call、ret。他们各有自己功能,就像push和pop是将数据读入和读出内存,而这个内存是指的栈。栈在前几章中多次提到,他是存储临时数据的空间,因此就是通过push/pop特殊语法来将数据读入/读出。并且读入和读出的数据是由寄存器指定的地址。在一些具有全局变量和局部变量的程序中,汇编语言会将不同的变量分为不同的段落,并且有各自的伪指令。
但是栈的功能不止于此,在第一章提到调用函数就需要栈来帮助,因为在调用函数之后,寄存器不会返回到接下来应该进行处理数据的地址,因此在函数的入口是将需要处理的数据push进栈-call调用函数-在函数的出口时将数据pop出栈-ret返回到需要调用的地址。如此就解决了调用函数的问题。并且函数的参数是由栈来传递的,函数的返回值是由寄存器来返回的。
在处理循环和条件这类情况的时候,汇编语言使用的是jmp跳转指令,跳转到初始条件,但这一过程中会使用mov指令将寄存器的值改变,具体情况根据每个程序的迭代条件来定。