| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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]   
 
 
 
 
谢谢小甲鱼带来的视频教程,感谢!!    
 
 
    
本节结束,多谢览阅! 
小白刚学,不对的请各位大佬指正,谢谢   |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |