天天看點

彙編語言學習筆記(3)

 35.棧:先進後出,涉及到入棧(PUSH)和出棧(POP)兩個概念.

          a)push  ax   //表示将ax中的資料送入棧中

          b)pop    ax   //表示從棧頂取出資料送入ax

36.8086CPU的入棧和出棧操作都是以字為機關進行的.那麼如何知道哪一段被當作棧在使用..?----How...?

      PUSH和POP時,需要知道棧頂元素..?----How...?

和CS:IP類似,在8086CPU中,有兩個寄存器SS和寄存器SP,棧頂的段位址存放在ss中,偏移位址在sp中.

37.任意時刻,ss:sp指向棧頂元素 .PUSH和POP時,CPU從SS和SP中得到棧頂位址.

38.棧頂超界:和C語言中指針越界一樣,是很危險的操作,這個需要程式員自己控制.

39.PUSH和POP指令:PUSH和POP可以是如下格式的:

         a)PUSH     寄存器 

         b)POP       寄存器      //将寄存器中的資料入棧或者将棧頂元素送到寄存器中

         c)PUSH    段寄存器

         d)POP     段寄存器     //同上

         e)PUSH     記憶體單元

         f)POP        記憶體單元     //同上

40.執行指令時,CPU要知道記憶體單元的位址,可以在PUSH,POP指令中隻給出記憶體單元的偏移位址,段位址在執行指令時,從SS處獲得.

     設定棧的大小:

                          mov   ax,1000H

                          mov   ss,ax

                          mov   sp,0010H                  //ss和sp的內插補點就是棧的大小了,由程式員自己控制

41.PUSH和POP與mov的差別是:兩次操作和一個操作的關系.

42.棧段:被定義當作棧的一段連續的位址空間.----Where...?設定SS和SP的值.

43.關于段的結論:可以将一段記憶體定義為一個段,用一個段位址訓示段,用偏移位址通路段的記憶體單元.-->自己設定.

        用一個段存放資料,稱為資料段;

        用一個段存放代碼,稱為代碼段;

        用一個段存放棧,稱為棧段.

對于資料段,段的位址存放在DS中,用mov,add,sub等通路記憶體單元的指令時,CPU就是将我們定義的資料段中的内容當資料來通路;

對于代碼段,段的位址存放在CS中,将第一條指令的偏移位址放在IP中,CPU就會執行我們定義的代碼段中的指令;

對于棧段,段的位址放在SS中,将棧頂單元的偏移位址放在SP中,這樣CPU在進行棧操作時,就将我們定義的棧段當棧空間來使用.

44.是以,一段記憶體是什麼區域,扮演什麼角色,關鍵在于CPU中寄存器的設定,即CS,IP,SS,SP,DS的指向.

繼續閱讀