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

    3.1 内存中字的存储

           一个字的大小为两个字节,8086CPU一个寄存器的大小为两个字节,所以使用8086CPU的寄存器存储一个字单元的时候,高字节寄存器存储字的高位字节,低字节寄存器存储字的低位字节。在用内存存储一个字的时候,高内存单元存储字的高字节,低内存单元存储字的低字节。小端法。比如20000(4E20H)在进行内存存储的时候,我们此时有0,1两个地址的内存单元,那么字的高字节4EH存储在内存地址为1的内存单元,字的低字节单元20H存储在内存地址为0的低内存单元。

           字单元概念,即连续存储两个字节的内存单元。高内存单元存储字的高字节数据,低内存单元存储字的低字节数据。以后将起始地址为N的字节单元称为N地址字单元。

    3.2 DS和[address],字的传送

          CPU要读取一个内存单元的地址,必须得到该内存单元的段地址:偏移地址 才能得到实际的内存地址。

          因为DS为段寄存器,8086CPU所以不能直接给段寄存器复制,必须通过普通寄存器过渡存储。8086CPU对于段地址默认取自DS寄存器。所以这样不仅有了段地址和偏移地址,我们就可以轻松取得内存的数据了,这里内存地址表示方式为[......],表示取得方框内为偏移地址的内存中的数据。

    关于寄存器和内存之间传值,因为8086CPU在内存中有16根数据线,故一次性可以传送一个字的数据。

    3.4 mov、add、sub指令,数据段

    关于mov传值的形式:

    mov 寄存器,数据        如:mov ax,8

    mov 寄存器,寄存器    如: mov ax,bx

    mov 寄存器,内存单元   如:mov ax,[0]

    mov 内存单元,寄存器   如:mov [0],ax

    mov 段寄存器,寄存器   如:mov DS,AX

    mov 寄存器,段寄存     如:mov AX,DS

    mov 内存单元,段寄存器 如:mov [0],DS

    mov 段寄存器,内存单元 如:mov DS,[0]


    add与sub指令的形式与mov类似,如下:

        在8086CPU中我们可以把一段连续的内存地址作为数据段使用,该数据段用于存储数据。 

    3.5 栈结构及CPU提供的栈机制

    栈为一种线性结构,这里我们可以理解为栈为一种先进后出的存储结构或者数据结构。举个例子,比如我们有三本书book1,book2和book3依次入栈。其结构及入栈出栈流程(略)

    在8086CPU也提供了相关指令以栈的方式访问内存,在基于8086CPU编程的时候。可以将一段内存当做栈使用,8086CPU指令系统提供了PUSH和POP两个指令进行栈操作,PUSH为入栈操作,POP为出栈操作,入栈时将数据压栈,出栈的时候取出栈顶指向的数据。8086CPU的PUSH和POP操作都是以字为单位进行的。比如PUSH ax为将ax的数据压入栈空间,POP ax为将栈顶的数据弹出存入ax中。
    下面将10000H-1000FH这段内存当成栈空间使用,其相关出栈入栈的流程如下图所示:

     在8086CPU中有两个重要的寄存器,SS和SP,SS即Stack Segment,SP即Stack Point,代表着栈的段地址和栈顶地址。通过这两个地址CPU便可以识别栈空间和栈顶位置。

    描述PUSH和POP指令的运行过程:

      

    例如PUSH AX,由两步完成

    (1) SP=SP-2;SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶。

    (2) 将AX送入SS:SP指向的内存单元处,SS:SP此时指向新的栈顶。

    例如POP AX,由两步完成

    (1) 将SS:SP指向的内存单元处的数据送入AX中。

    (2) SP=SP+2,SS:SP指向当前栈顶的下面的单元,以当前栈顶下面的单元为新的栈顶。

    3.6 栈顶越界的问题
    从上面的描述已经介绍了SS和SP指向栈空间栈顶的位置,但是栈空间是有大小的,如果一直将数据压栈直到超过栈的空间那就会造成栈顶越界的问题,CPU是不会检查栈顶是否越界的问题,因为CPU并不知道当前栈空间的大小,所有在编程的时候需要程序员自己注意和控制栈顶越界的问题。

    3.7 PUSH和POP的其他使用方式和栈段

    PUSH和POP是对栈存储空间操作的特定指令,然而PUSH和POP不仅可以操作寄存器还可以对段寄存器和内存进行操作

    比如 PUSH DS;

    POP   DS;

    PUSH [0];

    POP  [0];

    关于段,前面我们已经接触过好几个段寄存器,CS,DS,SS其中CS为code segment(代码段),DS为data segment(数据段),ss为stack segment(栈段),这三个段寄存器分别存储不同的数据。在需要的时候可以通过段地址+偏移地址取得各个段中的数据。

  • 相关阅读:
    白盒测试笔记之:Junit 单元测试以及测试覆盖率
    Bootstrap+JSP实例学习笔记一.简单的带登录功能的首页
    一位普通测试人2018年简单回顾
    Web API学习笔记(Python实现)
    web安全测试--sql注入攻击
    电源分配系统及电源完整性
    FPGA Timing笔记
    使用arm开发板搭建无线mesh网络(二)
    使用arm开发板搭建无线mesh网络(一)
    arm tiny6410双网卡桥接问题
  • 原文地址:https://www.cnblogs.com/skyen/p/9822286.html
Copyright © 2011-2022 走看看