shuiyu 发表于 2017-6-27 21:57:29

《零基础入门学习汇编语言》第十七讲

本帖最后由 shuiyu 于 2017-6-29 21:35 编辑

小白刚学,不对的请各位大佬指正,谢谢{:10_254:}

一、栈顶超界的问题
(1)当栈满的时候再使用push指令入栈,栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。(C语言的缓冲区溢出原理差不多)
(2)我们当然希望CPU 可以帮我们解决这个问题,但是8086CPU中并没有这样的寄存器。8086CPU的工作机理,只考虑两种情况:当前栈顶在何处;当前要执行的指令是哪一条。
(3)我们在编程的时候要自己操心栈顶超界的问题 ,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。


二、push、pop指令
(1)push和pop指令的格式(通用寄存器)
push 寄存器:将一个寄存器中的数据入栈
pop寄存器:出栈,用一个寄存器接收出栈的数据
例如:
push ax
pop bx
(2)push和pop指令的格式(段寄存器)
push和pop指令的格式
push 段寄存器:将一个段寄存器中的数据入栈
pop段寄存器:出栈,用一个段寄存器接收出栈的数据
例如:
push ds
pop es
(3)push和pop指令的格式(内存单元)
push内存单元:将一个内存单元处的字入栈(栈操作都是以字为单位)
pop 内存单元:出栈,用一个内存字单元接收出栈的数据
例如:
push
pop
(4)指令执行时 ,CPU 要知道内存单元的地址,可以在 push、pop 指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。
(5)push ax
1.将SS:SP指向的内存单元处的数据送入ax中;
2.SP = SP-2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

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



谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}


   
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第十七讲