汇编语言学习(栈)

栈:

    栈是什么?
    
        存放数据的容器

    栈 和一般的容器有什么区别,如何存取呢?
        先进后出, 类似于 往密闭的盒子放东西
        每一次只能拿出最顶部的东西,每一次只能在最顶部放入东西
        放入的过程 被称为 入栈,一般用 push 表示
            eg:
                push ax
        取出的过程 被称为 出栈,一般用 pop 表示
            eg:
                pop ax

    栈如何表示栈顶:
        存在标志 标识栈顶,称作栈顶标志

    如何标识栈顶标志?
        无论是出栈的位置还是入栈的位置,
        在内存中 都 被视为 内存地址
        前面说过由于 8086 的的 地址总线 与 CPU 处理能力存在出入 ,
        所以 内存地址 由 段地址 和 偏移地址 来表示
        分为 栈顶表示 被分别存储到两个寄存器中,
        段地址寄存器:SS, 偏移地址寄存器:SP
        SS:SP
    
    出栈和入栈 栈顶标记该如何变化?
        在内存中 栈 的地址是有高到低增长
        每一次 push SP -= 2
        每一次 pop  SP += 2
    
    思考一下如何 如何将10000H ~ 1000FH作为 栈 并实现 AX 与 Bx 的交换
        mov ax, 1000H
        mov ss, ax
        mov sp, 10H
        push ax
        push Bx
        pop ax
        pop bx
    ps:内存也可以,记得交换前确定ds指向那个段地址

    

内存角度分析栈:
    无论是 pop 还是 push,操作的都是数据
    数据的来源:寄存器 内存
    数据长度也有两种 字节 和 字
    8086的 栈 操作的是字型数据·

栈 内存的哪里?
    栈没有固定的区域, 没有固定的大小,但栈有最大值 FFFF, 64KB,16位处理器的原因
    无论是指令、数据 还是 栈 都没有固定的区域,
    SS:SP指向的就是栈的空间,为了避免溢出 因注意选择的边界和大小
    CPU 没有检测溢出的能力 


一个很有意思的实验:
    mov ax, 2000
    mov ss, ax
    mov sp, 10
    mov ax, 3123
    push ax
    mov ax, 3366
    push ax
在执行汇编指令之前先将 2000:0~F的空间全部置0
用 -d 指令查看 该 内存值的变化

    思考:为什么值在执行完栈的设定之后就发生了数值的变化?
        通过实验我发现 没有压栈就发生变化的值是 几个寄存器
        分别是ax,CS,IP,个人觉得应该是为了实现递归或者函数调用时返回原来的
         CS IP 指向的位置
         从设计者的角度思考
  我到现在都没想明白,问题放着,书上说悟性够的人想得出来……,显然我没有悟性 
一天的实验我都没想明白 前面的遗留问题:
call 指令把 IP的值存储在哪了 call 指令存储在栈中 ret 可以从栈中将数提取出来 利用了栈临时存储数据的功能

猜你喜欢

转载自www.cnblogs.com/daker-code/p/12380164.html