曲曲的秘密学术基地

纯化欲望、坚持严肃性

欢迎!我是曲泽慧(@zququ),目前在深圳(ICBI,BCBDI,SIAT)任职助理研究员。


病毒学、免疫学及结构生物学背景,可以在 RG 上找到我已发表的论文

本站自2019年7月已访问web counter

汇编语言 3.6 3.7 栈 CPU栈机制

3.6 栈

栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。

栈有两个基本的操作:

入栈和出栈。入栈就是将新的元素放在栈顶,出栈就是从栈顶去除一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的这种操作规则被称为:LIFO1 (Last In First out)。

3.7 CPU提供的栈机制

8086CPU最基本的两个入栈和出栈指令PUSHPOPpush ax表示将寄存器ax中的数据送入栈中,pop ax表示从栈顶取出数据送入ax。8086CPU的入栈和出栈操作都是以字为单位进行的。

存在相应的寄存器来存放栈顶的地址,8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。

任意时刻,SS:SP指向栈顶元素。

push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

^_^ push ax的执行,由以下两步完成

  1. SP = SP - 2, SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
  2. 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

将10000H~1000FH这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP为0010H (指向栈的最高地址单元的下一位地址)。

将 10000H~1000FH这段空间当作栈段,SS=1000H,栈空间大小为16字节,栈最底部的字单元地址为1000:000E。任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=000EH。栈为空,就相当于栈中唯一的元素出栈,出栈后,SP = SP+2,SP原来为000EH,加2后SP=10H,所以,当栈为空的时候,SS=1000H,SP=10H。

换个角度看,任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈底部的字单元的偏移地址+2,栈最底部字单元的地址为1000:000E,所以栈空时,SP=0010H。

^_^ pop ax执行过程和push ax刚好相反,由以下两步完成。

  1. 将SS:SP指向的内存单元处的数据送入ax中;
  2. SP=SP+2, SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

注意,当执行pop指令时,弹出的数据依然存在,但是,它已不在栈中。当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。

Last One

LA3.3 The Complete Solution to Ax=b

Simply show the Row Echelon Form R with b at the right sideAt the LA3.2, we didn’t pay much attention to the right side $b$, it is because $b$ is $0$ when we only talk about the nullspace of A.For now, in LA3.3, $b$ is not zero. As the Row Echelon...…

数学More
Next One

在mac或者linux运行debug的优雅解决方案

I want to run debug in mac or linux sys, however, debug is only designed for windows.There are two ways: Just install the win virtual box (Recommend) install DOS virtual box DOSBox hereFor the DOSBoxWhen you have installed the DOSBox, firstly mo...…

汇编语言More