VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 汇编语言 >
  • 汇编语言学习

 

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

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

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

 

一、基础知识

 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至少要读取____次.

    答案:

 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

版权声明


作者:TDX

出处:博客园TDX的技术博客--http://www.cnblogs.com/tandaxia


相关教程