例利用 DEBUG学习PUSH指令 D: MASM>DEBUG A 汇编两条指令 1693:0100 MOV AX,1234 1693:0103 PUSH AX 1693:0104 -R 显示指令执行前寄存器值 AX=0000BX=0000CX=0000DX=0000SP= FFEE BP=0000SI=0000DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0100 NVUP EI PL NZ NA PO NC 1693:0100B83412 MOV AX,1234 T=1002 ;执行CS:100开始处的两条指令 AX=1234BX=0000CX=0000DX=0000SP= FFEC BP=0000S=0000DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0104 NV UP EI PL NZ NA PO NC 1693:010403C6 ADD AX,SI D SS: FFEC L10 查看栈顶内容 1693:FFE0 34120000 1693: FFFO FFFF FFFF FFFFFF FF-FF FF FFFF Q 注意相关寄存器和内存单元内容的变化
D:\MASM>DEBUG -A ;汇编两条指令 1693:0100 MOV AX, 1234 1693:0103 PUSH AX 1693:0104 -R ;显示指令执行前寄存器值 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0100 NV UP EI PL NZ NA PO NC 1693:0100 B83412 MOV AX, 1234 -T=100 2 ;执行CS:100开始处的两条指令 …. AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0104 NV UP EI PL NZ NA PO NC 1693:0104 03C6 ADD AX,SI -D SS:FFEC L10 ;查看栈顶内容 1693:FFE0 34 12 00 00 4... 1693:FFF0 FF FF FF FF FF FF FF FF-FF FF FF FF ............ -Q 例 利用DEBUG学习PUSH指令 注意相关寄存器和内存单元内容的变化
3)POP出栈操作 格式 POP dst 执行(dst)←(SS:SP) (ast) (SP)←(SP)+2 SS: SP 特点: ●单操作数指令 ●操作数为16位,可以是reg/ segre/mem,不可以是data reg AX, BX, CX, DX, SL DL, BP, BX segre:DS,ES,SS,不允许是CS mem:字类型
3)POP出栈操作 特点: ⚫单操作数指令 ⚫操作数为16位,可以是reg/segreg/mem, 不可以是data reg : AX, BX, CX, DX, SI, DI, BP, BX segreg : DS, ES, SS, 不允许是CS mem : 字类型 SS:SP SS:SP (dst) 格式 POP dst 执行 (dst) ← (SS:SP) ( SP) ←( SP)+ 2
例: POP BX 若执行前: 则执行后: (SS)=2000H (SS)=2000H 不变 (SP)=1000H (SP)=1002H 加2 (SS:SP)=1234H (SS:SP)=2010H变 (BX)=5678H (BX)=1234H 变 址 址 SS: SP 低 2000:1000 SS: SP 10 10 2000:1002 20↓高 20高 (BX)=5678h (BX)=1234h 指令执行前 指令执行后
若执行前: (SS)= 2000H (SP)= 1000H (SS:SP)= 1234H (BX)= 5678H 12 34 10 低 20 高 SS:SP 2000:1000 指令执行前 地址 (BX)=5678h 例: POP BX 12 34 10 低 20 高 SS:SP 2000:1002 指令执行后 地址 (BX)=1234h 则执行后: (SS)= 2000H (SP)= 1002H (SS:SP)= 2010H (BX)= 1234H 不变 加2 变 变
例在 DEBUG下学习POP指令 1693: 0100 MOV BP. SP ;取当前栈顶地址 1693:0102 MOV WORD PTR BP,1234;用MOV指令使栈顶内容为1234H 1693:0107 POP BX 出栈指令 1693:0108 R 查看指令执行前状态 AX=0000BX=0000CX=0000DX=0000SP= FFEE BE=0000SI=0000DI0000 DS=1693 ES=1693 SS=1693 CS=1693 P=0100 NV UPEIPLNZNA PO NC 1693:010089E5 MOV BP. SP T=100 执行CS:100处的第一条mov指令 AX=0000BX=0000CX=0000DX=0000SP=FFEE FFEE SI000O DI0000 DS=1693 ES=1693 Ss=1693 CS=1693 P=0102 NV UP EIPLNZNA PO NC 1693:0102C746003412 MOV WORD PTR BE+001,1234 SS: FFEE=000O T 执行下一条m0v指令 AX0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP-FFEE SI0000 DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 P=0107 NV UPEIPLNZNA PO NC 1693:01075B POP BX T 执行pop指令,注意BX,SP的变化 AX0000 BX=1234 CX=0000 DX0000 SP-FFFO BP=FFEE SI0000 DI=0000 DS=1693 ES=1693 Ss=1693 CS=1693 P=0108 NV UPEIPLNZ NA PO NC 1693:0108F5 CMC
-A 1693:0100 MOV BP, SP ;取当前栈顶地址 1693:0102 MOV WORD PTR [BP], 1234 ;用MOV指令使栈顶内容为1234H 1693:0107 POP BX ;出栈指令 1693:0108 -R ;查看指令执行前状态 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0100 NV UP EI PL NZ NA PO NC 1693:0100 89E5 MOV BP, SP -T=100 ;执行CS:100处的第一条mov指令 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=FFEE SI=0000 DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0102 NV UP EI PL NZ NA PO NC 1693:0102 C746003412 MOV WORD PTR [BP+00], 1234 SS:FFEE=0000 -T ;执行下一条mov指令 AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=FFEE SI=0000 DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0107 NV UP EI PL NZ NA PO NC 1693:0107 5B POP BX -T ;执行pop指令,注意BX, SP的变化 AX=0000 BX=1234 CX=0000 DX=0000 SP=FFF0 BP=FFEE SI=0000 DI=0000 DS=1693 ES=1693 SS=1693 CS=1693 IP=0108 NV UP EI PL NZ NA PO NC 1693:0108 F5 CMC - 例 在DEBUG下学习POP指令
例:执行下列程序段 PUSH AX 若执行前 PUSH BX ② (SS)=3000H MOV AX,66H③ (SP)=200EH MOV BX,99H④ (SS:SP)=1234H POP BX (AX)=OAOBH POP AX (BX=OCODH 执行③④后(AX=0066(BX)=0099 执行②后308:80 OD OC 执行⑤后:(BX=0C0D 执行①后3068:00A 0B-306:86c 执行⑥后:(AX)=0A0B 执行前306:4012 306:60E (AX=OAOB (BX)=0COD
例:执行下列程序段 PUSH AX ① PUSH BX ② MOV AX,66H ③ MOV BX,99H ④ POP BX ⑤ POP AX ⑥ 若执行前 (SS)= 3000H (SP)= 200EH (SS:SP)= 1234H (AX)= 0A0BH (BX)= 0C0DH 3000SS: :200 SP E 执行前 (AX)=0A0B (BX)=0C0D 34 12 执行①后 3000:200C SS:SP 0B 0A 3000:200A 执行②后 SS:SP 0D 0C 0B 0A 3000:200C SS:SP 执行⑤后: (BX)=0C0D 0D 0C 0B 0A 执行 ③④后 (AX)=0066 (BX)=0099 3000:200A 执行②后 SS:SP 0D 0C 0B 0A 执行⑥后: (AX)=0A0B 3000:200E SS:SP (BX)=0C0D 执行 ③④后 (AX)=0066 (BX)=0099 0D 0C 0B 0A