push和pop
push和pop是用來操作棧的2個指令。
push寄存器:將一個寄存器中的數(shù)據(jù)入棧。
pop寄存器:出棧用一個寄存器接收數(shù)據(jù)。
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 //將棧頂?shù)臄?shù)據(jù)送入ax,pop也有mov指令類似的功能
pop bx
codesg ends
end
該段代碼將10000H~10000FH這段空間當棧,初始狀態(tài)棧是空的。設(shè)置寄存器ax,bx的值,將ax,bx中的數(shù)據(jù)入棧,然后將ax,bx清零,從棧中恢復(fù)ax,bx原來的內(nèi)容。
ax,bx,sp,cs為寄存器,ss為段寄存器。任意時刻CPU從CS*16+IP(這里cs和ip表示該寄存器的值)單元開始執(zhí)行指令,所以設(shè)置cs:codesg。
任意時刻,ss*16+sp(這里ss和sp表示對應(yīng)寄存器的值)對應(yīng)的地址單元指向棧頂元素,所以程序里面設(shè)置ss=1000H,而不是ss=10000H。
下面看一下單步調(diào)試的結(jié)果:


r命令時查看當前寄存器的內(nèi)容,t是單步執(zhí)行命令。每一步的執(zhí)行結(jié)果中,上面是對應(yīng)寄存器的值,下面對應(yīng)的機器指令是下一條將要執(zhí)行的機器指令。
每執(zhí)行一條指令你都看到對應(yīng)寄存器的變化。最后一條pop bx指令由于圖片大小原因,我沒有截出來,所以最后一行的結(jié)果只是執(zhí)行pop ax,而沒有執(zhí)行pop bx的結(jié)果。
-
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129968 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7335瀏覽量
94756 -
指令
+關(guān)注
關(guān)注
1文章
623瀏覽量
37529 -
匯編語言
+關(guān)注
關(guān)注
14文章
413瀏覽量
39205
發(fā)布評論請先 登錄
匯編語言中常見的兩個指令
評論