PUSH进栈指令和POP出栈指令
生活随笔
收集整理的這篇文章主要介紹了
PUSH进栈指令和POP出栈指令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PUSH進棧指令
- 指令格式:PUSH 源
- 指令功能:將源操作數推入堆棧。
- 源操作數可以是16位通用寄存器、段寄存器或存儲器中的數據字,但不能是立即數。堆棧是以“先進后出”的方式工作的一個存儲區,棧區的段地址由SS寄存器的內容確定。堆棧的最大容量可為64K,即一個段的最大容量。堆棧指針SP始終指向棧頂,其值可以從FFFEH(偶地址)開始,向低地址方向發展,最小為0。
- 每次執行PUSH操作時,先修改SP的值,使SP←SP-2后,然后把源操作數壓入堆棧匯中SP指示的位置上,低位字節放在較低地址單元,高位字節放在較高地址單元。由于堆棧操作都是以字為單位進行的,所以SP總是指向偶地址單元。SS和SP的值可由指令設定。
POP出棧指令
- 指令格式:POP 目的
- 指令功能:把當前SP所指向的堆棧頂部的一個字送到指定的目的操作數中。
- 目的操作數可以是16位通用寄存器、段寄存器或存儲單元,但CS不能作目的的操作數。每執行一次出棧操作,SP←SP+2,即SP向高地址方向移動,指向新的棧頂。
例: 設SS=2000H, SP=10H,AX=2233,BX=3344,CX=0000,依次執行下列指令:
注:棧的大小 = 16字節 = 8個字
以下是執行PUSH AX指令后產生的變化
SP = 0010H 轉換為十進制為16
SP = 16 - 2 = 14 轉換為十六進制為 E
以下是執行PUSH BX指令后產生的變化
SP = 000EH 轉換為十進制為 14
SP = 14 - 2 = 12 轉換為十六進制為 C
以下是執行POP CX指令后產生的變化
SP = 000CH 轉換為十進制為 12
SP = 12 + 2 = 14 轉換為十六進制為 E
以下是執行POP CX指令后產生的變化
SP = 000EH 轉換為十進制為14
SP = 14 + 2 = 16 轉換為十六進制為 10H
注意:
例:
利用棧交換AX 和 BX中的數據
例:
假設AX = 001AH,BX = 001BH,然后刪除成0,利用棧恢復AX和BX中的數據
例:
假設將 10000H -1000FH這段空間當做棧,初始狀態棧是空的,此時 SS = 1000H,SP = ?
注:
- 在使用堆棧的時候,需要注意棧越界問題,在匯編語言中,棧越界是沒有提示的,需要自己留意。
- 一個棧能夠存放最多 32768個字型數據。
- SP的范圍為0 — FFFFH 字節。
例:
1)使其可以將 10000H — 1000FH 中的8個字型數據,逆序復制到 20000H—2000FH
2)使其可以將 10000H — 1000FH 中的8個字型數據,逆序復制到 20000H—2000FH
mov ax,2000H mov ds,axmov bx,1000H mov ss,bx mov sp,0pop ds:[E] ; → SS:SP → ds:[E] → 2000:E → SP + 2 pop ds:[C] pop ds:[A] pop ds:[8] pop ds:[6] pop ds:[4] pop ds:[2] pop ds:[0]總結
以上是生活随笔為你收集整理的PUSH进栈指令和POP出栈指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动指令和运算指令
- 下一篇: 使用DOSBox编译汇编代码