|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shuiyu 于 2017-6-29 22:21 编辑
小白刚学,不对的请各位大佬指正,谢谢
由于鱼C论坛的回档,我昨天的笔记消失了.... 所以今天先补回昨天的两个笔记。
一、栈段
(1)可以将长度为 N(N ≤64K )的一组地址连续、起始地址为16的倍数的内存单元,当作栈来用,从而定义了一个栈段。比如我们将10010H~1001FH 这段长度为 16 字节的内存空间当作栈来用,以栈的方式进行访问。这段空间就可以成为栈段,段地址为1000H,大小为16字节。
(2)如果我们将10000H~1FFFFH这段空间当作栈段,初始状态是空的,此时,SS=1000H,SP=?栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2。SP原来为FFFEH,加2后SP=10000,超出内存容量了,所以sp=0H,当栈为空的时候,SS=1000H,SP=0
(3)一个栈段最大可以设为多少?为什么?
因为8086cpu为16位的,故2的16次方,栈顶的变化范围是0~FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0;如果再次压栈,栈顶将环绕,覆盖了原来栈中的内容。所以一个栈段的容量最大为64KB。
二、总结
(1)我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。
我们可以用一个段存放数据,将它定义为“数据段”;
我们可以用一个段存放代码,将它定义为“代码段”;
我们可以用一个段当作栈,将它定义为“栈段”;
(2)不管我们如何安排 ,CPU 将内存中的某段内存当作代码 ,是因为CS:IP指向了那里;CPU将某段内存当作栈 ,是因为 SS:IP 指向了那里。
(3)一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。
检测点3.2
(1)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。
mov ax,1000H
mov ds,ax
mov ax,2000H 由于不能直接把数据传输到段寄存器,所以要用通用寄存器作为过渡。
————
mov ss,ax
————
mov sp,0010H 指向栈的最底部单元下面的单元,因为运行时sp要-2,所以会写入2000FH中
————
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
(2)补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中。
mov ax,2000H
mov ds,ax
mov ax,1000H 由于不能直接把数据传输到段寄存器,所以要用通用寄存器作为过渡。
————
mov ss,ax
————
mov sp,0 指向栈的最顶部单元,因为运行时sp要+2,所以会写入2000FH中.
————
pop [e]
pop [c]
pop [a]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢 |
评分
-
查看全部评分
|