全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
这一次的笔记主要是梳理一个例程以及部分辅助信息。
为什么要学习汇编语言呢?现在的高级语言开发效率高,而且有着不错的效率,是不是学习汇编的意义完全没了呢?并非如此。第一,很多时候汇编写出来的程序短小精悍,资源占用更少而且效率高。第二,很多的硬件访问有一定的限制,必须使用汇编才可以访问。这种情况,在我接触到的嵌入式软件开发中就经常遇到。第三,学习汇编语言其实可以让我们更好地理解计算机的架构。第四,汇编语言可以让我们更好理解编译器以及高级语言的运行机理。
因此,大多数时候,我们需要学习的是其中的思想而不是单纯的一个工具。
单纯的程序解读其实很容易理解,这个程序看上去行数不少,其实都是调用,因此理解难度不大。不过,为什么要有一个push a以及pop a的操作,这个我还是没能理解。暂且不去关注过多的小结,后续肯定能够水落石出。
接下来,比较有整理价值的就是开发编译环境的搭建以及编译运行效果了。工具用到的是NASM,在ubuntu中的安装比较简单:
sudo apt-get install nasm
源代码以及书中说明的编译构建方式也不是很完善,接下来我把我自己的编译过程整理出来。
由于编译测试可能反复,我先构建了一个简单的makefile用来控制编译过程。这里的第5行需要格外注意,如果没有-d ELF_TYPE会导致链接失败。出现如下提示:
我在网络上搜索这样的提示,其实是没有找到准确的解决方案的。但是这个提示很明确,要么是少了一个库文件导致找不到这样的函数,要么是某一个文件少链接了。我首先怀疑的是后者,而工程涉及到的文件不多也就可以逐个去排查。
在这个代码文件中看到了说明,而这时候我似乎才意识到其实DJGPP可能是一个OS之类的运行平台。而这个,则是书中提到的用法。
找了网络上的信息如上,djgpp是DOS环境下的C语言开发环境,包含了一些GNU套件。
编译选项按照上面修改之后,编译运行就比较顺利了。
从上面的截图中可以看到很多与前面的文档中截取描述相关的信息。
从相关的另一个代码文件可以看得出来,其实这段汇编代码是从C语言的main函数中调用运行的。
代码做如上修改,进行测试依然可以编译通过并且正常运行。