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

3.1 内存中字的存储

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

内存单元中存放数据20000(4E20H):
在这里插入图片描述

字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成,高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据低位字节
内存中存储字单元采用高高低低原则分开存储

3.2 DS和[address]

CPU要读写一个内存单元时,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成,8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址

读取10000H单元中的内容时,可以采用如下程序:
mov bx,1000H
mov ds,bx
mov al,[0]
[ ]表示一个内存单元,[ ]中的0表示内存单元的偏移地址
上面的指令将10000H(1000:0)中的数据读到al中

只有偏移地址是不能定位一个内存单元的,执行指令时,8086CPU自动取ds中的数据作为内存单元的段地址

8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器,直接将1000H送入ds是非法的,所以使用一个寄存器来进行中转,即先将1000H送入一个一般的寄存器,如bx,再将bx中的内容送入ds

3.3 字的传送

8086CPU是16位结构,一次可以传送16位的数据,在mov指令给出16位寄存器就可以进行16位数据的传送

mov ax,1000H   内存情况示意: 10000H 23
mov ds,as					 10001H 11
mov ax,11316				 10002H 22
mov [0],ax					 10003H 11
sub bx,[2]
mov [2],bx

指令分析:
在这里插入图片描述
从CPU寄存器内16位字单元读写到8位内存单元时,对偏移量处理时:
如果写入到al,bl等中,取一个内存单元
如果写入到ax,bx等中,取两个内存单元,并遵从高高低低的原则进行读写

3.4 mov,add,sub指令

mov可以对内存单元,普通寄存器,段寄存器进行操作
add和sub不能对段寄存器进行操作

3.5 数据段

8086CPU可以将一组内存单元定义为一个段,比如用123B0H-123B9H这段内存空间来存放数据,就可以认位,123B0H-123B9H这段内存是一个数据段,它的段地址位123BH,长度为10个字节

在这里插入图片描述
在这里插入图片描述

3.6 栈

栈是一种具有特殊访问方式的存储空间,遵从先入后出的原则

从程序化的角度来讲,应该有一个标记,这个标记一直指示着栈顶的元素

3.7 CPU提供的栈机制

基于8086CPU编程时,可以将一段内存当作栈来使用

8086CPU提供入栈和出栈指令,最基本的是push(入栈)和pop(出栈),8086CPU的入栈和出栈操作都是以字为单位进行的

将10000H-1000FH这段内存当作栈使用时:
在这里插入图片描述
在8086CPU内有相应的寄存器存放栈顶的地址,段寄存器 SS和寄存器 SP,栈顶的段地址存放在SS中,偏移地址存放在SP中
任意时刻,SS:SP指向栈顶元素,push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址

push指令执行的过程:
在这里插入图片描述
入栈时,地址从高地址向低地址方向增长

pop指令的执行过程:
在这里插入图片描述
出栈后,SS:SP指向新的栈顶1000EH,pop前的栈顶元素依然存在,但是已经不在栈中,当再次执行push入栈时,SS:SP移动到1000CH,并向其中写入新的数据,原数据将被覆盖

栈空时的状态:
在这里插入图片描述
栈空时,栈顶指针指向栈空间最高地址单元的下一个单元

3.8 栈顶超界的问题

在这里插入图片描述
当操作不注意时,栈满时使用push或栈空时使用pop都可能会发生栈顶超界问题

栈顶超界是危险的,我们安排了一段空间为栈,那么栈空间之外的空间里可能存放了具有其它用途的数据,代码等,这些数据,代码可能是我们程序中的,也可能是别的程序中的,但由于出栈和入栈时的不注意,将这些代码意外的改写,会引起一连串的错误

8086CPU不保证我们对栈的操作不会超界,它只知道栈顶在何处(由SS:SP)指示,而不知道我们安排的栈空间有多大,在编程中要自己操心栈超界问题

3.9 push,pop指令

push和pop不仅可以对寄存器内的值进行操作,还可以在内存单元与内存单元之间传送数据

指令执行时,CPU要知道内存单元的地址,可以在push,pop指令中只给出内存单元的偏移地址,段地址在指令执行时,CPU从ds得到

push,pop等栈操作指令,修改的只是SP,SS:SP来提供栈顶

3.10 栈段

将一段内存当作栈段,仅仅是我们编程时的一种安排,CPU并不会由于这种安排,在执行push,pop指令时自动将我们定义的栈段空间当作栈空间来访问,通过SS:SP指向栈顶和push,pop等操作来访问我们定义的栈段

实验2 用机器指令和汇编指令编程

段地址是放在寄存器中的,在D命令后面直接给出段地址,是debug提供的一种直观的操作方式,D命令是由debug执行的,debug在执行 d 1000:0时,也会先将段地址1000H送入段寄存器

在这里插入图片描述

当用t命令时,发现mov sp,10并没有按部实现,但其值已经被更改

一般情况下,用t命令执行一条指令时,会停止继续执行,显示当前CPU各个寄存器的状态和下一步执行的指令,但t命令执行mov sp,10没有做到这点

debug的t命令在修改寄存器ss的指令时,下一条指令也紧接着被执行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值