2023-03-03游戲push指令執行的詳細過程
大家好,給大家分享一下push指令執行的詳細過程,很多人還不知道這一點。下面詳細解釋一下。現在讓我們來看看!
PUSH的操作過程是:
(SP)<--(SP)-2,((sp))<--OPRD。
即先修改堆棧指針SP(壓入時為自動減2),然后,將指定。
的操作數送入新的棧頂位置。
此處的((SP))<--OPRD,也可以理解為:
[(SS)*16+(SP)]<--OPRD。
或
[SS:SP]<--OPRD。
示例:
PUSH
DX
PUSH
BP
PUSH
CS
PUSH
DATA1
PUSH
ALFA[BX][SI]
注意:
每進行一次壓入操作,都壓入一個字(16位)。
擴展資料
PUSH
指令
PUSH
指令首先減少ESP的值,再將源操作數復制到堆棧。操作數是16位的,則ESP減。
2,操作數是32位的,則
ESP減4,PUSH指令有3種格式:
PUSH
reg/mem16
PUSH
reg/mem32
PUSH
inm32
SH”指令的功能是實現將一個寄存器中的數據壓入棧操作。PUSH的操作過程是: (SP)(SP)-2,((SP))<-OPRD。先修改堆棧指針SP(壓入時為自動減2),然后,將指定的操作數送入新的棧頂位置。
匯編里的"POP"指令的功能是實現將一個寄存器中的數據彈出棧操作。POP的操作過程是:將堆棧段中當前SS:SP所指的字內容彈出到某個寄存器或段寄存器或內存單元。再?SP←SP+2。
擴展資料:
PUSH和POP指令對狀態標志位沒有影響。"PUSH"指令每進行一次壓入操作,都壓入一個字(16位)。OPRD為16位(字)操作數,可以是寄存器或存儲器操作數。
若段描述符中的D\B位為1,則棧操作將使用ESP寄存器。先將ESP數值減去棧數據的長度 sub esp,register's long.(sizeof register)。再將數據壓入棧:mov ss:[esp],register。
若段描述符中的D\B位為0,則棧操作將使用SP寄存器。先將SP數值減去棧數據的長度 sub sp,register's long.(sizeof register)再將數據壓入棧:mov ss:[sp],register。
一、push、pop指令的作用:
push和pop
都是堆棧操作指令。實現壓入操作的指令是push指令;實現彈出操作的指令是pop指令。
二、push的操作過程是:
(sp)<--(sp)-2,((sp))<--oprd。
即先修改堆棧指針sp(壓入時為自動減2),然后,將指定。
的操作數送入新的棧頂位置.
此處的((sp))<--oprd,也可以理解為:。
[(ss)*16+(sp)]<--oprd。
或
[ss:sp]<--oprd。
三、什么是堆棧
堆棧被定義為一種先進后出的數據結構,即最后進棧的元素將被最先彈出來.這很像許多人進入一條窄得只能。
容納一個人通過的小道,如果要從這條道往回退出來的話,那么最先退出來的人是最后一個進入小道的人。
PUSH指令主要用于編寫子程序和中斷服務程序,可以臨時保存程序狀態字PSW和累加器ACC的內容 或其它寄存器和存儲器單元的內容。
在子程序和中斷服務程序結束返回主程序前,要用POP彈棧指令,從堆棧中取出被保護的數據,恢復程序狀態字PSW和累加器ACC的內容 或其它寄存器和存儲器單元的內容。
呵呵 滿意 就選滿意回答啊。
push是入棧指令
pop是出棧指令
通常這兩個結合用于子函數的調用和返回。
首先將棧指針sp加1,然后把direct中的內容送到棧指針sp指示的內部RAM單元中。
例如:當(SP)=60H,(A)=30H,(B)=70H時,執行下列命令。
PUSH Acc ;(SP)+1=61H->SP,(A)->61H。
PUSH B ;(SP)+1=62H->SP,(B)->62H。
結果:(61H)=30H,(62H)=70H,(SP)=62H。
單片機中PUSH和POP分別是壓棧指令和出棧指令,用來暫時保存數據。
不同MCU的堆棧在使用細節上有所區別,不過意思都差不多,暫時以X86為例。
X86堆棧就是一段程序初始化時指定的內存空間,用來暫存需要保存的數據。這個空間訪問時要涉及兩個指針寄存器。一個是基點(SS),其值不變,永遠指向堆棧段的最小地址;另一個寄存器(SP)的值為堆棧空間的剩余大小,兩者相加就是當前生效的堆棧地址。SP在遇到PUSH時減少,在遇到POP時增加,其指向的地址在堆棧區域內不斷變化;當SP的值為0時就表示堆棧用光了。
入棧(PUSH)就是將一個數據存入SP指向的當前堆棧地址,然后SP指向堆棧內的下一個存儲空間;出棧(POP)就是讓SP返回前一個存儲空間,然后讀出這個地址內存儲的數據。
堆棧的優勢就是暫存數據時不用管到底存在哪了,只要按照后進先出的原則就可以保證恢復數據;缺點就是不能通過堆棧操作跳著訪問棧內數據。