汇编语言——寄存器

时间:2023-01-29 01:24:59

8086CPU中
字节:8bit
字=2字节=16bit
给出物理地址的方法:
物理地址(20位)=基础地址+偏移地址,段地址×16(即16进制左移1位)可看做是基础地址。
段寄存器:CS、DS、SS、ES
CS和IP是8086中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。8086CPU中,mov指令不能用于设置CS、IP的值,而是另外用转移指令来改变(这里不深究)。可以用JMP指令同时修改CS、IP的值,形如“ jmp 段地址:偏移地址 ”,含义上似“mov CS,xx mov IP,xx”。
内存中字的存储:
高地址内存单元存放字型数据的高位字节,低地址内存单元存放字型数据的低位字节。字单元:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。
DS寄存器:通常用来存放要访问数据的段地址。
8086CPU不支持将数据直接送入段寄存器的操作,
栈:先进后出的访问方式的存储空间。8086CPU提供相关的指令来以栈的方式访问内存空间(引出问题:cpu怎么判断或者说如何把一段内存空间以栈的形式使用?)。8086cpu提供PUSH(入栈)和POP(出栈)指令,都是以字的单位进行的。
两个问题:
1.如何知道那部分内存空间被当做栈使用?
2.执行push和pop指令时,如何知道那个单元是栈顶单元?

08086cpu中,有两个寄存器:段寄存器SS和寄存器SP,任意时刻SS:SP指向栈顶元素。PUSH ax的执行,由一下两步完成:1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
栈满再入栈或者栈空再出栈都将发生栈顶超界的问题(8086不提供栈顶栈底的检测界限寄存器)。
段的综述:
在编程中,可以根据需要将一组内存单元定义为一个段,可以将长度为N(n<=64KB)的一组地址连续、起始地址为16的倍数的内存单元,当做数据段、代码段或栈段。(CPU并不会由于我们内存空间当做栈来使用就在执行push、pop的栈操作指令时自动地将我们定义的栈段当做栈空间来访问。)
对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,cpu就将我们定义的数据段中的内容当做数据来访问。
对于代码段,将它的段地址放在CS中,将短重第一条指令的偏移地址放在IP中,这样cpu就将执行我们定义的代码段中的指令。
对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样cpu在需要进行栈操作的时候,比如执行push、pop指令等,就将我们定义的栈段当做占空间来使用。