汇编语言学习总结

时间:2021-09-23 14:28:04

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

注意移动方向