汇编语言内存单元地址的算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言内存单元地址的算法相关的知识,希望对你有一定的参考价值。

首先要了解的是CPU要处理的数据是存在内存中的,当CPU要处理某些数据时首先要将数据从内存中读取到CPU的寄存器中。内存的结构是以8个位(bit)为一个单元,由许多这样的单元组成了内存。就像一栋大楼是有许多个房间组成,每个房间的空间就是8个位。而数据存在内存的某一个或某一段单元中,CPU要读取怎么才能从这么多单元中找到呢,就是靠内存地址。内存地址就像我们的门牌号。有了这个,只要告诉CPU地址是多少,CPU就会从这段地址中读取数据。我们将内存中的一个单元的地址编为1,那么只要按顺序就会有2,3,4,5。。。。等等每个内存都会有个明确的地址编号。寻址范围,就是指CPU所能查找到的最小地址和最大地址。假如CPU的地址线是8位的,那么用二进制表示就是1111
1111。也就是说CPU访问内存从最小的0000
0000这个单元,一直到1111
1111这个单元。这是二进制,转换成十进制就是255.也就是说,CPU可以访问的内存地址编号从0~255.这就是CPU的寻址范围。
你的串号我已经记下,采纳后我会帮你制作
参考技术A

对于 80x86 的汇编语言来说,内存单元的物理地址,是:

  段寄存器的内容 × 16 + 指针寄存器的内容

对于 MCS-51 的汇编语言来说,内存单元的地址,取决于硬件的连线。

  每个存储单元的地址,究竟是多少? 这是要看电路图的。

  硬件连线,这可是高技术!即使跟你讲上几句话,你也难以理解的。

王爽《汇编语言》第三版 第三章 内存访问

3.1 内存中字的存储

  在0地址处开始存放20000(4E20H):

  

  注意:0号单元是低地址单元,1号单元是高地址单元。

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

 

 

3.2 DS和[address]

  在8086PC中,内存地址由段地址和偏移地址组成,8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。

 

  执行指令时,8086CPU自动取DS中的数据为内存单元的段地址。

 

3.3 字的传送


3.4 mov、add、sub指令

 

  已学mov指令的几种形式:
    1.mov 寄存器,数据
    2.mov 寄存器,寄存器
    3.mov 寄存器,内存单元
    4.mov 内存单元,寄存器
    5.mov 段寄存器,寄存器

  mov 寄存器,段寄存器 与 mov 内存单元,段寄存器 是正确的指令。


3.5 数据段

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


3.6 栈

  栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。

  栈的操作规则:LIFO(Last In First Out,后进先出)。

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

  
3.7 CPU提供的栈机制

  我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。

  8086CPU的入栈和出栈操作都是以字为单位进行的。

  push ax
    1.SP=SP–2;
    2.将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

  pop ax
    1.将SS:SP指向的内存单元处的数据送入ax中;
    2.SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。


3.8 栈顶超界的问题

  8086CPU不保证对栈的操作不会超界。


3.9 push、pop指令

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

  栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。


3.10 栈段

  对于8086PC机,在编程时,我们可以根据需要 ,将一组内存单元定义为一个段。

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

 

 

参考资料:《小甲鱼汇编零基础入门》

 

     《汇编语言》第三版

 

以上是关于汇编语言内存单元地址的算法的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言-05[BX]和loop指令

汇编语言-05[BX]和loop指令

汇编语言 第三章 寄存器

汇编语言 第三章 寄存器(内存访问)

汇编语言 第三章

汇编语言学习分享