汇编语言 手记8
栈有两个基本的操作:入栈和出栈
入栈:将一个新的元素放到栈顶
出栈:从栈顶取出一个元素
栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。
栈的操作规则:LIFO
8086CPU提供相关的指令来以栈的方式访问内存空间。
入栈出栈指令:
PUSH(入栈)POP(出栈)
push ax 将寄存器ax中的数据送入栈中;
pop ax 从栈顶取出数据送入ax
均是以字为单位进行的。
字型数据用两个单元存放,高地址单元放高8位,低地址单元放低8位。
段寄存器SS 存放栈顶的段地址
寄存器SP 存放栈顶的偏移地址
任意时刻,SS:SP指向栈顶元素
push ax
1 sp=sp-2
2 将ax中的内容送入SS:SP指向的内存单元,SS:SP此时指向新栈顶。
当栈是空时,它指针会指向当前栈的最高地址的下一地址。
任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素。
所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2
栈最底部字单元的地址为1000:000E,所以栈空时,SP=0010H。
8086CPU的互作机理,只考虑当前的情况:
当前栈顶在何处
当前要执行的指令是哪一条。
将10000H-1000FH这段空间当作栈,初始状态是空的,将AX,BX,DS中的数据入栈
抹空操作
不用mov来实现写入操作
mov ax,1000H
mov ss,ax
mov sp,2
mov ax,2255H
push ax
push pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指定的。
push pop和mov不同的是,mov只需要一步传送;而push pop指令却需要两步操作。
执行push时:先改变sp,后向ss:sp处传送
执行pop时:现读取ss:sp数据,后改变sp.
任何时刻ss:sp指向栈顶元素
8086只记录栈顶,占空间的大小要自己管理
如果内存从10000H-1FFFF,描述栈为空时:
任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元的地址为1000:FFFE,所以栈空时,SP=0000H
CPU都是16为传送数据的,N<=64K.从栈操作指令所完成的功能的角度上来看,push pop等指令在执行的时候只修改SP.所以栈顶的变化范围是 0-FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0;如果再次压栈,栈顶将环绕,覆盖了原来的内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?