第三章 寄存器(内存访问)
内存中字的存储
8086CPU中,一个字的大小是2Bytes.
所以内存中存储一个字需要两个连续的存储单元. 低位字节存放这个字的低八位, 高位字节存放这个字的高八位.
字单元: 存放一个字的两个连续的字节.
DS和[address]
DS(Data Segment)寄存器, 这个寄存器一般是用来存储要访问的数据型的地址的段
mov指令
当我们使用mov指令修改寄存器的值时, 直接给非通用寄存器传值是不允许的, 但是可以把另一个合法寄存器的值传给非通用寄存器. 从而间通过mov指令修改非通用寄存器的值
mov指令也可以将某个内存里的值传给寄存器, mov 寄存器 [该内存的偏移值]
只有偏移值肯定无法得到物理地址, 段地址是DS中的值
通过这种方式将 内存1000:0 中的值传给了 bx寄存器
将AL寄存器中的数据送入内存1000:0中
mov , sub, add是具有两个操作对象的指令, jmp 是一个操作对象的指令
CPU提供的栈机制
8086CPU提供了两个操作栈的指令, PUSH(入栈), POP(出栈).push ax
将寄存器ax中的数据压入栈内, 入栈和出栈都是以字为单位的.
CPU是怎么可以一直知道栈顶在哪个位置呢?原来是SS(stack segement)和SP(stack pointer)两个寄存器SS:SP指向了栈顶,由栈这种结构的特性可以知道, 栈顶地址从高地址向低地址方向变化
执行一次PUSH
SS不变 SP = SP -2
执行一次POP
SS不变 SP = SP+2
当一段栈空间为空时, 初始SS:SP指向这段栈内存的最高地址+1
注意PUSH 和 POP 改变的是SP , 不是内存里的数据
8086CPU没有确定栈的空间大小的机制, 他只根据SS:SP 确定栈顶的位置, 所以容易发生栈顶出界的情况.
mov, push, pop指令都可以向内存传输数据, 不同的是, mov指令传输数据只有传输这一步, 而push指令会先执行 SP = SP - 2 移动到新的栈顶, 然后进行数据传输, POP 指令首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数中,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4:
一段内存既可以是数据段, 也可以是代码段, 也可以是栈段, 取决于我们怎样利用不同的指针以什么样的方式去使用这段内存.