美文网首页
iOS之底层汇编(六)

iOS之底层汇编(六)

作者: 为自己丶拼个未来 | 来源:发表于2017-08-19 19:31 被阅读0次

    • 栈:是一种具有特殊的访问方式的存储空间(先进后出 first in last out)


    • 8086会将CS作为代码段的段地址,将CS:IP指向的指令作为下一条需要取出执行的指令
    • 8086会将DS作为数据段的段地址,mov ax,[address]就是取出DS:[address]的内存数据存放到ax寄存器中
    • 8086会将SS作为栈段的段地址,任意时刻,SS:SP指向栈顶元素
    • 8086提供了PUSH(入栈)和POP(出栈)指令来操作栈段的数据
      • 比如push ax是将ax的数据入栈,pop ax是将栈顶的数据送入ax

    push ax


    push ax 的执行由以下两个步骤完成
    • SP = SP - 2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
    • 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶


    pop ax


    **pop as的执行过程和push as刚好相反,由以下俩部完成

    • 将SS:SP指向的内存单元处的数据送入ax中
    • SP = SP + 2,SP:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶


    思考

    如果将10000H 到 1000FH 这段空间当做栈,初始状态栈是空的,此时,SS=1000H,SP=?思考后看分析


    • 空栈,SS:SP执行栈控件最高地址单元的下一个单元


      结果

    栈顶超界

    push


    pop
    书上图一

    书上图二

    push&pop汇编

    注意:在8086中push、pop操作的数据都是2个字节

    练习

    编程:
    (1)将10000H到1000FH 这段空间当做栈,初始状态栈是空的;
    (2)设置AX=001AH,BX=001BH;
    (3)利用栈,交换AX和BX中的数据.

    mov ax,1000H
    mov ss,ax;
    mov sp,0010H
    
    mov ax,001AH
    mov bx,001BH
    
    push ax
    push bx
    pop ax
    pop bx
    

    栈段

    • 对于8086来说,在编程时,可以根据需要,将一组内存单元定义为一个段
    • 我们可以将一组长度为N(N<=64KB)、地址连续、起始地址为16的倍数的内存单元,当做栈空间来使用,成为栈段。比如10010H1001FH这段内存空间当做栈来使用,我们就可以认为10010H10001FH是一个栈段,他的段地址为1001H,长度为16字节
    • 如何使用push、pop等栈操作指令访问我们定义的栈段
      • 用SS存放栈段的段地址,用SP存放栈顶的偏移地址

    段总结


    练习

    练习题1
    答案
    练习题2
    答案

    相关文章

      网友评论

          本文标题:iOS之底层汇编(六)

          本文链接:https://www.haomeiwen.com/subject/ixotdxtx.html