已知SS=0FFA0H,SP=00B0H,先执行两条把8057H和0F79H分别进栈的PUSH指令,再执行一条POP指令,试画出堆栈区和SP内容变化的过程示意图(标出存储单元[1]的地址).
已知SS=0FFA0H,SP=00B0H,先执行两条把8057H和0F79H分别进栈的PUSH指令,再执行一条
POP指令,试画出堆栈区和SP内容变化的过程示意图(标出存储单元[1]的地址).
题目解答
答案
首先,我们已知SS=0FFA0H,SP=00B0H,执行两条PUSH指令将8057H和0F79H进栈。
第一次PUSH操作:
将8057H压入堆栈,堆栈指针SP减2,SP=00AEH,堆栈内容:[00AEH]=8057H
第二次PUSH操作:
将0F79H压入堆栈,堆栈指针SP再减2,SP=00ACH,堆栈内容:[00AEH]=8057H,[00ACH]=0F79H
然后,执行一条POP指令。
POP操作:
弹出堆栈中的数据,堆栈指针SP加2,SP=00AEH,加载的数据为0F79H
最后,根据以上操作画出堆栈区和SP内容变化的过程示意图(标出存储单元的地址):
Copy Code
+-------------------+
| 00AEH |
|-------------------|
| 8057H |
|-------------------|
| |
| ... |
| |
|-------------------|
| 00B0H |
+-------------------+
答案:堆栈区中存储的数据为8057H和0F79H,最终的SP内容为00AEH。
解析
本题考查8086微处理器堆栈操作的理解,包括PUSH和POP指令对堆栈指针(SP)和存储单元的影响。解题关键在于掌握:
- 堆栈操作规则:先进后出(FILO),PUSH操作使SP减2,POP操作使SP加2;
- 堆栈段地址计算:堆栈实际地址由SS和SP共同决定;
- 操作顺序:PUSH时先调整SP再存入数据,POP时先取数据再调整SP。
初始状态
- SS = 0FFA0H,SP = 00B0H,堆栈初始为空。
第一次PUSH 8057H
- 调整SP:SP = 00B0H - 2 = 00AEH;
- 存入数据:将8057H存入SS:00AEH;
- 堆栈状态:[00AEH] = 8057H,SP = 00AEH。
第二次PUSH 0F79H
- 调整SP:SP = 00AEH - 2 = 00ACH;
- 存入数据:将0F79H存入SS:00ACH;
- 堆栈状态:[00AEH] = 8057H,[00ACH] = 0F79H,SP = 00ACH。
执行POP指令
- 取出数据:从SS:00ACH取出0F79H;
- 调整SP:SP = 00ACH + 2 = 00AEH;
- 堆栈状态:[00AEH] = 8057H,SP = 00AEH。