新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 第11章 棧(X86匯編教程)

        第11章 棧(X86匯編教程)

        作者: 時間:2016-12-01 來源:網絡 收藏
        ,是什么呢?其實啊,棧,就是一種數據放進內存和從內存讀取出來的方法.用棧來操作數據,幾乎無需自己操心數據會被保存在內存的什么地方(不出意外的話.....)

        棧操作內存的方法是寫入的時候把數據一個一個推進去,寫一次推一個數據.而提取數據當然也是一個一個提取出來.注意:提取過的數據就會消失(實際上沒有消失,可以再次提取,但....那還不如直接用正常方式操作內存呢..).不像普通內存操作可以反復讀取.棧提供了一種"后進先出"的數據操作方法.把最后放進內存的數據最先拿出來.這種內存操作方法在某些方面會有巨大的用處.

        本文引用地址:http://www.104case.com/article/201612/324268.htm

        使用棧來操作內存,先在內存中定義一個位置,作為"棧頂",這個定義的方法也沒啥,直接把你要作為棧頂的內存地址寫進SS:SP寄存器即可.這2個寄存器就是"棧頂指針寄存器組合" (一般系統會自動定義棧頂,無需自己操作,所以這步可以跳過,知道SS:SP寄存器的作用即可.)

        我們用堆棧往內存里面推入數據之后,棧頂就會移動(自動的喲!).所以不用擔心會把曾經推進堆棧的數據覆蓋(當然,你可別因為這樣就拼命往堆棧里邊壓數據...內存會爆掉的[=_=0])

        CPU用堆棧操作內存的步驟:

        數據入棧:

        1:往內存的[SS:SP]寫入數據

        2:新的SP寄存器值=SP寄存器值-入棧數據的長度(單位:字節,一般是字形數據.也就是2個字節)

        數據出棧:

        1:SP寄存器值+出棧數據的長度(同上個括號)

        2:在[SS:SP]讀取數據

        然后,用棧操作指令就能把數據推進棧里,或從棧里把數據弄出來....


        指令名 :PUSH
        操作數數量:1
        操作數名 :數據
        指令用途 :把一個數據推進棧里,可以是直接數,也可以是寄存器或內存地址(內存地址的話需要指定推進堆棧里的數據長度)

        指令名 :POP
        操作數數量:1
        操作數名 :存放數據的地方
        指令用途 :把一個數據從堆棧里提取出來.可以放到寄存器或內存地址里.(此處內容同上面那個括號)
        實例:
        PUSH AX;把AX里面的數據推進堆棧里
        POP BX;把最后推進堆棧的數據讀取出來放進BX
        內存地址實例:
        PUSH WORD [DS:0];那個WORD就是用來指定數據長度的,字形(WORD)為2個字節
        POP DWORD [DS:0];4個字節出棧

        本章就到這里,作業:把4個通用寄存器[AX BX CX DX]都壓棧再取回吧!


        關鍵詞: 棧X86匯編教

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 南郑县| 修武县| 南京市| 西华县| 蓝田县| 民权县| 太和县| 新丰县| 卢龙县| 南昌市| 隆昌县| 贺州市| 彰化县| 庄浪县| 鲜城| 阿拉善右旗| 隆回县| 井冈山市| 淳化县| 奉新县| 综艺| 安宁市| 尚志市| 额敏县| 青海省| 盐边县| 依兰县| 视频| 湛江市| 西宁市| 汕头市| 波密县| 宝山区| 内黄县| 香格里拉县| 龙海市| 蕲春县| 沂水县| 京山县| 吴忠市| 大姚县|