当 SP=2030H,BP=3000H,SS:2033H=11H,SS:202EH=66H,执行POP BP指令后哪些寄存器的内容有变化?(BP)=?
- 若SP=2000H,SS=3000H,执行POP BP指令后,栈顶的物理地址为多少?
- 源操作数的物理地址?AX寄存器的内容?
- 设堆栈指针SP的初值为2000H,AX=3000H,BX=5000H,执行PUSHAX后,SP=?
- 设SP= 3000H,执行下列指令POP BXPUSH AX后,SP寄存器的值是
若SP=2000H,SS=3000H,执行POP BP指令后,栈顶的物理地址为多少?
因为栈操作指令push、pop操作的对象是字型数据,一个内存单元存放一个字节,即操作两个内存单元
ss:sp始终指向栈顶内存单元(3000:2000),pop为出栈指令,pop bp执行的操作为:
(1)、(bp)=(ss:sp)=(3000:2000)
(2)、sp=sp+2=2002H
如果想学习汇编语言的话,推荐一本王爽的《汇编语言第二版》,网上有电子书可供下载
源操作数的物理地址?AX寄存器的内容?
你的这些问题,都涉及到基本X86汇编中寻址方式的问题.为方便起见,后面用PA表示物理地址.题目中逗号右边,就是源操作数,用SRC表示.
第一小题:SRC是直接寻址方式,PA=ES X 16 + 1000H = 30000H+1000H=31000H,从这个内存地址取两个字节,低前高后组合,送到AX,则AX内容就是9ABCH.
第二小题:SRC是寄存器间接寻址方式,PA=DS X 16 + (BX)=20000H + 1000H =21000H,同样从中取两个字节,则AX内容就是1234H
第三小题,SRC是基址变址寻址方式, PA= SS X 16 +(BP) + (DI) = 40000H+1000H+0002H =41002H,同样从中取两个字节,则AX中应该是789AH
第四小题,SRC同第三小题,PA = DS X 16 + (BX)+(SI) = 20000H+1000H+0001H=21001H,从中取两个字节,注意这里跨了题目给定的两个不同的内存字单元,所以AX中应该是7812H.
连接中的两个题,更简单
第一大题:注意堆栈的先进后出规则
POP DX
POP CX
POP BX
POP AX
第二大题:注意分辨寻址方式特征
SRC 立即寻址 DST 寄存器寻址
立即寻址 寄存器相对寻址
寄存器相对寻址 寄存器寻址
寄存器寻址 基址变址寻址
直接寻址(若BUF是变量,若是常数,为立即寻址) 寄存器寻址
寄存器间接寻址 寄存器寻址
寄存器寻址 基址变址相对寻址
设堆栈指针SP的初值为2000H,AX=3000H,BX=5000H,执行PUSHAX后,SP=?
指令格式: PUSH OPRD
POP OPRD
指令功能:进栈指令PUSH使(SP)-2→(SP),然后将16位的源操作数压入堆栈,先高位后低位。源操作数可以是通用寄存器、段寄存器和存储器。
POP退栈指令的执行过程与PUSH相反。它从当前栈顶弹出16位操作数到目标操作数,同时(SP)+2→(SP),使SP指向新的栈顶。目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。
进栈和退栈的操作数要求以字为单位。PUSH和POP指令不影响标志位。
PUSH AX后是把AX的值放入栈中,SP减一个字的长度也就是2个字节,变成1FFEH,AX,BX不变。
PUSH BX也是同义,SP变为1FFCH,AX,BX不变。
POP AX是把当前SS:SP的内容(也就是5000H)出栈并给BX,SP变为1FFEH,AX变为5000H,BX一直都没变,仍是5000H
设SP= 3000H,执行下列指令POP BXPUSH AX后,SP寄存器的值是
POP BX ;SP←SP-2
PUSH AX ;SP←SP+2
∴最后SP= 3000H