zoukankan      html  css  js  c++  java
  • 汇编语言学习总结

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

    注意移动方向
    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    1688 求逆序对
    2534 渡河
    1220 数字三角形
    JavaWeb网上图书商城完整项目--26.注册页面之验证码换一张实现
    JavaWeb网上图书商城完整项目--25.注册页面之隐藏没有内容的错误信息实现
    JavaWeb网上图书商城完整项目--24.注册页面的css样式实现
    JavaWeb网上图书商城完整项目--23.注册页面之html实现
    JavaWeb网上图书商城完整项目--21.用户模块各层相关类的创建
    JavaWeb网上图书商城完整项目--13.项目所需环境的搭建
    JavaWeb网上图书商城完整项目--12.项目所需jquery函数介绍之ajax
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/4035291.html
Copyright © 2011-2022 走看看