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

    参考书籍《汇编语言》王爽  著/清华大学出版社

    菜单导航:一、汇编基础知识

    二、寄存器和常见汇编指令演示

    一、基础知识

     1、汇编指令是机器指令的助记符,同机器指令一一对应

     2、每一种CPU都有自己的汇编指令集

       3、CPU可以直接使用的信息在存储器中存放

       4、在存储器中指令和数据没有任何区别,都是二进制信息

       5、存储单元从零开始顺序编号

       6、一个存储单元可以存储8个bit, 即8位二进制数

       7、1Byte = 8bit ;    1KB = 1024B ;  1MB = 1024KB ;   1GB = 1024MB

       8、CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行下面3类信息的交互:

    • 存储单元的地址(地址信息)
    • 器件的选择,读或写的命令(控制信息)
    • 读或写的数据(数据信息)

        9、那么CPU是通过什么将地址、数据和控制信息传到存储器芯片中的呢?电子计算机能处理、传输的信息都是电信号,电信号当然要用导线传送。

        在计算机中专门有连接CPU和其他芯片的导线,通常称为总线。

       总线从物理上来讲,就是一根根导线的集合。根据传送信息的不同,总线从逻辑上又分为3类:地址、控制、数据

      每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。

            一个CPU可以引出3种总线的宽度标志了这个CPU的不同方面的性能。

      

    • 地址总线:地址总线的宽度决定了CPU的寻址能力
      • 比如8086cpu,它的地址总线宽度为20,所以它的寻址能力是2^20 = 2^10 * 2^10 = 1024 * 1024 = 1M
      • 怎么理解?就是说8086有20根线,每根线控制一个0或者1,每次可以同时操作20根线发出一个0或者1的电信号,
      • 则有排列组合2^20=1024 * 1024 种可能性,即8086最多可以找到1024 * 1024 个内存单元(从0 --> 1024*1024),
      • 一个内存单元表示一个字节,也就是说8086最多可以寻找到1024 * 1024 = 1M个数量的内存地址;
      • 也就是说如果cpu的地址总线宽度是20,则给它配置1M的内存条已经够了,如果配置了2M就是浪费,因为它最多只能找到1M个内存单元,也最多只能用到1M个内存单元,另外1M个内存单元没有能力找到更是用不上了。
    • 数据总线:数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量
      • 比如8086cpu的数据总线宽度是16,则每次可以传递2个字节的数据。
      • 怎么计算出来的?16根线,每根线控制一个0或者1,每次可以同时操作16根线发出一个0或者1的电信号;
      • 数据总线和地址总线理解上不一样,这里的同时操作16位0或者1,也就是传递16个0或者1的二进制信号;
      • 就是说每次传递2个字节的数据(16bit = 2Byte)
    • 控制总线:控制总线的宽度决定了CPU对系统中其他器件的控制能力

     10、做个小练习

    • 一个CPU 的寻址能力为8KB,那么它的地址总线的宽度为____
    • 8080,8088,80286,80386 的地址总线宽度分别为16根,20根,24根,32根.那么他们的寻址能力分别为多少____KB, ____MB,____MB,____GB?
    • 8080,8088,8086,80286,80386 的数据总线宽度分别为8根,8根,16根,16根,32根.那么它们一次可以传输的数据为:____B,____B,____B,____B,____B,
    • 从内存中读取1024字节的数据,8086至少要读____次,80386至少要读取____次.

        答案:

    1、一个CPU 的寻址能力为8KB,那么它的地址总线的宽度为__13__
    
    2、8080,8088,80286,80386 的地址总线宽度分别为16根,20根,24根,32根.那么他们的寻址能力分别为多少__64__KB, __1__MB,__16__MB,__4__GB
    
    3、8080,8088,8086,80286,80386 的数据总线宽度分别为8根,8根,16根,16根,32根.那么它们一次可以传输的数据为:__1__B,__1__B,__2__B,__2__B,__4__B
    
    4、从内存中读取1024字节的数据,8086至少要读__512__次,80386至少要读取__256__次.
    View Code

    二、寄存器

    1、从物理结构来讲,CPU包括运算逻辑部件、寄存器部件和控制部件等

    • 运算逻辑部件(Logic components): 可以执行定点或浮点算术运算操作、移位操作以及逻辑操作,也可执行地址运算和转换;
    • 寄存器部件,包括寄存器、专用寄存器和控制寄存器。 通用寄存器又可分定点数和浮点数两类,它们用来保存指令执行过程中临时存放的寄存器操作数和中间(或最终)的操作结果。 通用寄存器是cpu的重要部件之一。
    • 控制部件: 主要是负责对指令译码,并且发出为完成每条指令所要执行的各个操作的控制信号。其结构有两种:一种是以微存储为核心的微程序控制方式;一种是以逻辑硬布线结构为主的控制方式。

    2、对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制;

         不同的cpu,寄存器的个数、结构是不同的。比如8086是16位结构的cpu, 

      8086有14个16位的寄存器,每个可以存放2个字节。

    3、通用寄存器的作用

    • AX、BX、CX、DX这四个寄存器通常用来存放一般性的数据,称为通用寄存器(有时也有特定用途)
    • 通常,cpu会先将内存中的数据存储到通用寄存器中,然后再对通用寄存器中的数据进行运算。

        举例说明,在内存中有块红色内存空间的值是3,现在想把它的值加1,并将新的计算结果存储到蓝色内存空间,如图所示

    那么这个在cpu的执行步骤是怎样的呢?

    1)、cpu首先会将红色内存空间的值放到AX寄存器中:mov ax, 红色内存空间

    2)、然后让AX寄存器与1相加:add ax, 1

    3)、最后将值赋值给内存空间:mov  蓝色内存空间,ax

    4、数据寄存器的兼容:

    • AX、BX、CX、DX这四个通用寄存器都是16位的,
    • 但是上一代的8086寄存器都是8位,为了保证兼容, 这四个寄存器都可用2个独立的8位寄存器来使用
    • H代表高位寄存器
    • L代表低位寄存器

    5、汇编指令举例

      接下来看一下CPU执行下图中的每条指令后,对寄存器中的数据进行的改变:

    说明,假设原AX中的值:0000H,   原BX中的值:0000H

    为什么程序段中最后一条指令 add  ax,bx, 在执行前ax和bx中的数据都为8226H, 相加后所得值为044CH, 而不是:1044CH ?

    因为ax为16位寄存器,只能存放4位16进制的数据,所以最高位的1不能在ax中保存,ax最后保存的数据为:044CH

    再来看一段程序段的指令,注意高位和低位寄存器的计算

    最后一个指令  add  al,93H后AX中的数据为0058H, 为啥?

    执行前,al中的数据为C5H, 相加93H为158H, 但是al为一个独立8位寄存器,和ah没有关系,CPU在执行这条指令时认为ah和al时两个不相关的寄存器。

    所以只能存放两位十六进制的数据,所以最高位的1丢失。

    另外,在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如下图这些是正确的指令:

    ----------------------------------------

    而下面的指令等都是错误的指令

    原文链接:http://www.cnblogs.com/tandaxia/p/7247986.html

  • 相关阅读:
    salt执行报错一例
    state配置语言实战
    salt-ssh使用
    八、job管理
    六、saltstack的module组件
    五、Pillar数据管理中心
    Web Server与App Server
    二分查找的时间复杂度(TODO )
    二分查找的时间复杂度(TODO )
    git : error setting certificate verify locations
  • 原文地址:https://www.cnblogs.com/tandaxia/p/7247986.html
Copyright © 2011-2022 走看看