PUSH进栈指令和POP出栈指令
PUSH進(jìn)棧指令
- 指令格式:PUSH 源
- 指令功能:將源操作數(shù)推入堆棧。
- 源操作數(shù)可以是16位通用寄存器、段寄存器或存儲(chǔ)器中的數(shù)據(jù)字,但不能是立即數(shù)。堆棧是以“先進(jìn)后出”的方式工作的一個(gè)存儲(chǔ)區(qū),棧區(qū)的段地址由SS寄存器的內(nèi)容確定。堆棧的最大容量可為64K,即一個(gè)段的最大容量。堆棧指針SP始終指向棧頂,其值可以從FFFEH(偶地址)開始,向低地址方向發(fā)展,最小為0。
- 每次執(zhí)行PUSH操作時(shí),先修改SP的值,使SP←SP-2后,然后把源操作數(shù)壓入堆棧匯中SP指示的位置上,低位字節(jié)放在較低地址單元,高位字節(jié)放在較高地址單元。由于堆棧操作都是以字為單位進(jìn)行的,所以SP總是指向偶地址單元。SS和SP的值可由指令設(shè)定。
POP出棧指令
- 指令格式:POP 目的
- 指令功能:把當(dāng)前SP所指向的堆棧頂部的一個(gè)字送到指定的目的操作數(shù)中。
- 目的操作數(shù)可以是16位通用寄存器、段寄存器或存儲(chǔ)單元,但CS不能作目的的操作數(shù)。每執(zhí)行一次出棧操作,SP←SP+2,即SP向高地址方向移動(dòng),指向新的棧頂。
例: 設(shè)SS=2000H, SP=10H,AX=2233,BX=3344,CX=0000,依次執(zhí)行下列指令:
注:棧的大小 = 16字節(jié) = 8個(gè)字
以下是執(zhí)行PUSH AX指令后產(chǎn)生的變化
SP = 0010H 轉(zhuǎn)換為十進(jìn)制為16
SP = 16 - 2 = 14 轉(zhuǎn)換為十六進(jìn)制為 E
以下是執(zhí)行PUSH BX指令后產(chǎn)生的變化
SP = 000EH 轉(zhuǎn)換為十進(jìn)制為 14
SP = 14 - 2 = 12 轉(zhuǎn)換為十六進(jìn)制為 C
以下是執(zhí)行POP CX指令后產(chǎn)生的變化
SP = 000CH 轉(zhuǎn)換為十進(jìn)制為 12
SP = 12 + 2 = 14 轉(zhuǎn)換為十六進(jìn)制為 E
以下是執(zhí)行POP CX指令后產(chǎn)生的變化
SP = 000EH 轉(zhuǎn)換為十進(jìn)制為14
SP = 14 + 2 = 16 轉(zhuǎn)換為十六進(jìn)制為 10H
注意:
例:
利用棧交換AX 和 BX中的數(shù)據(jù)
例:
假設(shè)AX = 001AH,BX = 001BH,然后刪除成0,利用?;謴?fù)AX和BX中的數(shù)據(jù)
例:
假設(shè)將 10000H -1000FH這段空間當(dāng)做棧,初始狀態(tài)棧是空的,此時(shí) SS = 1000H,SP = ?
注:
- 在使用堆棧的時(shí)候,需要注意棧越界問題,在匯編語言中,棧越界是沒有提示的,需要自己留意。
- 一個(gè)棧能夠存放最多 32768個(gè)字型數(shù)據(jù)。
- SP的范圍為0 — FFFFH 字節(jié)。
例:
1)使其可以將 10000H — 1000FH 中的8個(gè)字型數(shù)據(jù),逆序復(fù)制到 20000H—2000FH
2)使其可以將 10000H — 1000FH 中的8個(gè)字型數(shù)據(jù),逆序復(fù)制到 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]總結(jié)
以上是生活随笔為你收集整理的PUSH进栈指令和POP出栈指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动指令和运算指令
- 下一篇: 使用DOSBox编译汇编代码