汇编语言之80X86机器(参考用书 王爽《汇编语言》(第2版))
整体用于12周中南大学软件学院考试。
考试体系均有:包括判断题、选择题、填空题和编程题。
下面是简单的重点说明:
可供参考的大牛的博客:http://blog.csdn.net/liu1064782986/article/details/7481815
第一章是基础知识,
1.3汇编语言的组成(汇编指令[核心,决定了汇编语言的特性],伪指令,其他符号) 1.7cpu对存储器的读写 这里要注意cpu传送的三种信息,地址信息,控制信息和数据信息 1.8地址总线 CPU通过地址总线来指定存储器单元的。一个cpu有N根地址线,可以说这个CPU的地址总线的宽度为N,这样的CPU最多可以寻找2的N次方个内存单元。 1.9数据总线 CPU与内存或其它器件之间的数据传送是通过数据总线来进行的,它的宽度代表一次能够传送的数据量。8086CPU数据总线宽度为16 1.10控制总线 CPU对外部器件的控制是通过控制总线来进行的。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。 小结:第八页 其他部分为参考部分
第二章是寄存器,
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。简单来说,在CPU内部 运算器进行信息处理;寄存器进行信息储存;控制器控制着各种器件进行工作;内部总线连接各种器件,在他们之间进行数据的传送; 我们在这里的重点关注应该是寄存器部分。 8086CPU有14个寄存器,分别为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW 其中,前四个寄存器称为通用寄存器;cs,ds,es,ss这四个称为段寄存器;psw中存放的是程序状态字,它在8086CPU中也称为标志寄存器(后期学习中简称flag) 注意,只有bx,si,di,bp这四个寄存器可以在[]中使用,代表的含义是数值对应的地址,详细说明在后期使用到时详细说明 通用寄存器是可以拆分的,比如ax可以分为一个高八位ah和一个底八位al,两个寄存器在单独使用时是完全相互独立的,即使有溢出也不会相互影响。 字在寄存器中的储存,8086CPU可以一次性处理以下两种数据,一个是八位的字节,还有一个是16位的字,由两个字节组成,分别称为这个字的高位字节和低位字节。 2.3写一条汇编指令时是不区分大小写的,这里有一个mov指令。 习题是18页的表2.3的分析,因为通用寄存器高八位和低八位是相互独立的,所以即使有一个存在溢出也不会影响到另一个高位寄存器。注意如何计算出结果。 2.4物理地址 每个内存单元都有一个唯一的地址,我们将这个唯一的地址称为物理地址。 首先看16位结构的CPU的局限性,每次仅仅能够处理16位的地址信息。8086CPU因为需要的是一个20位的物理地址信息,所以采用俩个16位的地址合成一个物理地址。16位地址,表现出来的寻址能力只有64kb 地址加法器的计算方法:物理地址=段地址*16+偏移地址; 所以,在划分的时候,段地址对应的地址(段地址*16),一定是16的倍数,在16进制下表现出来的就是一定后面会有一个0,二进制下表现为段地址要向左移动4位。 64kb,这个计算过程要知道是怎么来的,也就是2的16次方,2的10次方是1024字,对应的就是1kb,2的6次方就是64,所以一共就是64kb 2.9段寄存器也就是我们上面讲过的cs(代码段段寄存器),ds(数据段段寄存器),ss(堆栈段段寄存器),es(附加段段寄存器) 2.10cs和ip只要知道,程序在执行时是要通过cs和ip一同确定到代码然后执行即可,每运行一段代码后,对应的ip会自动的偏移。 2.11修改cs,ip指令 注意,mov指令不能用于设置cs和ip的值,因为cpu没有提供这种功能,现在用的最简单的一种方法就是jmp指令具体见课本32页详细说明。 小跳越即64kb以内,如果跳跃的长度超过64kb,则必须使用段间跳跃了 2.12代码段 在编程中总是单独划分出一段充当代码段,用来存放整个程序的。 课本35页小结
第三章:寄存器(内存访问)
3.1内存中字的储存 内存由上到下,地址由低到高。我们将一个字,所用到的低的内存空间的代表是它的地位地址。详细的问题看49页说明。 3.2ds和[address] 倘若我们在直接的使用[]的时候,除某些特别的寄存器外对应的段地址都为ds(eg:bp,它在没有声明是对应的段地址默认为ss) 3.4mov、add、sub指令 3.5数据段和上边的代码段类似,在编程时也会单独的划分出一段来保存数据的空间。 3.6栈 它的特点是FIFO(先进先出) 3.7cpu提供的栈机制:两个操作push和pop(入栈和出栈)他们使用的是ss和sp两个寄存器完成的详细说明可以参考课本59页和63页 3.9栈顶超界问题8086cpu工作机理是当前栈顶在何处、当前要执行的指令是那一条。 3.10栈段注意,一个栈段的最大长度应该是64kb,原理与前边的是一样的 习题:课本70与71 //整个学习过程建议和动手操作编程结合起来,至少要看看课本上边的代码,这样有助于理解记忆 总结:课本54页、67页、69页(段的综述)
第四章:第一个源程序
该部分建议自己按照课本上的进度写一个简单的程序,后进行理解记忆77页开始到81页均有详细介绍。因为考试时会有编程题,所以需要注意每一个细节。尽量是自己将编程的实验完成,至少是要看懂。
第五章:[bx]和loop指令
1、mov al,[bx] ;这里要注意,使用其他的通用寄存器比如ax是不合法的 这条指令的含义是将一个内存单元的内容传入到al中,这个内存单元的长度为1字节,偏移地址为bx,段地址为ds 2、loop有循环的意思,用于控制循环。它是配合着cx寄存器一块使用的 3、()我们定义的描述性的符号eg:(ax)表示ax中的内容(al)表示al中的内容(20000H)表示内存20000H中的内容 ()中的内容可以有三种类型:寄存器名,段寄存器名,内存单元的物理地址 4、约定符号idata表示的是常量 loop和[bx]的联合使用,这个主要是通过程序来体现的 5.6段前缀mov ax,[bx] bx对应的是一个偏移地址,它的段前缀是默认为ds的,当然,也可以写为mov ax,ds:[bx] 或者要将其他段中的数据传递到目标寄存器中就是eg: mov ax,cs:[bx] 5.7一段安全的空间 一般程序都不会使用0:200到0:2ff这段空间的 5.8段前缀的使用 在这里是参考课本121页程序5.9,它使用了默认的数据段的段地址ds和显示的使用了附加段es
第六章 包含多个段的程序
//这部分主要是自己写一点简答的代码就好
6.1在代码段中使用数据(重点,请详细阅读课本123、124页) 6.2在代码段中使用栈 6.3将数据、代码、栈放入不同的空间
第七章:更灵活的定位内存地址的方法//重点部分,请详细阅读课本
7.7si和di 在使用时,将si称为源变址寄存器(source)将di称为目的变址寄存器
第八章:数据处理的两个基本问题
处理的数据在什么地方:物理地址 要处理的数据有多长 课本161页,用到了bx,si,di和bp四个寄存器注意的就是两两之间的相互搭配,同时bp的默认段地址为ss(堆栈段的段地址) 数据处理大致分为三类:读取,写入,运算。数据的三个位置:cpu内部,内存,端口 8.4寻址方式课本164页有详细的列举,请参考课本 8.5处理的数据有多长 8086cpu中主要是处理俩种类型的数据:字和字节 (1)通过寄存器指明了数据的尺寸 (2)没有寄存器的情况下,用操作符X ptr指明了内存单元的长度
也许在这里也就应该要好奇了,为何会有这么一个操作。这里就举例子看看吧。
第一个是每次加1的操作。
inc byte prt [bx]
mov word prt ds:[0],1
(3)其他方法eg:push操作的默认处理对象是一个字 8.7重点div指令 注意每个寄存器的使用,参考课本170页 8.8和8.9dd和dup详细参考课本170到172
看完了考试的模拟试卷了,现在又可以开始活力的更新了。这里说明了一点:我的这份博客是专门为一个人而写,但是,却是为了我自己的一份青春记忆而更新。看见我发链接的朋友们,你们倘若注意到了我的这一个小插曲,感谢这一份信任. 希望考试一切顺利。
第九章:转移指令的原理
9.1 这个是用来计算偏移地址的一个标记符号的offset,在编成当中是相当有用的。 9.2 jmp指令(称为无条件转移指令,可以用来修改IP,也可以同时用来修改CS和IP) jmp指令要给出两种信息。 (1)转移的目的地址 (2)转移的距离(段间转移、段内短转移、段内进转移) jmp short 标号(转移到标号处执行指令) jmp near ptr 标号 它的功能是:(IP)=(IP)+16位位移; jmp far ptr 标号 实现的是段间转移,又称为远转移 jmp 16位reg(IP)=(16位reg) 转移地址在内存中的jmp指令 mov ax,0123h mov ds:[0],ax jmp word ptr ds:[0] 执行后IP = 0123h 注意课本上的习题P183,P184 jcxz 标号 jcxz指令称为有条件转移指令仅仅是当cx等于0时,转移到标号处执行 相对来说这个指令也是非常的管用的,可以看见,当在一个字符串的末尾添加一个0表示结尾的时候,每一次都将数值传递到cx当中,并且通过jcxz进行检查的时候就可以实现到字符串的末尾进行跳转的功能。 loop指令 这是一个相对来说用的更多的一个指令。仅仅是要自己注意,将cx寄存器保护好即可 9.10编译器对转移位移超界的检测 当超出了规定的长度的时候,编译器是会报错的 根据条件编成: 缓冲区一共分为8页,每页有4KB,通常情况下B8000H到B8F9FH是可以用来显示的部分。
第十章:call和ret指令
10.1ret和retf ret 用来修改IP的内容,从而实现进转移; retf指令用栈中的数据,同时用来修改CS和IP中的内容,从而实现远转移。 原则:低位修改偏移地址,高位修改段地址。 call指令 这个是用来将IP入栈的,然后实现后面的跳转的部分。 但是call far prt 标号是用来实现段间转移的。 CPU执行此种格式的call指令时,进行如下的操作。CS和IP都将会入栈 push CS push IP jmp far prt 标号 10.5转移地址在寄存器中的call指令 这个相当于是一种跳转,相当于是jmp指令 转移地址在内存中的call指令 mul
重点章节:
第十一章:标志寄存器
我们在使用的时候一般是将他们写为flag也是我们在使用时用到的psw寄存器 其中有这些部分是有意义的,需要我们自己注意: OF、DF、IF、TF、SF、ZF、AF、PF、CF这一共算起来是有9个位 ZF是0标志位,它记录相关指令执行后,其结果是否是为0的。如果结果为0,那么ZF里边保存的值即为1,否则就为0 是否为0:是为0的[计算机的回答](1)不是为0的[计算机的回答](0) PF标志:flag的第二位是PF,%2标记位计算结果所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf为1,如果为奇数,那么pf=0 SF标志 用来看计算结果是否是为负数,这个是由计算机自己进行处理的。 CF标志 是否是有进位的标志 用于加法和减法的借位操作 OF标志用来看计算的结果是否有溢出 将课本的P219的习题写一写就好了 在这里有两个指令:一个是add对应的adc,还有一个是sub对应的sbb cmp指令,这个在编成中式非常重要的,相当于是一个判断的指令。 DF标志和串传送指令 df=0 每次操作后si和di递增 df=1 每次操作后si和di递减 一个串传送指令,格式是movsb 功能:执行movsb指令相当于进行下面的几步操作。 es*16+di=ds*16+si si=si+1 di=di+1 如果df=1则: si=si-1 di=di-1 可以看出,movsb的功能是将ds:si指向内存单元中的字节送入到es:di当中。然后根据标志寄存器df的值,将si和di递增2或者是递减2 用汇编语法描述movsw的功能如下,相对于movsb来说,它移动的是一个字 一般来说,他们两个都是要配合于rep来使用的 格式:rep movsb rep是根据cx的值,重复执行后面的串传送指令。由于每执行一次movsb指令,si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送 cld指令:用来将标志寄存器df位置变为0 std指令用来将标志寄存器df位置变为1 11.11pushf和popf指令 pushf是将标志寄存器的值压入栈,而popf是从栈中弹出数据,送入标志寄存器中。这是直接访问标志寄存器的一种方法。
第十二章 内中断
中断处理程序、中断向量表、中断过程、中断处理程序和iret指令 (1)(从中断信息中)取得中断类型码 (2)标志寄存器入栈 (3)设置标志寄存器的第8位TF和第9位IF的值为0 (4)CS的内容如栈 (5)IP的内容入栈 (6)从内存地址为中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序的入口IP和CS 使用到的iret的功能 POP IP POP CS popf 程序的安装: assume cs:code code sgement start:设置es:di的目的地址 设置ds:si指向的源地址 设置cx为传输长度 设置传输长度为正 rep movsb 设置中断向量表 mov ax,4c00h int 21h do0: 显示字符串“overflow” mov ax,4c00h int 21h code ends end start
第十三章 int指令
对于int n
这个是先取得中断类型码n,然后标志寄存器入栈,设置IF和TF均为0
将CS和IP入栈,最后是更改CS和IP的值,将程序跳转到中断处理程序处处理。
注意,在这一章中,难度较大,所以处理时建议详细看课本并完成实验,这样才可以顺利的将汇编语言的思想深入的理解。这章不会是考试的重点,最多会是部分概念。
第十四章 端口
端口的读写 注意到这句话——对端口的读写不能用mov,push,pop等内存读写指令,端口的读写指令只有两条,一个是in,还有一个是out,分别用于从端口读取数据和向端口写入数据 访问端口有 in al,60h out 20h,al
shl和shr指令
注意移动方向