读《汇编语言 (第三版) 》

折腾了几天,算是把王爽的《汇编语言 (第三版》差不多看完了。算是做一个小结吧。

这本书是用 8086 指令集来当做教材环境来指导读者来入门汇编语言的。因为古老的缘故,我的编程环境是用 dosbox + masm5.0 来学习的。因为 masm5.0 以上的版本编译汇编代码的时候报了一些很屁股的问题。让我丈二和尚摸不着的感觉,比如用 masm.exe 来编译的时候,回报错需要另一个依赖。于是向来追求新版本的我就去找了一个 masm5.0 来编译,总算是可以了。值得一提的是,我找到的 masm5.0 编译器的最后修改日期是 1996-05-12 。。年迈的编译器。。

不过后来的学习过程中,发现一个很牛逼的东西, emu8086 。这是一个 8086 的模拟器,对汇编代码 debug 能力比 dos 下的反人类 debug.exe 强大多了。懒得贴图了。不过这是收费产品,所以。。。

随便做点总结。

寄存器

14 个寄存器,在 8086 下均为 16 位

  • ax,通用寄存器,一般就是 add,div,mul 等指令的默认的一个数据
  • bx,一般用于基地址的保存,最简单的例子就是保存二维数组的行移动的一个寄存器
  • cx,计数器寄存器,loop,jcxz 等循环指令的计数器
  • dx,数据寄存器
  • si,变址寄存器,同时也有一个 source 地址的用法。
  • di,变址寄存器,同时也有一个 destination 地址的用法
  • ss, (stack segment) 栈的段地址寄存器,
  • sp,栈的偏移地址寄存器
  • cs, (code segment) 代码段寄存器,当前执行代码的段地址
  • ip,当前执行代码的偏移地址寄存器
  • ds, (data segment)数据段的段地址寄存器
  • bp,数据段的偏移地址寄存器
  • es, (extra segment) 附加段寄存器
  • pwd,程序状态字,标志寄存器。某些位代表当前程序的某一个状态。

很显然,8086 这种 16 位机器下这 14 个寄存器的用法以后也用不到,现在的机器寄存器也远不止 14 个。

最最基本的数据结构,cpu 很多操作都是利用栈来实现。

寻址

寻址是程序最简单要实现的逻辑,汇编语言中对数据的存储和寻找让我理解数据在程序中到底是怎么存储和执行的。这些底层的具体实现还是挺搞笑的我感觉。。

中断

中断的部分还真给我很多茅塞顿开的感觉。。终于让我知道我之前 debug 的时候发生那么多奇怪的东西是为什么了。。比如初始化栈的时候,mov sp,0 这条语句直接被跳过了。。。还有 debug 中断的时候,栈空间的值的变化。。还有某些时候 debug 的时候并不是程序实际执行结果。。等等。

中断的设计是一个很 tricky 的设计阿。真的非常秀。

call和ret

这两个指令真的比较重要,所以特地记一下。就是各种调用的原理吧。也是栈的原理。

标志寄存器

很 tricky 很 tricky 的东西。

小结

这 5 个东西给我的感觉就是这本《汇编语言》要表达的比较重要的东西。作者也说了,就是通过对底层编程的体验来了解底层的一些东西,并不是真的要让读者用汇编代码来编写程序,要是真用汇编来写程序,除了一些不得已的领域,有点反人类。。

总的来说呢,这本书给我感受就是使用汇编,了解底层,对高级语言和程序的一些具体实现还是有比较深的感受的。