push和pop是用來操作棧的2個指令。
push暫存器:將乙個暫存器中的資料入棧
pop暫存器:出棧用乙個暫存器接收資料
下面用一段彙編**學習一下棧的操作,用masm編輯的(環境用的《組合語言》 王爽的那套環境)。
assume cs:codesg ;cs暫存器指向該程式的首位址
codesg segment
mov ax,1000h ;將1000h送入暫存器ax,相當於ax=1000h
mov ss,ax
mov sp,0010h
mov ax,001ah ;將ax,bx賦值
mov bx,001bh
push ax
push bx ;將ax,bx入棧
sub ax,ax ;sub為減法指令,相當於ax=ax-ax
sub bx,bx
pop ax //將棧頂的資料送入ax,pop也有mov指令類似的功能
pop bx
codesg ends
end
該段**將10000h~10000fh這段空間當棧,初始狀態棧是空的。設定暫存器ax,bx的值,將ax,bx中的資料入棧,然後將ax,bx清零,從棧中恢復ax,bx原來的內容。
ax,bx,sp,cs為暫存器,ss為段暫存器。任意時刻cpu從cs*16+ip(這裡cs和ip表示該暫存器的值)單元開始執行指令,所以設定cs:codesg。任意時刻,ss*16+sp(這裡ss和sp表示對應暫存器的值)對應的位址單元指向棧頂元素,所以程式裡面設定ss=1000h,而不是ss=10000h。
下面看一下單步除錯的結果:
r命令時檢視當前暫存器的內容,t是單步執行命令。每一步的執行結果中,上面是對應暫存器的值,下面對應的機器指令是下一條將要執行的機器指令。每執行一條指令你都看到對應暫存器的變化。最後一條pop bx指令由於大小原因,我沒有截出來,所以最後一行的結果只是執行pop ax,而沒有執行pop bx的結果。
關於組合語言中PUSH和POP指令的乙個小結
這裡是引用 最近剛剛開始學習組合語言,對於push和pop指令有些疑惑,特意去網上查了資料,在此做乙個總結。push和pop指令都是對ss堆疊段的操作,ss中存放的是段基址,sp指標存放的是偏移位址。注意入棧出棧操作都是以 字 為單位 也就是2位元組,16位 下面貼幾張比較詳細的截圖 首先從下面這張...
WIN16組合語言中PUSH和POP總結
最近在研究彙編,老是將這兩個東東搞混淆,覺得有必要總結一下子。無論是push還是pop,都是對堆疊段ss的處理,ss中存放堆疊段位址,sp指標中存放偏移位址,棧操作都是以字 2位元組 為單位。例如,將通用暫存器ax中的資料入棧,push ax,在16位的彙編中,ax中存放的是兩個位元組單元,這句話的...
pop協議指令
網路郵件收取使用的是pop3協議,了解pop3協議有助於我們加深對郵件系統的理解。而且使用pop3協議你還可以直接telnet 到郵件伺服器上去收信。一般telnet pop3 server 110後就可以用這些命令了,大小寫不敏感,不包括口令本身,注意不要讓口令回顯,等驗證通過後再允許回顯好了。u...