汇编语言学习

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

一、基础知识

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__次.

二、寄存器

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林冠宏的技术文章

全面总结: Golang 调用 C/C++,例子式教程

Golang 调用 C/C++ 的教程网上很多,就我目前所看到的,个人见解就是比较乱,坑也很多。希望本文能在一定程度上,做到更通俗明了。

4022
来自专栏我的安全视界观

【一起玩蛇】Nodejs代码审计中的器

5186
来自专栏QQ会员技术团队的专栏

从0实现一个延迟代理服务

需求背景: 后台业务逻辑类服务,其实现通常都会依赖其他外部服务,比如存储,或者其他的逻辑server。 有一类比较典型的问题: 假设主调方A是同步处理模型,有一...

2568
来自专栏Android开发与分享

Android开发架构规范前言命名规范编程规范代码提交规范架构规范参考文章

3918
来自专栏技术墨客

Nodejs学习笔记(1)——安装nodejs

    关于大名鼎鼎的Nodejs是什么就不用再介绍了,他的牛逼之处数都数不完——让javascript称霸全宇宙、将一个只用于前端的编程语言同时可以制霸前后端...

902
来自专栏何俊林

Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现

前言:上篇中介绍OMX事件回调,从今天开始,走入Codec部分之OpenMAX框架里。看下今天的Agenda如下: 一张图回顾音视频同步 一张图看清OpenMA...

30310
来自专栏码农分享

推荐一个有用的Excel操作类库 LinqToExcel

以前项目中对Excel进行信息读取,我都是使用的NPOI的封装类,给定一个fileurl,然后返回给我一个datatable。接下去自己去解析数据。如果使用这种...

1392
来自专栏开发与安全

套接字socket 的地址族和类型、工作原理、创建过程

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为...

27311
来自专栏大前端开发

从编程小白到全栈开发:服务的调用

忙带懒,好久没有更新文章了(其实主要是想留给你们一些消化前面文章知识点的时间,哈哈哈?)。

1474
来自专栏QQ会员技术团队的专栏

从 0 实现一个延迟代理服务

部门会定期进行容灾演习,也期望能够验证到各个服务的\"最差服务能力\"。即验证被调出现较高延迟或者过载的时候,主调的服务能力是否符合预期。要想做这种演习,其核心...

2302

扫码关注云+社区

领取腾讯云代金券