汇编语言(第二版) 笔记
文章平均质量分 65
canmeng
我热爱技术。
展开
-
第12章 内中断 笔记
P238 可以用中断类型码,在中断向量表中找到中断处理程序的入口。找到这个入口地址的最终目的是用它设置CS和IP,使CPU执行中断处理程序。用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。CPU硬件完成这个工作的过程被称为中断过程。 CPU收到中断消息后,要对中断消息进行处理,首先将引发中断过程。硬件在完成中断过程后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序。 下面是8086CPU在受到中断消息后,所引发的中断过程:(原创 2011-05-10 21:59:00 · 649 阅读 · 0 评论 -
第5章 [BX]和loop指令 笔记
P95 要完整地描述一个内存单元,需要两种信息:1.内存单元的地址;2.内存单元的长度(类型)。 为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号“()”来标识一个寄存器中的内容或一个内存单元中的内容。P96 注意,“()”中的元素可以有3中类型:1.寄存器名;2.段寄存器名;3.内存单元的物理地址(一个20位数据)。 “(X)”所表示的数据有两种类型:1.字节;2.字。P99 loop指令的格式为:loop 标号,CPU执行loop指令的时候,要进行两步操作,1.(cx原创 2011-05-03 23:17:00 · 541 阅读 · 0 评论 -
第4章 第一个程序 笔记
P77 可执行文件包括两部分内容:1.程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据);2.相关的描述信息(比如,程序有多大,要占用多少内存空间等)。P79 注意,以后可以将源程序文件中的所有内容成为源程序,将源程序中最终由计算机执行、处理的指令或数据,成为程序。P91 为了观察程序的运行过程,可以使用debug。debug可以将程序加载入内存,设置CS:IP指向程序的入口,但debug并不放弃对CPU的控制,这样,我们就可以使用debug的相关命令来单步执行程序,查看每一条指令的执原创 2011-05-02 22:11:00 · 409 阅读 · 0 评论 -
第6章 包含多个段的程序 笔记
P123 程序取得所需空间的方法有两种:一是在加载程序的时候为程序分配;二是在程序执行的过程中向系统申请。在我们的课程中,不讨论第二种方法。 我们若要一个程序在被加载的时候取得所需的空间,则必须要在源程序中作出说明。我们通过在源程序中定义段来进行内存空间的获取。P126 我们可以在源程序中指明程序的入口所在。 伪指令end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。 在前面的课程中(参见4.8节),我们已经指导在单任务系统中,可执行文件的程原创 2011-05-04 22:21:00 · 454 阅读 · 0 评论 -
第7章 更灵活的定位内存地址的方法 笔记
P139 我们可以在汇编程序中,用'……'的方式指明数据是以字符的形式给出的。编译器将把它们转化成相对应的ASCII码。P152 如果我们比较一下前面用到的几种定位内存地址的方法(可称为寻址方式),就可以发现:(1) [idata]用一个常量来表示地址,可用于直接定位一个内存单元;(2) [bx]用一个变量来表示内存地址,可用于间接定位一个内存单元;(3) [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;(4) [bx+si]用两个变量表示地址;(5) [b原创 2011-05-05 22:10:00 · 528 阅读 · 0 评论 -
第8章 数据处理的两个基本问题 笔记
P161 在8086CPU中,只有4个寄存器bx,si,di和bp可以用在“[……]”中进行内存单元的寻址。 在“[……]”中,这4个寄存器或者单个出现,或只能以4中组合出现:bx和si,bx和di,bp和si,bp和di。P162 只要在[……]中使用寄存器bp,而指令中没有显式地给出段地址,段地址就默认放在ss中。P169 div是除法指令。使用div做除法的时候应注意以下问题:(1) 除数:有8位和16位两种,在一个reg或内存单元中。(2) 被除数:有16位和32位两种,默认放在AX原创 2011-05-07 23:00:00 · 487 阅读 · 0 评论 -
第9章 转移指令的原理 笔记
P175 可以修改IP,或同事修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。 8086CPU的转移行为有以下几类:● 只修改IP时,称为段内转移,比如 jmp ax● 同时修改CS和IP时,称为段间转移,比如 jmp 1000:0 由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。● 短转移IP的修改范围为-128~127。● 近转移IP的修改范围为-32768~32767。 8086CPU的原创 2011-05-08 09:08:00 · 531 阅读 · 0 评论 -
第10章 CALL和RET指令 笔记
P190 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。 ret指令用栈中的数据,修改IP的内容,从而实现近转移; CPU执行ret指令时,相当于进行: pop IP。 retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。 CPU执行retf指令时,相当于进行: pop IP pop CSP199 mul是乘法指令,使用mul做乘法的时候,注意以下两点:原创 2011-05-08 11:52:00 · 646 阅读 · 0 评论 -
第10章 CALL和RET指令 课程设计一
第10章的课程设计一是比较难的。我以前也做出来过,这次再做,也花了一个下午加一个晚上的时间。还是自己功力不行啊。平时多多练习多多编程还是正道。下面是今天晚上该搞定的代码:assume cs:codesgdata segment db '1975','1976','1977','1978','1979','1980','1981','1982','1983' db '1984','1985','1986','1987','1988','1989','1990','1991','199原创 2011-05-08 22:16:00 · 524 阅读 · 0 评论 -
第1章 基础知识 笔记
P4 磁盘不同于内存,磁盘上的数据或程序如果不读到内存中,就无法被CPU使用。P7 8088CPU的数据总线宽度为8,8086CPU的数据总线宽度为16。P8 CPU可以直接使用的信息在存储器(内存)中存放。P9 地址总线的宽度决定了CPU的寻址能力; 数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量; 控制总线的宽度决定了CPU对系统中其它器件的控制能力。原创 2011-05-02 16:07:00 · 403 阅读 · 0 评论 -
第3章 寄存器(内存访问) 笔记
P47 字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。P48 任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可看成一个地址为N的字单元的高位字节单元和低位字节单元。P49 8086CPU不支持将数据直接送入段寄存器的操作。为什么8086CPU不支持将数据直接送入段寄存器的操作?这属于8086CPU硬件设计的问题,我们只要知道这一点就行了。P57 8086CPU的原创 2011-05-02 21:55:00 · 513 阅读 · 0 评论 -
第11章 标志寄存器 笔记
P213 在CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同)具有以下3种作用:(1) 用来存储相关指令的某些执行结果;(2)用来为CPU执行相关指令提供行为依据;(3)用来控制CPU的相关工作方式。 这种特殊的寄存器在8086CPU中,被称为标志寄存器。P233 pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标识寄存器。pushf和popf,为直接访问标志寄存器提供了一种方法。P234 编写子程序,代码如下:assume cs:co原创 2011-05-09 22:16:00 · 740 阅读 · 0 评论 -
第13章 int指令 笔记
<br />P252 CPU执行int n指令,相当于引发一个n号中断的中断过程。<br />P254 int指令和iret指令的配合使用与call和ret指令的配合使用具有相似的思路。<br />P259 一般来说,一个供程序员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序。BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号。<br />P262 实验13 编写、应用中断例程。(书里都有例子的,比较简单,就不写程序了)原创 2011-05-11 22:32:00 · 605 阅读 · 0 评论 -
第14章 端口 笔记
P265 CPU可以直接读写以下3个地方的数据:(1) CPU内部的寄存器;(2) 内存单元;(3) 端口。 在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,所以端口地址和内存地址一样,通过地址总线来传送。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口地址的范围是0~65535。 对端口的读写不能用mov,push,pop等内存读写指令。端口的读写指令只有两条:in和out,分别用于从端口读取数据和往端口写入数据。P266 注原创 2011-05-12 22:38:00 · 603 阅读 · 0 评论 -
第15章 外中断 笔记
P272 PC系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干寄存器,CPU将这些寄存器当作端口来访问。 外设的输入不直接送入内存和CPU,而是送入相关的接口芯片的端口中;CPU向外设的输出也不是直接送入外设,而是先送入到端口中,再由相关的芯片送到外设。CPU还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。 可见,CPU通过端口和外部设备进行联系。P274 一般将按下一个键时产生的扫描码称为通码原创 2011-05-13 21:51:00 · 458 阅读 · 0 评论 -
第16章 直接定址表 笔记
P289 数据标号标记了存储数据的单元的地址和长度。它不同于仅仅表示地址的地址标号。P290 注意:在后面加有":"的地址标号,只能在代码段中使用,不能在其它段中使用。P295 在上面的两个子程序中,我们将 通过给出的数据进行计算或比较而得到结果的问题,转化为用给出的数据作为查表的数据,通过查表得到问题的结果。具体的查表方法,是用查表的依据数据,直接计算出所要查找的元素在表中的位置。像这种可以通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表。P299 实验16 编写包含多个功能子程序的原创 2011-05-14 21:22:00 · 547 阅读 · 0 评论 -
第17章 使用BIOS进行键盘输入和磁盘读写
P302 键盘输入将引发9号中断,BIOS提供了 int 9 中断例程。P303 BIOS的 int 9 中断例程和 int 16h 中断例程是一对相互配合的程序,int 9 中断例程向键盘缓冲区中写入,int 16h 中断例程从缓冲区中读出。它们写入和读出的实际不同,int 9 中断例程是在有键按下的时候想键盘缓冲区中写入数据;而 int 16h 中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。原创 2011-05-15 23:25:00 · 770 阅读 · 1 评论 -
第17章 使用BIOS进行键盘输入和磁盘读写 笔记2
<br />上次只实现了向软盘中写数据。今天要实现向软盘中读取数据。今天晚上回来后看了会儿小说,就开始调试程序了。我上次是使用Virtual PC 2007进行实验的,但是发现Virtual PC 2007有一点小问题。今天就使用的是bochs。调试许久,终于出来了。真高兴啊。实验代码如下面:<br />assume cs:codedata segmentdw 256 dup (1324h)data endscode segmentint7ch: jmp short beg原创 2011-05-18 00:47:00 · 607 阅读 · 0 评论 -
第2章 寄存器 笔记
P14 8086CPU有14个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 8086CPU的所有寄存器都是16位的,可以存放两个字节。 8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上,8086CPU的AX、BX、CX、DX这4个寄存器都可分为两个可独立使用的8位寄存器来用。P16 处于兼容性的考虑,8086CPU可以一次原创 2011-05-02 17:09:00 · 666 阅读 · 0 评论 -
引用 写给想用汇编优化程序的程序员朋友们
我是引用别人的文章,但是也谈一点自己的看法。我有些观点是与作者不同的。1. 在现在的这个时代,学习汇编的主要目地是能读得懂汇率代码,这对于理解系统底层的工作机制有好处,而了解底层的软件工程师更易于写出高效的代码。2.编译理论已经发展几十年,想用汇编来优化代码运行速转载 2011-08-10 21:02:16 · 3136 阅读 · 0 评论