6YKT6ZKm5LqI 发表于 2022-7-5 21:09:02

向栈段存了16个字节型的1, 查看却发现并不全是01

代码如下:
assume cs: codesg, ss: stack

stack segment
    db 16 dup(1)
stack ends

codesg segment
    mov ax, 4c00h
    int 21h
start:
    mov ax, stack
    mov ss, ax
    mov sp, 16
    mov ax, 0
    push ax
    ret
codesg ends
end start
明明向栈段存入了16个字节型的1,第一行为什么不全是01呢{:10_291:}

人造人 发表于 2022-7-5 21:12:59

没看懂你的问题

jackz007 发表于 2022-7-5 21:44:54

      和其它段相比,堆栈段具有特殊性,除了程序自己用,在进行 DOS 、BIOS 系统中断调用的时候也会被用到,而使用过后,堆栈中原来被静态初始化的内容就会被覆盖,所以,堆栈只能保护用户压栈的数据(也就是从 SP 到栈顶之间的数据),从 SP 到栈底的数据属于自由空间,是不被保护的,所以,堆栈段不适合用来存储静态数据。

6YKT6ZKm5LqI 发表于 2022-7-5 21:51:58

jackz007 发表于 2022-7-5 21:44
和其它段相比,堆栈段具有特殊性,除了程序自己用,在进行 DOS 、BIOS 系统中断调用的时候也会被用 ...

可是我第13行设置了sp=16,那ss段0~f也就是图里面第一行的16个字节为什么不是16个1呢

jackz007 发表于 2022-7-5 22:25:34

本帖最后由 jackz007 于 2022-7-5 22:32 编辑

6YKT6ZKm5LqI 发表于 2022-7-5 21:51
可是我第13行设置了sp=16,那ss段0~f也就是图里面第一行的16个字节为什么不是16个1呢

         我已经回答了你的问题:堆栈只能保护用户压栈的数据(也就是从 SP 到栈顶之间的数据),从 SP 到栈底的数据属于自由空间,是不被保护的
         所谓"不被保护"的意思是,保存在这部分内存区域的数据存在被意外改变的风险。
页: [1]
查看完整版本: 向栈段存了16个字节型的1, 查看却发现并不全是01