汇编语言学习总结

汇编语言之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指令

注意移动方向

 

你可能感兴趣的:(汇编语言)