第11章 棧(X86匯編教程)
棧操作內存的方法是寫入的時候把數(shù)據一個一個推進去,寫一次推一個數(shù)據.而提取數(shù)據當然也是一個一個提取出來.注意:提取過的數(shù)據就會消失(實際上沒有消失,可以再次提取,但....那還不如直接用正常方式操作內存呢..).不像普通內存操作可以反復讀取.棧提供了一種"后進先出"的數(shù)據操作方法.把最后放進內存的數(shù)據最先拿出來.這種內存操作方法在某些方面會有巨大的用處.
本文引用地址:http://2s4d.com/article/201612/324268.htm使用棧來操作內存,先在內存中定義一個位置,作為"棧頂",這個定義的方法也沒啥,直接把你要作為棧頂?shù)膬却娴刂穼戇MSS:SP寄存器即可.這2個寄存器就是"棧頂指針寄存器組合" (一般系統(tǒng)會自動定義棧頂,無需自己操作,所以這步可以跳過,知道SS:SP寄存器的作用即可.)
我們用堆棧往內存里面推入數(shù)據之后,棧頂就會移動(自動的喲!).所以不用擔心會把曾經推進堆棧的數(shù)據覆蓋(當然,你可別因為這樣就拼命往堆棧里邊壓數(shù)據...內存會爆掉的[=_=0])
CPU用堆棧操作內存的步驟:
數(shù)據入棧:
1:往內存的[SS:SP]寫入數(shù)據
2:新的SP寄存器值=SP寄存器值-入棧數(shù)據的長度(單位:字節(jié),一般是字形數(shù)據.也就是2個字節(jié))
數(shù)據出棧:
1:SP寄存器值+出棧數(shù)據的長度(同上個括號)
2:在[SS:SP]讀取數(shù)據
然后,用棧操作指令就能把數(shù)據推進棧里,或從棧里把數(shù)據弄出來....
指令名 :PUSH
操作數(shù)數(shù)量:1
操作數(shù)名 :數(shù)據
指令用途 :把一個數(shù)據推進棧里,可以是直接數(shù),也可以是寄存器或內存地址(內存地址的話需要指定推進堆棧里的數(shù)據長度)
指令名 :POP
操作數(shù)數(shù)量:1
操作數(shù)名 :存放數(shù)據的地方
指令用途 :把一個數(shù)據從堆棧里提取出來.可以放到寄存器或內存地址里.(此處內容同上面那個括號)
實例:
PUSH AX;把AX里面的數(shù)據推進堆棧里
POP BX;把最后推進堆棧的數(shù)據讀取出來放進BX
內存地址實例:
PUSH WORD [DS:0];那個WORD就是用來指定數(shù)據長度的,字形(WORD)為2個字節(jié)
POP DWORD [DS:0];4個字節(jié)出棧
本章就到這里,作業(yè):把4個通用寄存器[AX BX CX DX]都壓棧再取回吧!
評論