汇编语言->课后题

1.完成Codesg代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
assume cs:codesg

codesg segment

mov ax,2000h
mov ss,ax
mov sp,0
add sp,10
pop ax
pop bx
push ax
push bx
pop ax
pop bx

mov ax,4c00h
int 21h

codesg ends
end

2.Debug 编译

🤕忽略自己蛋疼的mini错误

3.Debug 单步调试,并且分析寄存器的变化

  1. 初始AX =FFFF DS=075C ->可知PSP=075C:0 程序地址为 076C:0 CS:IP =076C:0000
  2. 单步后 AX=2000 CS:IP=176C:0003 —>SS=2000—> pop ax 之后 ax=0000
  3. 看到INT 21 -P 正常退出
  4. q退出debug

✍整个过程中 POP 使 SP变大,Push 将使 SP变小,因为一次是一个字型数据所以说,变化为2。

4.总结

感觉还是对__空栈的概念的理解__吧,及时AX,BX是空栈,PUSH POP 入栈和出栈都会进行指针的变化,说白了栈就是SS:SP指向的内存空间,移动按照规律,而不是去判断是否为空栈。

栈空间里没有内容,此时能弹堆栈?
首先说什么是栈空间,栈空间无非是一段由SS:SP指示的内存空间而已,一般情况下我们能够用栈操作指令访问它,当然,我们也可以用访问内存地址的任何一种合理方式访问这段空间。其次,我们说 栈空 表明的意思是:栈顶设置之初,我们没有栈操作的时候,这段空间的数据我们是未知的,所以通常也是没有用的,但是并不代表这时栈顶SS:SP所指向的内存字单元中没有数据!再有一点:无论是push还是pop操作,栈的操作在任何情况下都是有效的(但不一定在任何情况下都是合理的,对于不合理的栈操作正如问题 1 的回答中所讲,会有操作系统的干预。)

本文标题:汇编语言->课后题

文章作者:IceFeng

发布时间:2019年03月23日 - 18:56:53

最后更新:2019年03月24日 - 14:54:49

原始链接:https://www.icefeng.cc/2019/asm_1/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

------ 本文结束 ------
0%