《零基础入门学习汇编语言》第十九讲和检测点3.2
本帖最后由 shuiyu 于 2017-6-29 22:21 编辑小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
由于鱼C论坛的回档,我昨天的笔记消失了....{:10_266:} 所以今天先补回昨天的两个笔记。
一、栈段
(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
push
push
push
push
push
push
push
(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
pop
pop
pop
pop
pop
pop
pop
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
小白刚学,不对的请各位大佬指正,谢谢{:10_254:} 打卡
mov ax,1000H 由于不能直接把数据传输到段寄存器,所以要用通用寄存器作为过渡。
————
mov ss,ax
————
mov sp,0 指向栈的最顶部单元,因为运行时sp要+2,所以会写入2000FH中. 这个2000f中是否应该改为1000f sp指向0E然后sp才变为0 mov ax,1000H 由于不能直接把数据传输到段寄存器,所以要用通用寄存器作为过渡。
————
mov ss,ax
————
mov sp,0 指向栈的最顶部单元,因为运行时sp要+2,所以会写入2000FH中.
这一句搞不明白 sp的值是0000H 不是声明这个栈是空的吗?
页:
[1]