zoukankan      html  css  js  c++  java
  • 第三章总结

      前两章主要学习了CPU与存储器之间的联系(外部联系)和CPU内部的几个存储器之间的联系以及数据的传送(内部联系)、CPU对指令的执行、指令的读取、执行和改变指针的这三个操作的顺序(先读取指令进入指令缓冲器,再对增加ip的值再执行读入的指令)、以及CPU是通过何种指示来找到要读取的指令(通过指令指针寄存器ip和指令段寄存器cs)、mov、add、jmp指令(用来改变cs和ip的值)的使用和在debug中写入指令(a),显示以及改变指定寄存器的值(r),将机器码反汇编成汇编指令(u),在内存中写入数据(e),单步调试(t),显示内存中的值(d),执行指令到指定位置之前(g)。

      而第三章学习的是:CPU如何从内存中读取数据,CPU如何向内存中的指定位置写入数据(注意这里和前一章使用e命令向内存中写入数据,使用e命令向内存中写入数据仅仅是把数据写到内存中,CPU对内存中数据的读写还是另一回事,而使用a命令则是从当前cs:ip所指向的地址开始读取指令,在执行汇编指令时对相关寄存器的赋值并不是CPU对内存中值的读取,仅仅是通过汇编指令改变了寄存器中的值)以及CPU是以何种数据形式(字型,双字型,四字型,字节型)从内存中读取数据,即CPU是如何对内存进行访问的。

    1. 内存中的数据的存储方式:

    1)字节型数据:首先,存储器被分为一个一个的存储单元,单个存储单元可以存储的数据大小为8个位,即一个字节,每一个存储单元都可以存放一个字节大小的数据,所以孤立地看一个存储在一个存储单元中的数据,它就是一个字节型的数据。

    2)字型数据:在计算机中,一个字就是16个位,就是两个字节,所以存放一个字型的数据,就需要一个能存储16个字节的空间,而一个存储单元只能存储8个字节,所以存储一个字型数据就需要2个存储单元。双字,四字同理。

      字节型数据的存储是没有异议的,因为一个存储空间正好存一个,但是一个字型数据存储(因为要存进两个存储单元)所以就要考虑到如何将一个字型数据的16位字节分成两个8位字节的数据,然后在存入两个存储单元。

    方法:首先将一个字型数据分成高8位和第8位,分别称为高位字节和低位字节。然后使用“小端法”将低位字节和高位字节依次送入相邻的两个地址单元中。

      对小端法的说明:在存储字数据到内存中的时候,有小端法和大端法,小端法就是将一个字数据分成高位字节和低位字节,然后指定要用来存储这个字数据的存储单元的地址(这个字数据存储进内存的首地址),然后将低位字节存入前面指定的这个存储单元,将高位字节存入这个存储单元的下一个存储单元(地址加一),大端法相反。比如说,要将1234H这个十六进制数存入存储单元0000:0001(即存储完毕之后,这个字数据存储在内存中的地址就是0000:0001),先将1234H分为12H和34H,然后将34H存入0000:0001,将12H存入0000:0002。

    2.使用DS和[address]来实现通过汇编语言的控制来使得CPU读取和向内存中写入数据:

    1)ds寄存器:在CPU中存储单元的物理地址都是由段地址*16+偏移地址得来的,所以可以将每一个存储单元的地址看成是段地址:偏移地址。数据存放在存储单元中,所以CPU要想获得内存中的数据,就必须要知道存放数据的存储单元的地址(段地址:偏移地址),所以就有了ds寄存器,用来存放数据存放位置的段地址。

    2)[address]:ds中的值就是存放数据的段地址,而[address]就是需要访问数据在ds存放的段地址下的偏移地址。

    在使用ds和[address]来实现CPU对内存中数据的读写的语法格式:

    mov ax,1000

    mov ds,ax

    mov bx,[0] ;此处将以1000:0为首地址,按小端法存储的字型数据放入bx中

    mov [0],al ;此处将al中的字节型数据放入1000:0这一个存储单元中。

    注意:1.在改变ds中的值变成你想要的值的时候不能使用mov ds,1000。

             2.在读取内存中的数据的时候,一定要注意进行传送的数据形式(字型,字节型)。

    数据段的定义:在debug中用命令来执行代码时是从cs:ip所指向的地址开始读取并执行的,在无参数使用a命令来写入代码也是从当前cs:ip所指向的地址开始写起的。为了将使用的数据与指令进行区分(因为在存储方式上他们都是通过二进制代码存储的),所以要在内存中定一个数据段(大小小于等于64KB),要调用数据的时候就从数据段相应位置读取数据。

    3.栈

      在数据结构中也有栈这种数据结构,它的特点是元素只能从一端进出,并且遵循先入后出(可以根据这一个特点来交换两个寄存器中的值)的规则。在8086CPU中可以将一段内存作为栈来使用。并且在CPU中栈中存储元素的基本单位是字(每一个字都是按照小端法来存储的)。

    1栈段寄存器ss:指示的是这一段作为栈结构的内存的段地址。

    2栈指针寄存器sp:sp所指示的是栈顶元素在栈段地址下的偏移地址。

    所以ss:sp只能指示出栈顶的位置,无法指示栈底的位置。

    栈中元素的出栈和入栈:

    栈中的哪一个元素要出栈和元素在哪入栈都是由ss:sp所指示的。

    入栈:先改变sp的值(sp-=2(因为要空出一个字的空间)),再给相应的位置用ax,bx等等赋值,赋完了值以后的状态ss:sp指向新栈顶。(push ax)

    出栈:先将ss:sp所指向的位置中的字型数据赋值给ax或其他寄存器(pop ax),再将改变sp的值(sp+=2)

    栈空的判断:不停地出栈,导致sp不断增大(以一次加二的形式),直到即将将最后一个字数据弹栈出来之后sp再加二,所以如果一开始栈中什么元素都没有的状态下ss:sp指向的位置是1000:0,那么在一系列的入栈出栈之后的栈空状态就是ss:sp指向1000:1(为栈空间最高地址的下一个地址)。

    栈的超界:在栈空的时候使用pop,栈满的时候使用push,栈的空间从哪里到哪里是人为规定的,即如果栈顶指针超过了人定的地址就是超界。所以在使用栈之前要预估需要用到的空间。

  • 相关阅读:
    利用python在windows环境下爬取赶集网工作信息。
    扔骰子
    python 输入英语单词,查看汉语意思
    获取指定日期的上一个月日期
    爬取代理IP,并判断是否可用。
    递归实现 十进制转换其他进制(2-16)
    特殊回文数
    python 实现无序列表
    python 实现剪刀石头布(三局两胜)
    python 实现简单语音聊天机器人
  • 原文地址:https://www.cnblogs.com/tomori/p/9867342.html
Copyright © 2011-2022 走看看