汇编笔记---寄存器(内存访问)

前言:

从访问内存的角度来了解8086CPU的寄存器

内存中字的存储

CPU中使用16位寄存器来存储一个字。高8位存放在高字节,低8位存放在低8位

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

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

DS和[address]

8086CPU中,内存地址由以下组成:
1:段地址
2:偏移地址

8086CPU中,有一个DS寄存器地址,通常用来存放数据的段地址。
比如我们要读取10000H的单元内容,可以用如下的程序段进行。
mov bx,1000H
mov ds,bx
mov al,[0]
上面3条数据指令将10000H(1000:0)中的数据读到AL中
mov al,[0]
我们使用mov指令可以完成2种操作:
1:将数据直接送入寄存器
2:将一个寄存器中的数据送入到另外一个寄存器。

也可以使用mov指令将一个内存单元中的内容送入一个寄存器中。从哪个内存单元送到哪一个寄存器呢? 所以在指令中必须指明。寄存器用寄存器来指明,内存单元则用内存单元来指明。
[…] 表示一个内存单元。[…]中的0表示内存单元的便宜地址。我们知道,只有偏移地址是不能定位一个内存单元的。那么内存单元的段地址是多少呢? 执行指令时,8086CPU会自动取DS中的数据为内存单元的段地址。

如何用MOV指令从10000H中读取数据呢? 10000H用段地址和偏移地址表示为1000:0. 我们可以先讲1000H放入DS中。然后mov al,[0].就完成了传送。

mov 指令中[]表示操作的对象是一个内存单元。 [0]表示操作的是一个内存单元的偏移地址是0。它的段地址默认保存是放在ds中。执行指令时,CPU会自动从DS中取出。

如何把一个数据送入寄存器?
ds是一个段寄存器,8086CPU不支持将数据直接送入到短寄存器的操作。
那么如何将数据送入进去呢?
我可以在事前用一般的寄存器就好了。
mov bx,1000H
mov ds,bx

字的传送

因为8086CPU是16位结构,有16根数据线,所以,可以一次传输16位的数据,也就是可以一次性传送一个字
在这里插入图片描述
在这里插入图片描述

mov、add、sub指令

mov 寄存器,数据 比如:mov ax,8
mov 寄存器,寄存器 比如:mov ax,bx
mov 寄存器,内存单元 比如:mov ax,[0]
mov 内存单元,寄存器 比如:mov [0],ax
mov 段寄存器,寄存器 比如:mov ds,ax
mov 寄存器,段寄存器 比如:mov ax,ds
mov 内存单元,段寄存器 比如:mov [0],ds

add 内存器,数据 比如:add ax,8
add 内存器,寄存器 比如:add ax,bx
add 内存器,内存单元 比如:add ax,[0]
add 内存单元,寄存器 比如:add [0],ax

sub 寄存器,数据 比如:sub ax,9
sub 寄存器,寄存器 比如:sub ax,bx
sub 寄存器,内存单元 比如:sub ax,[0]
sub 内存单元,寄存器 比如:sub [0],ax

注:jmp是一个操作对象的指令,段寄存器中不能出现add,sub

在数据结构中我们学习了栈的定义,知道栈是一个先进后出的特殊的存储空间(LIFO)

栈有两种基本操作:入栈(push),出栈(pop)
入栈:将一个新的元素放到栈顶
出栈:从栈顶取出一个元素

CPU提供的栈机制

8086CPU提供入栈和出栈指令,最基本的就是PUSH和POP
在这里插入图片描述
在这里插入图片描述
CPU如何知道栈顶的位置?
段寄存器SS和寄存器SP,栈顶的段地址放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。

push ax的执行步骤:

  1. SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新栈顶
  2. 将ax中的内容送入SS:SP指向的内存单元出,SS:SP此时指向新的栈顶
    在这里插入图片描述
    在这里插入图片描述
    任意时刻,SS:SP指向栈顶元素,当栈顶为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元地址为1000:000E,所以栈空时,SP=0010H
    pop ax的执行过程:
    (1)将SS:SP指向的内存单元处的数据送入ax
    (2)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶
    在这里插入图片描述

push、pop指令

push和popo指令的格式:
push 寄存器 ;入栈,将一个寄存器中的数据入栈
pop 寄存器 ;出栈,用一个寄存器接收出栈的数据

push 段寄存器 ;入栈,将一个寄存器中的数据入栈
pop 段寄存器 ;出栈,用一个寄存器接收出栈的数据

push 内存单元 ;入栈,将一个寄存器中的数据入栈(栈操作都是以字为单位)
pop 内存单元 ;出栈,用一个寄存器接收出栈的数据

注:push和pop指令同mov指令不同,CPU执行mov指令只需要一步操作,就是传送,而执行push,pop指令却需要两部操作。
执行push时,CPU的两部操作是:先改变SP,然后向SS:SP处传送。
执行pop时,CPU的两部操作是:先读取SS:SP,然后改变SP

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值