汇编语言(3)——寄存器(访问内存)

内存中字的存储

8086CPU 中使用的寄存器是16位的。但是内存中内存单元是字节单元,即一个单元存放一个字节,则一个字需要用两个地址连续的内存单元来存放。

DS和[address]

8086CPU 中有一个 DS 寄存器,通常用来存放要访问数据的段地址。
其中 [address] 表示内存地址的偏移地址,所以最终的物理地址为 ds * 4 + address
将 1000H 内存中的数据存入寄存器 al

mov bx 1000H
mov ds bx
mov al [0]

数据段

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

CPU提供的栈机制

8086CPU 提供相关的指令来以栈的形式来访问内存,其中有 push 和 pop指令,入栈和出栈操作都以字为单位
和CPU获取当前指令的方式相同,CPU 获取栈顶位置的方式也是通过两个寄存器:SS,SP。其中SS是段寄存器,SP记录偏移地址,即 SS:SP 指向了当前栈顶的地址。

push指令过程
在这里插入图片描述
pop指令过程
在这里插入图片描述
观察上图,我们需要注意,pop操作后,SS:SP 指向了1000E,但是原来1000C处的数据依然还在该内存中,不过不在栈中,下次push操作将会将其覆盖。
8086CPU 入栈时,栈顶从高地址向低地址方向增长。

push 寄存器/段寄存器/内存
pop 寄存器/段寄存器/内存

push和pop实质就是一种内存传送指令,可以在内存和寄存器之间传送数据。

栈顶超界问题

虽然通过 SS:SP 可以得知栈顶,但是我们还需要能够知道栈的范围,即需要保证在出栈和入栈时不会有超出栈的空间。
在这里插入图片描述
在这里插入图片描述
8086CPU无法解决这个问题,他不会检查是否越界,因此那时的程序员编程需要格外小心,现代CPU应该解决了,留个坑。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值