zoukankan      html  css  js  c++  java
  • 跟我学汇编(一)基础知识

    零、前言

    身为程序猿。序号一定从零開始数。哈哈。

    这篇文章是在学习汇编语言是所做的笔记,当中的内容必然会受到书中内容的影响。我所看的课本是王爽所著的《汇编语言》(第三版),写博客的目的是为了巩固自己所学的知识,同一时候将自己的想法表达出来,和大家一起分享,共同进步,不会将内容用于不论什么商业目的。假设博文中内容涉及侵权,请及时与我联系删除,谢谢。

    一、汇编语言的产生

    我们知道机器仅仅能看懂机器语言,也就是0和1。实际上0和1仅仅是我们规定的数字,机器事实上连0和1也看不懂,这里的0和1实际上是指两种不同的电压状态。计算机是用电的。它能理解的就是电压的变化。所以我们通过不同的电压驱动计算机运算。来完毕我们所需要的任务。

    在早期,人们通过纸带来编程,打孔的地方表示1,不打孔的地方表示0。然后将纸带输入计算机中。这种方式不但费时费力,并且不同发现错误。

    比如以下的程序:

    101110000000000000000011
    000001010000000000110000
    001011010000000000000101

    这是8086CPU完毕运算s=768+12288-1280的程序,假设这个程序中错误的将一个0写成了1,试想要想发现这个错误是多么的困难。

    为了方便人们编敲代码。并且避免01代码easy出错的问题。人们发明了汇编语言。

    比如:机器指令1000100111011000表示把寄存器BX的内容送到AX中。

    汇编指令则写成mov ax,bx。

    这种写法与人类语言接近。便于阅读和记忆。

    我们上边说过,计算机仅仅认识高低不同的电压,那么汇编语言在计算机中是怎么转化成机器认识的语言的呢。

    这里写图片描写叙述

    汇编语言的运行过程如上图所看到的。首先经过编译器将汇编指令编译成机器码,然后机器码就行运行在计算机上了。

    汇编语言又分为以下的三种:

    • 汇编指令:机器码的助记符。有相应的机器码。
    • 伪指令:没有相应的机器码,由编译器运行,计算机并不运行。

    • 其它符号:如+、-、*、/等,由编译器识别,没有相应的机器码。

    二、CPU对存储器的读写

    我们知道数据和指令是放在内存中的,CPU通过总线对存储器进行訪问。但实际上总线是分为三部分的,即地址线,控制线和数据线。

    地址线表示CPU要对内存中的哪个地址进行操作,所以地址线的条数决定了CPU可以訪问的内存范围,由于一根线上最多仅仅能有两种不同的状态即0和1,所以10根地址线可以訪问的存储单元的个数就是2^10个。

    地址线仅仅是送出了要操作的地址,可是并没有声明要进行什么操作,所以控制线就是来决定对存储单元的操作的。所以说控制线的条数决定了CPU可以运行的操作的种类。

    数据线是用来在CPU和内存之间进行数据传送的,所以数据线的条数决定了一次最多传送的数据的数量,比如8根数据线一次就能传送8个bit即一个字节。

    这里写图片描写叙述

    上图展示了CPU从3号内存单元中读取数据的过程。首先CPU利用数据线送出地址3。然后通过控制线发送读命令。然后内存将结果通过数据线返回给CPU。

    三、内存地址空间

    什么是内存地址空间呢?举例来讲,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元。这1024个可寻到的内存单元就构成了这个CPU的内存地址空间。当然这里所说的内存并不单单是内存条中的内存,还包含其它各种外设中的RAM和ROM。

    比如,显卡也有自己的内存,用来存储在显示屏上显示的内容,另外显卡BIOS ROM也被当做是内存空间中的一部分,此外还有网卡的BIOS ROM和系统BIOS ROM地址空间等。

    因此我们在基于一个计算机硬件系统编程时,必需要知道这个系统中的内存地址空间分配情况。应为当我们想在某类存储器中读写数据的时候。必须知道它的第一个单元地址和最后一个单元地址。才干保证读写操作是在预期的存储器中进行的。比方,我们希望在显示器上输出一段信息,那么必须将这段信息写到显存中,显卡才干将它输出到显示器上,要想向显存中写入数据。必须知道显存在地址空间中的地址。

    这里写图片描写叙述

    上图展示了8086PC机内存地址空间分配的基本情况。

    从地址0~9FFFF的内存单元中读取数据。实际上就是在读取住随机存储器中的数据。向地址A0000~BFFFF的内存单元中写数据,就是向显示器中写入数据,这些数据会被显卡显示到显示器上。我们向C0000~FFFFFF的内存单元中写入数据的操作是无效的,由于这等于改写仅仅读存储器中的内容。

  • 相关阅读:
    [C++]猜词游戏简版
    [C++]异常处理实例-基础版
    C++Primer Plus习题记录-Chapter12
    C++Primer Plus习题记录-Chapter11
    [C++]MI(多继承)实例-基础版
    Windows下编译libevent及使用
    jquery点击回到顶部
    简体繁体转换
    检测ip和地区
    点击复制到剪切板
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8440613.html
Copyright © 2011-2022 走看看