汇编语言(第三版)---王爽 读书笔记
自己作为一位码农,自知对计算机内部的运行了解不大理解,好奇心和压力驱试着想要了解更多。之前在了解libco原理时,了解到libco在做协程上下文切换时用的是汇编语言去编写,协程切换就是当前运行CPU的上下文切换,但是自己不大明白为什么只做CPU上下文切换就可以完成协程切换。由于之前在学校时汇编语言和微机原理等没有认真学习,自己对这些知识一知半解。基于这个契机就打算重新找一本汇编语言的书籍进行学习,加深自己对计算机内部的了解。网上对王爽的"汇编语言(第三版)"评价比较高,故选择了此书籍进行学习。
汇编语言第三版介绍的是8086CPU的汇编指令知识,8086于1978年设计,距今已超过了40年,现在CPU的汇编指令肯定是比8086复杂不少,不过对于想了解基本的汇编语言及其思想,简洁的8086可能更利于我们这种刚入门汇编语言领域的人,后续可以在此基础上继续学习现代的汇编语言。所有程序最终都是通过机器码来执行,而现实中大多数的编程都是用高级语言,汇编语言设计(CPU设计)最终都是为了方便高级语言能够更方便转换成汇编语言并高效执行。下文记录对本书知识的整理。
8086CPU可对三个地方的数据进行读写,分别是CPU内部寄存器、内存单元、端口。对于内存单元,CPU会将系统中各类存储逻辑器看做一个统一的逻辑存储器,对并内存地址空间进行分段,每段对应不同的存储器(比如主存储器地址空间、显存地址空间、显卡BIOS ROM地址空间等).端口是指跟CPU总线相连的芯片(处了存储器)的寻址方式,8086共有65536个端口,对于端口的指令只有in和out指令.
8086地址总线有20位,寄存器(数据总线)是16位的,需要两个寄存器才能定位到一个内存地址,其中一位是段地址。另外一位便是偏移地址.
8086中有多种段寄存器(代码段、栈段、数据段等),我们可以按照数据段、代码段、栈段的方式来组织程序的运行。
模块化程序设计支持,call指令把当前的IP或CP和IP压入栈中,并实现程序的转移。ret和retf指令则是call指令的方向操作,跳转到栈中的IP或CS和IP。程序跳转之前,需把相应的寄存器内容保留起来,调用之后得把之前寄存器的内容进行恢复。
标志寄存器是一种特殊寄存器,主要有三种作用: 1). 用来存储相关指令的某些执行结果,比如ZF标志位代表指令执行的结果是否为0. 2)用来为CPU执行相关指令提供行为依据. df=0时每次操作后si、di递增,反之则递减. 3)用来控制CPU相关工作方式. 比如
CPU在执行完当前正在执行的指令之后,检测到CPU外部发送过来或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理,这种特殊的信息称为中断信息。中断码代表中断信息的类型,中断向量表则是存储中断码对应的中断程序的CS和IP。中断过程如下: 1). 取得中断类型码. 2). 标志寄存器入栈. 3). 设置标志寄存器的第8位TF和第9位IF值为0. 4). CS内容入栈. 5). IP内容入栈. 6)从内存地址为中断类型码 * 4和中断类型码 * 4 + 2的两个字单元中读取中断处理程序的入口地址设置IP和CS. 内中断包括除法错误、单步执行等。外中断是指CPU外部有需要处理的事情发生(比如外设输入到达),相关芯片向CPU发出相应的中断信息,CPU在执行当前的指令后可检测到中断信息并引发中断过程.
浙公网安备 33010602011771号