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

1、内存中字的存储

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

2、DS和[address]

8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。

8086CPU不支持将数据直接送入段寄存器的操作,需要一个寄存器进行中转。即将段地址送入一个一般的寄存器,如bx,再将bx中的内容送入ds。

"[...]"表示内存单元,其中的数字表示内存单元的偏移地址。

3、字的传送

8086CPU是16位结构,有16根数据线,所以可一次传送16位的数据,也即一次性传送一个字。只要在mov 指令中给出16位的寄存器就可以进行16位数据的传送。

move bx,1000H

mov ds,bx

mov ax [0]    ;1000:0处的字型数据送入ax

mov [0],cx     ;cx中的16位数据送到1000:0处

4、mov、add、sub指令

add和sub指令同mov一样,都用两个操作对象:

add/sub 寄存器,数据

add/sub  寄存器,寄存器

add/sub  寄存器 ,内存单元

add/sub 内存单元,寄存器

5、数据段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。可以将一组长度为N(N<=64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。

6、栈

栈是一种具有特殊的访问方式的存储空间。即后进先出LFIO(Last In First Out)

7、CPU提供的栈机制

8086CPU提供相关的指令来以栈方式访问内存空间。可以在编程时,可以将一段内存当作栈使用。

指令:

PUSH (入栈)、POP(出栈)。push ax表示将寄存器ax中数据送入栈中,pop ax表示从栈顶取出数据送入ax。两个操作都是以字为单元进行的。

CPU如何知道栈顶的位置?8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

以下描述了8086CPU对push指令的执行过程。

可看出8086CPU中,入栈时,栈顶从高地址向低地址方向增长。

以下描述了8086CPU对pop指令的执行过程。

8、栈顶超界的问题

当栈满的时候再使用push指令入栈,或栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。

8086CPU不保证对栈的操作不会超界,它只考虑当前的情况:当前的栈顶在何处、当前要执行的指令是哪一条。所以在编程的时候要自己操心栈顶超界的问题。

9、push、pop指令

push和pop指令是可以在寄存器和内存(栈空间也是内存空间一部分)之间传送数据的。

push和pop指令的格式如下形式:

push 寄存器    ;将一个寄存器中的数据入栈

pop  寄存器      ;出栈,用一个寄存器接收出栈的数据

push 段寄存器   ;将一个段寄存器中的数据入栈

pop 段寄存器     ;用一个段寄存器接收出栈的数据

push 内存单元    ;将一个内存单元处的字入栈(栈操作都是以字为单位)

pop 内存单元     ;出栈,用一个内存单元接收出栈的数据

 

mov ax,1000H

mov ds,ax                     ;内存单元的段地址要放在ds

push [0]                         ;将1000:0处的字压入栈中

pop [2]                           ;出栈,出栈的数据送入1000:2处

10、栈段

可以将长度为N(N<=64KB)的一组地址连续、起始地址为16的倍数的内存单元,当作栈空间来用,定义一个栈段。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值