当前位置:首页 » 服务存储 » 栈段存储范围
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

栈段存储范围

发布时间: 2022-11-06 03:54:26

‘壹’ 末单元地址为什么等于首单元物理地址加容量再减一 那求堆栈段在存储器中的物理地址范围为什么不减一

因为第1~n个存储空间,对应首地址的偏移量为0~n-1。
最简单的例子,第一个地址(其实也就是首地址)难道要首地址加1?
这是数数的逻辑。
至于物理地址范围,是首地址~尾地址啊,跟减1不减1有关系么?

‘贰’ 在8086中定义一个堆栈段其空间最大为多大

由于SP的变化范围为0000H~FFFFH,(H表示16进制数

其中需要注意的一点是,当栈满的时候,SP=0000H (由于8086压栈是由高地址端(FFFFH)到低地址端(0000H),SP不断减小),继续压栈,SP溢出(不会影响SS),将会让SP从FFFFH端向0000H端环绕,能够覆盖之前的值,也就是绝对地址最大范围也就和SP的最大范围相同

SP可以指向的每个单元大小对应1Byte(这个单元大小和SP变化范围无关),由SP的变化范围可知SP可表示为16位二进制数,最大容量应该为

2^16Byte=64KB

或者根据共有FFFFH+1个单元,

(FFFFH-0000H+1)*1Bit=10000H(Byte)
=2^16(Byte)
=64KB

绝对地址计算方法(其实和CS:IP的计算方法相同):

StackAddress=StackSegment*16+StackPointer;

其中*16可以表示为二进制数向左移动四位,对应16进制左移一位(加0)就可以了

StackAddress=100F0+01A1
=10291(十六进制)

‘叁’ 堆栈段为什么小于等于64KB

一个段,是在段寄存器不变的条件下,偏移地址可变,所确定的范围。
偏移地址的变化范围,就是0000H~FFFFH,这就是64K。
不仅仅是堆栈段,其它的段,地址范围,都是在64K之内的。

‘肆’ 8086给各寄存器,内存分配的地址范围是什么

CPU的物理地址不变,而逻辑地址分配是随机的,每次载入系统时都不一样,可以在DOS里查看。对于有16根数据线,20根地址线的8086CPU,将逻辑地址用段基地址和偏移地址表示。段寄存器中的段基地址可以定义任何64KB存储器的起始地址,偏移量用来在64KB存储器中任选一单元,每一个段的长度为64KB,地址范围为(起始地址~起始地址+FFFFH),起始地址为段基地址×10H。

‘伍’ 在8088系统中,已知当前SS寄存器的内容为2345H,SP的内容为0100H,请说明该堆栈段在存

二、填空171.在8086/8088系统中,存储器物理地址是分段组织的。堆栈段的段地址存放在(ss)寄存器中,栈顶数据的偏移地址放在(sp)寄存器中。代码段的段地址存放在(cs)寄存器中。2.伪指令DBN,N为有符号数时,要使该指令合法,则N的最大值是(127)D,最小值是(-128)D。3.(CS)=6000H,(DS)=3000H,(ES)=4000H,(SS)=5000H,(DI)=A100,操作数[DI+1000H]的寻址方式是(寄存器相对寻址),物理地址是(3B100h)。4.CMP指令的功能是(用操作数1减去操作数2然后根据结果设置标志积存器)。5.指令MOV.AX,[SI+100H]的具体操作是(把ds*16+si+100h的内存地址中的16位数据存入ax)。6.无符号二进制字节数可表示的数的范围是(0~255)。7.执行一条POPBX指令后,SP的内容发生的变化是(增加10h)。8.AL寄存器的内容为08H,执行指令OR.AL,30H后,AL的值为(38h)。9.测试寄存器AL和BL的值是否相等而不改变其值应使用指令(CMPAL,BL)。10.二进制数01000001,若将该数分别看作是ASCII码字符,是(A),补码表示的带符号数,它对应的十进制数的真值是(191)。11.标志寄存器FLAGS中ZF标志位的主要作用是(测试各种操作的结果是否为0)。12.使汇编程序把4142H存入一个存储器字中。可以用以下几种等价方法实现要求:(movax,4142h),(movah,41hmoval,42h),(movax,0100000101000010b)。13.XORAX,AX执行后AX=(0),CF=(0),OF=(0)。14.举出使得CF=0的三条指令。movax,0xorax,axandax,0FFFFh(这样算不算?)15.指令LOOPAGAIN的功能(deccxcmpcx,0jneAGAIN)。16.AX=FFFFH,执行指令NEGAX后,AX=(0)H。17.AL=39H,执行指令ANDAL,0FH后AL=(9)H。三、判断以下各语句是否有错误,如有错误请说明错误原因201.MOVAL,100正确2.MOV[1000H],100H错误,非法指令3.MOVBL,AX错误,寄存器长度不相等4.MOV[100],AX错误,目标操作数段寄存器不明确5.POPPSW错误,非法指令6.SHLDX,BL错误,第二个操作数必须为1或CL7.MULAL,BL错误,MUL指令只能有一个操作数8.ANDAX,[1000]正确9.XCHGCS,ES错误,CS不能参与交换10.LDSAL,[SI]错误,第一个操作数必须为16位通用寄存器11.ROLAL,4正确12.LEABX,TABLE正确13.MOVAL,FFH错误,moval,0ffh14.PUSHDS正确15.ASSUMECS:CODE;DS:DATA如果后面是注释,正确,否则错误,应改;为,16.DW0FFH,-12,127正确17.XORCL,CL正确18.ADD55H,AL错误,非法操作数19.CMP[100H],[200H]错误,同上20.ORAL,80H正确

‘陆’ C中栈的内存有多大!

栈的内存空间大小是可以自己定义的,没规定多大,但是一个栈段的容量最大为64KB
因为一个栈段最大容量为65536字节,除以1024就是64KB

‘柒’ 8086/8088系统中,存储器为什么要分段,一个段的最大和最小各为多少字节

8086/8088系统中,存储器分段的主要目的是便于存储器的管理,使得可以用16位寄存器来寻址20位的内存空间。一个段最大为64KB,最小为16B。

存储器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。

由于存储器的个数和容量都有限,不可能把所有中间结果都存储在存储器中,所以,要对存储器进行适当的调度。根据指令的要求,管理安排适当的寄存器,避免操作数过多的传送操作。

8086/8088CPU可直接寻址1MB的存储器空间,直接寻址需要20位地址码,而所有内部寄存器都是16位的,只能直接寻址6KB,因此采用分段技术来解决。将1MB的存储空间分成若干逻辑段,每段最长64KB,最短16B。这些逻辑段在整个存储空间中可浮动。

(7)栈段存储范围扩展阅读:

8086/8088CPU内部设置了4个16位段寄存器,它们分别是代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES、由它们给出相应逻辑段的首地址,称为“段基址”。段基址与段内偏移地址组合形成20位物理地址,段内偏移地址可以存放在寄存器中,也可以存放在存储器中。

程序较小时,代码段、数据段、堆栈段可放在一个段内,即包含在64KB之内,而当程序或数据量较大时,超过了64KB,那么可以定义多个代码段或数据段、堆栈段、附加段。

‘捌’ 某系统中已知当前SS=2580H,SP=0800H,请说明该堆栈段在存储器中的物理地址范围。若已知当前堆栈中已存有1

只能知道当前堆栈段的物理地址,ss*16+sp=26000H,sp=0时为栈底,物理地址为25800H
堆栈段最大不超过64k,该堆栈段的段地址为2580H,偏移地址范围最大为0000H-0ffffH
物理地址=段地址*10H+偏移地址
我只能这样理解你的意思,当前sp=0800,若再向堆栈中压入10个字节的数据,sp的内容为多少
此时sp的内容为0800H+10=080AH

‘玖’ 汇编语言中,堆栈段是否只能定义大于16个字节大小的空间,能否定义少于16个字节的空间

在 8088/8086 系统中,每个段最小是16字节,最大是64K字节。
选用不同的大小范围,都要以 16 字节的整数倍进行。
因为,在计算物理地址的时候,有一个““段地址乘以16””的步骤。

‘拾’ 堆栈段可存放多少个16位的字

8086系统把1M的内存空间划分为若干个逻辑段,每个逻辑段容量为64KB,SS是堆栈段,那么它可以存放1024*64Byte,也就是有6553Byte,共32768个16位的字。