zoukankan      html  css  js  c++  java
  • 第三章 寄存器(内存访问)

    一、一个字=两个字节。地位字节存放在低地址单位中,高位字节存放在高地址单元中,取低地址内存单元作为字数据地址。(小端法

            引入概念:字单元:存放一个字型数据的内存单元,由两个地址连续的内存单元组成。                                              

            N地址字单元:将起始地址为N的字单元简称为N地址字单元。

           :任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。

    二、8086CPU自动取DS中的数据为内存单元的段地址。

         (eg:mov bx,1000H

                  mov ds,bx

                  mov al,[0]

             [...]表示一个内存单元,[...]中的0表示偏移地址,ds值为段地址。由ds和偏移地址能得到物理地址。

             操作数是内存单元时,指令中只给出「偏移地址」。 默认,「段地址」在ds中。

             mov ds,1000H(错误)原因:8086CPU不支持将数据直接送入段寄存器的操作。

    三、字的传送:注意区分mov ax,[0]和mov al,[0]

            mov ax,[0]:字型数据传送

            mov al,[0]:字节数据传送

    四、mov、add、sub指令

            注意:1、常数不能作为目的操作数。

                       2、作为源操作数时,若最高位是16进制的A~F,前加0。

                       3、两个操作数长度要一致。

                       4、两个内存单元之间不能直接传送数据。(eg:mov [1], [2] ×)

                       5、不能使用mov指令修改CS和IP的值。

                       6、两个段寄存器之间不能直接传送;不能把常数送到段寄存器。(eg:mov ds, cs × mov ds, 1000H ×

            形式:mov 寄存器,数据                                                       mov 内存单元,寄存器

                       mov 寄存器,寄存器                                                   mov 段寄存器,寄存器

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

                       mov 寄存器,段寄存器                                               mov 段寄存器,内存单元

                       mov 内存单元,数据                                                  

             mov [1],byte ptr 3和mov byte ptr [1],3

             因为数据3占用的字节数不确定,而计算机系统只执行确定的东西,用btye ptr 确定占用的字节数。

             add与sub形式几乎相同,以add为例:

                       add 寄存器,数据                                                        add 寄存器,寄存器

                       add 寄存器,内存单元                                                 add 内存单元,寄存器

             段寄存器不可以用在算术指令中。

    五、数据段

            用ds存放数据段的段地址,再根据需要,用相关的指令访问数据段的具体单元。

    六、栈

           特点:只能在一段进出。

                      后进先出。

    七、CPU提供的栈机制

           注:8086CPU中栈以字为单位。

           引入指令:PUSH(入栈:把数据存入栈)和POP(出栈:从栈取出数据)  

           栈顶:最后入栈的字数据所对应的地址单元。

           栈底:固定的一端,栈区最高地址单元的前一个单元

           栈为空时,栈顶指向栈底+2

           寄存器:SSSP

           SS:栈段段寄存器,用于存放栈段的「段地址」

           SP:栈指针寄存器,用于存放栈顶的偏移地址。

           (SS) × 16 + (SP) → 栈顶的物理地址

           任意时刻,SS:SP都指向栈顶元素。

           进栈: 栈顶上移两个单元,即: 栈顶-2 → 栈顶 ,存入数据。

           出栈: 栈顶下移两个单元,即: 栈顶+2 → 栈顶 ,取出数据。

    八、越界的问题

            当栈满的时候,再使用push指令入栈; 当栈空的时候,再使用pop指令出栈。

            编程时要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作也要注意,以防栈空的时候继续出栈而导致的超界。

            特别注意数据与代码的分离。

    九、push、pop指令

            形式:push 寄存器

                       push 段寄存器

                       push 内存单元

           注:1、栈的操作都是以为单位。

                  2、操作对象不能是常数。

                  3、pop 段寄存器中,段寄存器不能是CS和SS。

           栈的初始化条件:eg:mov ax,1000H

                                             mov ss,ax

                                             mov sp,0010H

    十、栈段

           一个栈段的最大容量为64KB

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

             用作数据段时,要把段地址→DS。

             用作栈段时,要把段地址→SS,栈顶偏移地址 → SP。

             用作代码段时,段地址→CS,要取的指令偏移地址→IP。但CS和IP的值不能使用mov改变。

  • 相关阅读:
    依赖注入
    Java实现一个字符串的反转
    LRU缓存介绍与实现 (Java)
    Java中HashMap遍历的两种方法(转)
    java中判断字符串是否为只包含数字
    LeakCanary 的使用遇到的弯路
    转: BAT等研发团队的技术博客
    转: android 内存检测工具 LeakCanary 说明
    转:安桌开发开源库的推荐1
    转: 技术牛人博客
  • 原文地址:https://www.cnblogs.com/Yangruzhang/p/9783421.html
Copyright © 2011-2022 走看看