在第三章的学习中,我们开始更深入地学习寄存器。
(一)字在内存中的存储与内存单元地址
在第二章中,我们了解到,在CPU中,用16位寄存器来存储一个字,但是由于内存单元是字节单元(即在一个单元内只能存放一个字节),所以一个字要用两个内存单元来存放。举个例子,我们用0、1两个单元来存放数据4E20H,0号单元为低地址单元,1号为高地址单元单元,分别存放它的低位、高位数据。由此,我们提出字单元的概念:由两个地址连续的内存单元组成,用来存放一个16位数据的内存单元。,一般我们将起始地址为N的字单元简称为N地址单元。
(二)字的传送
CPU要读取一个内存单元需要给出这个单元的地址,它的段地址通常存放在DS寄存器中,举个例子,我们要读取地址为10000H单元的内容,可以用如下代码:
mov bx,1000H
mov ds,bx
mov ax,[0]
上面指令的作用是将内存10000H中的数据读到al中
[...]代表一个内存单元,[]里面的为其偏移地址,例如[0]代表ds:0地址的内存单元
从第二章我们知道,通过mov指令我们可以将数据在寄存器和内存中传输,执行指令时,CPU会自动从ds中取出段地址
注意,8086CPU不支持直接将数据送入段寄存器
关于mov,sub,add命令我们已经在上一章介绍的很详细了,就不再多提了
在编程时,为了存放数据,我们可以将一组内存单元定义为一个段专门用于存放数据,这就是数据段。具体操作时,我们一般用DS存放数据段的段地址,再根据需要访问数据段中的具体单元。
(三)栈和栈段
栈是一种具有特殊访问方式的储存空间,最后进入这个空间的数据,最先出去。
栈有两个基本的操作:入栈和出栈。入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。栈顶的元素总是最后入栈,又在出栈时最先出栈(即LIFO规则)
CPU提供PUSH(入栈)和POP(出栈)的指令操作,我们在编程时,可以将一段内存当作栈来使用。push ax 代表将寄存器ax中的数据送入栈中,pop ax代表从栈顶取出数据送入ax。
8086中SS和SP寄存器分别用来存放栈顶段地址和偏移地址,通过SS和SP设定的栈空间称为栈段,最大为64KB。CPU提供的出栈、入栈操作都是以字为单位的。SS:SP永远指向栈顶单元。
push ax:将SP=SP-2,再将数据存放到SS:SP开始的两个内存单元中
pop ax;将SS:IP处存放的字放入到ax,再将SP=SP+2,更新栈顶。
(四)检测点
检测点3.1:
(1)ax=2662H;bx=E626H;ax=E626H;ax=2662H;bx=D6E6H;ax=FD48H;ax=2C14H;ax=0;ax=00E6H;bx=0;bx=0026H;ax=000CH;
(2)
指令 执行指令后:CS IP DS AX BX
mov ax,6622H 2000H 0003H 1000H 6622H 0
jmp 0ff0:0100 0ff0H 0100H 1000H 6622H 0
mov ax,2000H 0ff0H 0103H 1000H 2000H 0
mov ds,ax 0ff0H 0105H 2000H 2000H 0
mov ax,[8] 0ff0H 0108H 2000H C389H 0
mov ax,[2] 0ff0H 010BH 2000H EA66H 0
检测点3.2:
(1)mov ax,2000H; mov ss,ax;mov sp,10H
(2) mov ax,1000H;mov ss,ax;mov sp,0H
原文地址:https://www.cnblogs.com/makise-kurisu/p/9912333.html