zoukankan      html  css  js  c++  java
  • 第三章知识梳理

    一、段寄存器DS

    在上章中,我们熟悉了通用寄存器和CS、IP寄存器,知道通用寄存器AX,BX,CX,DX是用来存放一般性数据的,而CS:IP是指示CPU当前所要读取指令的地址的。这一章中,将了解段寄存器DS的使用。DS的全称是Data Segment,意为数据寄存器。那它有什么作用呢?CPU在读写一个内存单元的时候,必须知道内存单元的地址,而地址又是由“段地址:偏移地址”确定的。DS就是用来存放这个段地址的。这样在访问内存单元的时候,只需要用"[x]"(x表示偏移地址)的格式给出偏移地址就行了,段地址默认从DS中取出。

    有个注意点是,并不能直接把某个内存单元的数据传送到DS中去,必须由一个寄存器进行中转。如:

    ①mov ds,1000h (✗)

    ②mov ax,1000h;mov ds,ax  (✔)

    二、mov ,add,sub指令

     指令的含义都清楚,这里提一下使用的注意事项。这三者都有2个操作对象,它们可以是寄存器,内存单元,段寄存器,常数,但是并不是任何两者之间都可以传送。具体如下:

     mov指令

      寄存器 内存单元 段寄存器 常数
    寄存器

    内存单元
    段寄存器
    常数

    (行为左操作对象,列为右操作对象)

     add指令/sub指令

      寄存器 内存单元 段寄存器 常数
    寄存器

    内存单元
    段寄存器
    常数

    (行为左操作对象,列为右操作对象)

    总结:1.常数不能作为目的操作数

       2.常数作第2个操作数(源操作数)时,如果最高位是十六进制的a~f或A~F,前面要加零,如:mov ax, 0A400H  

       3.两个内存单元之间不能直接传送数据。

       4.两个段寄存器之间不能直接传送

       5.不能把常数送到段寄存器。

       6.两个内存单元不能直接使用add或sub指令相减

    三、栈

     栈是一种具有“先进后出”或“后进先出”特性的数据结构。它有2个基本操作:入栈和出栈。8086CPU的入栈和出栈都是以为单位进行的。与栈相联系的寄存器是SS和SP,在任意时刻,SS:SP指向栈顶元素

    入栈(push):①SP=SP-2;②数据-->栈顶

    出栈(pop):①取出栈顶数据-->其他位置②SP=SP+2;

    注意:入栈时,栈顶从高地址向低地址方向增长。

    四、段的小结

    1.「段」是一个逻辑上的概念。 编程时,可根据需要指定一段内存区用作数据段、代码段或是栈段。

    2.用作数据段时,要把段地址→DS ;用作栈段时,要把段地址→SS,栈顶偏移地址 → SP ;用作代码段时,段地址→CS,要取的指令偏移地址→IP。但CS和IP的值不能使用mov改变。

    3.一段内存可以同时用作代码段、数据段、栈段。 由编程时灵活确定。

    4.在8086CPU中,每个段的最大长度不能超过64KB。 (因为寄存器是16位的,能表示的地址范围只能是0000H~FFFFH,即0~216-1)

  • 相关阅读:
    wode.
    python中迭代器和生成器。
    Embeded linux 之 UBIFS文件系统
    Windows下Git安装和使用
    套接字 之 windows与linux 差异
    Embeded linux之RTL8188EU/RTL8188ETV使用
    嵌入式Linux之“+”版本问题
    Uboot之net
    Embeded linux之reboot
    Embeded linux之cifs文件系统
  • 原文地址:https://www.cnblogs.com/kevin234/p/9818475.html
Copyright © 2011-2022 走看看