[汇编语言学习笔记][第三章寄存器(内存访问)]

第三章 寄存器(内存访问)

3.1 内存中字的存储

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

在以后我们称起始地址为N的字单元简称为N地址字单元

3.2 DS和[address]

DS寄存器,通过用来存放要访问数据的段地址。

  • 只能通过mov ds 寄存器修改ds的值
  • [address]代表偏移地址,光有偏移地址不能访问内存,段地址通过ds得到

例子:

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

3.5 数据段

当需要对数据段进行操作的时候,将ds 指向段地址,然后就能对其中的单元进行操作。

  • 对字节数据的访问

    add ax,[0]
    add ax,[1]
    add ax,[2]
  • 对字长数据的访问

    add ax,[0]
    add ax,[2] 

3.7 CPU提供的栈操作

  • SS:SP,存储栈指针的寄存器,时刻指向栈顶

    • SS :段地址

    • SP : 偏移地址、

  • 注意区分栈区指针是向上,还是向下走的,传统X86 CPU是向下走的,即高地址走向低地址(当sp变为0的时候能确认溢出

  • CPU 不会保证栈不溢出,需要注意栈的长度,但是貌似这种方式不好判断栈空

  • 栈的长度 通过设置sp确定

  • sp,ss 能够被 mov 修改,而cs,ip只能被jmp 修改(这是肯定的啊,因为特么cs,ip是指令指针,他改变了,就等于进行跳转,所以是jmp

3.10 栈段

  • 一个比较有意思的问题,纠正我对栈指针的一个错误认识

    如果将 10000H~1FFFFH 这段空间当作栈段,初始状态栈是空的,此时SS=1000H,SP=?

    我的答案:FFFFH

    正确答案:0000H,我的错误在于我认为栈指针指向的是栈顶元素上面一个内存空间,而实际上栈指针指向的就是栈顶元素,所以假设有一个元素,那么sp=FFFEH,当这个元素被pop掉后,sp=sp+2 变为0000H。

总结

所谓段只是人们确定的一种规定,数据段,代码段,栈段。

一段内存,即可以是代码的存储空间,也可是是栈的存储空间,也可以是数据的存储空间,也可是什么都不是,一切在于CS,IP,SS,SP,DS的指向

原文地址:https://www.cnblogs.com/zy691357966/p/5480524.html