彙編push和pop指令

2021-09-24 01:54:32 字數 1144 閱讀 2451

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...