zoukankan      html  css  js  c++  java
  • 寄存器(内存访问)04 零基础入门学习汇编语言16

    第三章:寄存器(内存访问)04

     

    让编程改变世界

    Change the world by program


     

     

    我们研究栈的角度:

    栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。  

    用一个盒子和3本书来描述栈的操作方式

    出栈的方式

    [caption id="attachment_287" align="aligncenter" width="150"] 入栈的方式[/caption] [caption id="attachment_288" align="aligncenter" width="150"] 入栈的方式[/caption]

    出栈的方式

    [caption id="attachment_289" align="aligncenter" width="150"] 出栈的方式[/caption] [caption id="attachment_290" align="aligncenter" width="150"] 出栈的方式[/caption]  

    栈有两个基本的操作:入栈和出栈。

      入栈:将一个新的元素放到栈顶; 出栈:从栈顶取出一个元素。 栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。 栈的操作规则:LIFO(Last In First Out,后进先出)  

    CPU提供的栈机制

      现今的CPU中都有栈的设计。 8086CPU提供相关的指令来以栈的方式访问内存空间。 这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。  

    8086CPU提供入栈和出栈指令: (最基本的)

    PUSH(入栈) POP (出栈) push ax:将寄存器ax中的数据送入栈中; pop ax :从栈顶取出数据送入ax。 8086CPU的入栈和出栈操作都是以字为单位进行的。   下面举例说明,我们可以将10000H~1000FH这段内存当作栈来使用。 下面一段指令的执行过程: [codesyntax lang="asm"]
    mov ax,0123H
    push ax
    mov bx,2266H
    push bx
    mov cx,1122H
    push cx
    pop ax
    pop bx
    pop cx
    [/codesyntax]   [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/3_8086CPU的栈操作.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed] 注意:字型数据用两个单元存放,高地址单元放高 8 位,低地址单元放低8 位。 是否有疑惑?

    两个疑问

    1、CPU如何知道一段内存空间被当作栈使用?

    2、执行push和pop的时候,如何知道哪个单元是栈顶单元?

    分析:任意时刻,SS:SP指向栈顶元素。

     

    对于两个疑问的分析

    CPU如何指导当前要执行的指令所在的位置? 答:寄存器CS和IP中存放着当前指令的段地址和偏移地址。  

    8086CPU中,有两个寄存器:

    段寄存器SS 存放栈顶的段地址

    寄存器SP 存放栈顶的偏移地址

    任意时刻,SS:SP指向栈顶元素。

     

    push指令的执行过程

    push ax

    SP=SP–2;

    将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

    [caption id="attachment_292" align="aligncenter" width="300"] push指令的执行过程[/caption]   问题3.6:如果我们将10000H~1000FH 这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=? 思考后看分析。 [caption id="attachment_293" align="aligncenter" width="300"] push指令的执行过程[/caption] SP = 0010H   我们将10000H~1000FH 这段空间当作栈段,SS=1000H,栈空间大小为16 字节 ,栈最底部的字单元地址为1000:000E。 任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS = 1000H,SP=000EH。 栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2 ,SP 原来为 000EH,加 2 后SP=10H 所以,当栈为空的时候,SS=1000H,SP=10H。  

    换个角度看

    任意时刻,SS:SP 指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素 所以SS:SP 只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2 栈最底部字单元的地址为1000:000E,所以栈空时,SP=0010H。 [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LFFUGHXUKMHB']视频下载[/Downlink]
  • 相关阅读:
    Two strings CodeForces
    Dasha and Photos CodeForces
    Largest Beautiful Number CodeForces
    Timetable CodeForces
    Financiers Game CodeForces
    AC日记——整理药名 openjudge 1.7 15
    AC日记——大小写字母互换 openjudge 1.7 14
    AC日记——将字符串中的小写字母换成大写字母 openjudge 1.7 13
    AC日记——加密的病历单 openjudge 1.7 12
    AC日记——潜伏着 openjudge 1.7 11
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846970.html
Copyright © 2011-2022 走看看