• 汇编语言程序设计第三章


    第三章 寄存器(内存访问)

    1 内存中字的存储

     1个字=2个字节,如从0开始存放20000(4E20H),20、4E分别表示1个字节,内存中字的存储如下图所示:
         
         任何两个地址连续的内存单元(0、1、2......),N号单元和N+1号单元,可以看成两个内存单元。比如说上图中的0内存单元(字节单元,存放的是字节型数据,就是20H(十进制的32);0地址字单元,存放字型数据,就是4E20H。
         任何两个地址连续的内存单元,N号单元和N+1号单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。比如上图中1字单元中,所代表的字是124EH,高位字节单元是2内存单元——12H低位字节单元是1内存单元——4EH
     
    2 DS和[address]
         CPU读取内存单元时,必须先读取到这个内存单元的地址。8086CPU中,内存地址是由段地址和偏移地址组成,8086CPU中有一个DS寄存器,用来存放要访问的数据的段地址。
    例子:读取10000H单元的内容,可以用这样的一段代码来实现:
              mov bx,1000H
              mov ds,bx
              mov al,[0]
         使用mov指令,可以完成两种传送:将数据直接送入寄存器;将一个寄存器中的内容送入另一个寄存器。mov指令还能够将一个内存单元中的内容送入一个寄存器。那么mov al,[0] ,就是将内存单元中,偏移地址为0的内存单元中的内容放入到ax通用寄存器中的低八位al(8位)中。一个段地址对应一个偏移地址,上面的代码中,段地址为1000,对应的偏移地址为0。
     
    3 字的传送
         8086CPU是16位结构,有16根数据线,所以一次性可以传送16位的数据,也就是一次性传送1个字(1个字=2个字节=16位)。
         如下代码:
              mov bx,1000H
              mov ds,bx
              mov ax,[0] ---->这里是将1000:0处的字型数据(1个字,16位)送入到ax(16位)当中
              mov [0],cx ---->这里是将cx(16位)中的数据放入到1000:0(16位)内存单元中。
     
    4 mov,add,sub指令
          mov指令的几种形式
         mov 寄存器,数据       如mov ax,2C3B
         mov 寄存器,寄存器      如mov bx,ax
         mov 寄存器,内存单元      如mov ax,[0]
         mov 内存单元,寄存器       如mov [0],bx
         mov 段寄存器,寄存器       如mov ds,ax

    add 和 sub 指令同 mov 一样,都有两个操作对象。

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

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

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

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

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

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

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

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

    5 数据

          8086PC机,我们可以根据需要将一组内存单元定义为一个段。我们可以将一组长度为N(N<=64K)、地址连续、起始地址为16的倍数的内存单元,当作专门存储数据的内存空间,从而定义了一个数据段。

          如何访问数据段中的数据呢?将一段内存当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用 ds 存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。

    6 栈

          栈顶的元素总是最后入栈,需要出栈时,又最先从栈中取出。

    7 CPU提供的栈机制

          现今的CPU中都有栈的设计。8086CPU提供相关的指令来以栈的方式访问内存空间。这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。

          段寄存器SS 存放栈顶的段地址,寄存器SP 存放栈顶的偏移地址。任意时刻,SS:SP 指向栈顶元素。

    8 栈顶超界的问题

          栈顶越界是危险的:因为我们既然将一段空间安排为栈,那么在栈空间之外的空间里很可能存放了具有其它用途的数据、代码等,这些数据、代码可能是我们自己的程序中的,也可能是别的程序中的。但是由于我们在入栈出栈时的不小心,而将这些数据、代码意外地改写,将会引发一连串的错误。

          我们在编程的时候要自己操心栈顶越界问题,要根据可能用到的最大栈空间来安排栈的大小,防止入栈的数据太多而导致的越界。执行出栈操作的时候也要注意,以防止栈空的时候继续出栈而导致的越界。

    9 push,pop指令

    push和pop指令是可以在寄存器和内存之间传送数据的。

    push和pop指令的格式(1)

    push 寄存器          将一个寄存器中的数据入栈

    pop 寄存器            出栈,用一个寄存器接收出栈的数据

    push和pop指令的格式(2)

    push 段寄存器            将一个段寄存器中的数据入栈

    pop 段寄存器             出栈,用一个段寄存器接收出栈的数据

     
  • 相关阅读:
    oracle之is null和is not null的优化
    oracle命令导出/导入
    Linux环境下后台启动运行jar并设置内存
    阿里云手动安装git客户端
    阿里云安装maven
    python 迭代器
    ThreadPoolExecutor构造器参数详解
    CVE-2020-13957 solr未授权复现
    CVE-2020-9496 apache ofbiz xml-rpc反序列化漏洞分析
    REST API介绍
  • 原文地址:https://www.cnblogs.com/sqy1999/p/9813631.html
Copyright © 2020-2023  润新知