汇编语言-03寄存器(内存访问)

寄存器

上一章笔记是从CPU执行指令的角度8086CPU的逻辑结构、形成物理地址的方法、相关的寄存器以及一些指令。这章节从访问内存的角度学习几个寄存器。

内存中字的存储

CPU中,用16 位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。

用0、1两个内存单元存放数据20000(4E20H) 。0 、1两个内存单元用来存储一个字,内存中字的存储单元可以看作一个起始地址为0的字单元(存放一个字的内存单元,由0、1两个字节单元组成)。对千这个字单元来说,0号单元是低地址单元,1号单元是高地址单元,则字型数据4E20H的低位字节存放在0号单元中,高位字节存放在1号单元中。同理,将2、3号单元看作一个字单元,它的起始地址为2。在这个字单元中存放数据18(0012H),则在2 号单元中存放低位字节12H,在3号单元中存放高位字节00H。

字单元的概念:字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。

DS和[address]

CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址。

在8086PC 中,
内存地址由段地址和偏移地址组成。8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。比如我们要读取10000H 单元的内容,可以用如下的程序段进行。

mov指令作用: 1.将数据直接送入寄存器;2.将一个寄存器中的内容送入另一个寄存器。

3.mov指令也可以将一个内存单元中的内容送入一个寄存器中。在指令中必须指明从哪一个内存单元送到哪一个寄存器。寄存器用寄存器名来指明,内存单元则需用内存单元的地址来指明。显然,此时mov指令的格式应该是:mov 寄存器名,内存单元地址。“[…]”表示一个内存单元, “[…]”中的0表示内存单元的偏移地址。只有偏移地址是不能定位一个内存单元的,在指令执行时,8086CPU自动取ds中的数据为内存单元的段地址

8086CPU不支待将数据直接送入段寄存器的操作,ds是一个段寄存器,所以mov ds,1000H这条指令是非法的。那么如何将1000H送入ds呢?只好用一个寄存器来进行中转,即先将1000H 送入一个一般的寄存器,如bx, 再将bx中的内容送入ds。

字的传送

mov指令在寄存器和内存之间进行字节型数据的传送。因为8086CPU 是16位结构,有16根数据线,所以,可以一次性传送16 位的数据,也就是说可以一次性传送一个字(两个内存单元)。只要在mov指令中给出16位的寄存器就可以进行16 位数据的传送了。

mov、add、sub指令

 此外,还有

mov 寄存器,段寄存器

例如:mov ax,ds

mov 内存单元,段寄存器 (因为段寄存器是16位,所以要占用两个字节/16位/四个十六进制,内存单元起始位为低位)

例如:

用a写好汇编指令,用t执行,用d查看。

mov [0000],cs 执行后, CS 中的数据(14E3H)被写入1000:0 处, 1000:1 单元存放14H, 1000:0 单元存放E3H 。

mov 段寄存器,内存单元

数据段

对千8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为N(N~64KB) 、地址连续、起始地址为16 的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。比如用123B0H~123B9H 这段内存空间来存放数据,我们就可以认为, 123B0H~123B9H 这段内存是一个数据段,它的段地址为123BH, 长度为10 个字节。

用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。比如,将123B0H ~ 123B9H的内存单元定义为数据段。现在要累加这个数据段中的前3个单元中的数据,代码如下。

小结

(1) 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
(2) 用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。.
(3) [address]表示一个偏移地址为address的内存单元。
(4) 在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
(5) mov、add 、sub 是具有两个操作对象的指令。jmp是具有一个操作对象的指令。

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

从程序化的角度来讲,应该有一个标记,这个标记一直指示着盒子最上边的位置。

栈有两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的这种操作规则被称为: LIFO(Last In First Out, 后进先出)。

CPU提供的栈机制

猜你喜欢

转载自www.cnblogs.com/aeolian/p/12815115.html