[汇编语言学习笔记][第三章寄存器(内存访问)]
第三章 寄存器(内存访问)
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的指向