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

2023-09-20

汇编语言之内存访问(寄存器) (https://ic.work/) 物联网 第1张

DS和[address]

  1. CPU读写一个内存单元时,必须要先给出这个内存单元的地址.
  2. 内存地址由段地址偏移地址组成.
  3. 数据段寄存器DS( Data Segment ), 用来存放要访问数据的段地址.
mov BX, 1000H  #向BX寄存器中写入1000H
mov DS 
BX #将BX寄存器中的值移入DS寄存器 mov AL,[0] #将地址单元1000h:0中的值移入AX寄存器中的低位. #"[]"说明操作对象是一个内存单元
  1. "[...]"表示一个内存单元, [0] 表示内存单元的偏移地址为0. 在执行指令时8086CPU自动读取DS寄存器中的数据作为内存单元的 段地址 .
  2. 因为8086CPU的硬件设计无法使用mov指令直接对DS寄存器写入数据.
  3. 段寄存器:
  • 代码段寄存器CS(Code Segment).
  • 数据段寄存器DS(Data Segment).
  • 堆栈段寄存器SS(Stack Segment).
  • 附加段寄存器ES(Extra Segment).
    例题:

汇编语言之内存访问(寄存器) (https://ic.work/) 物联网 第2张

mov、add、sub指令

  1. mov
    • mov 段寄存器, 寄存器.
    • mov 寄存器, 段寄存器.
    • mov 内存单元, 寄存器.
    • mov 内存单元, 段寄存器.
    • mov 段寄存器, 内存单元.
  2. add和sub
    • 不能对段寄存进行操作.

CPU提供的栈机制

  1. 栈(stack), 有两个基本操作: LIFO(Last In First Out)
    1. 入栈: 将新元素放入栈顶.
    2. 出栈: 从栈顶取出一个元素.
  2. 8086CPU提供入栈(PUSH)和出栈(POP)指令. 例如:
    1. push ax : 表示将寄存器ax中的数据送入栈中.
    2. pop ax : 表示从栈顶取出数据送入ax.
  3. 注意: 在8060CPU中push/pop操作都是以word(16 bits)为单位. 图例:
    汇编语言之内存访问(寄存器) (https://ic.work/) 物联网 第3张
  4. CPU如何知道栈顶的地址?
    1. 8086CPU中有两个寄存器:
      • 段寄存器SS.
      • 寄存器SP.
        *任意时刻,SS:SP 都指向栈顶元素.

push、pop指令

1. push/pop 寄存器
2. push/pop 段寄存器
3. push/pop 内存单元
  1. 将10000H~1000FH这段空间作为栈, 初始栈是空的, 将AX, BX, DS中的数据入栈.
分析:
1. 需要设置栈空间.则需要设置SS:SP.
2. push AX BX DS.
代码:
mov ax, 1000   ;将段地址写入寄存器ax.
mov ss, ax     ;将ax寄存器中的值写入ss段寄存器.
mov sp, 0010   ;将偏移地址写入sp寄存器.


;将AX, BX, DS中的数据入栈
push ax
push bx
push ds

栈段

  • 栈段就是将一组地址连续, 起始地址为16的倍数的内存单元当作栈空间来使用.
  • 栈段的最大容量为64KB. 因为在执行push, pop指令时只修改SP, 而SP的变化换位是0-FFFFH, 所以为64KB.

文章推荐

相关推荐