关于10.5(1)练习的问题,
本帖最后由 未掵铭 于 2025-7-20 03:56 编辑assume cs:code
stack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ds,ax
mov ax,0
call word ptr ds:
inc ax
inc ax
inc ax
mov ax,4c00h
int 21h
code ends
end start
这一段在实际debug运行当中 我的电脑是给stack分配的0B3B的段地址 给CS分配的0B3C段地址程序debug运行后第一句是
0B3B:0000 B83B0B MOV AX, 0B3B
这时候我-d 0B3B:0 查看到初始化的分配给stack的16位地址 16个00
但是当我执行完 mov ss,ax 再去查看 0B3B:0的时候发现里面不再是16个00了,出现了几个数据,我没搞懂,为什么会出现数据呢,哪里来的数据呢?
根据您提供的汇编程序,以下是对其执行过程的分析:
程序分析:
1. 栈段定义:8个字(16字节),初始化为0。
2. 代码段执行流程:
- 设置SS和SP:建立栈空间(SP=16,栈底在0)。
- 设置DS=SS:数据段与栈段重叠。
- MOV AX,0:AX清零。
- CALL WORD PTR DS::从DS:读取目标地址(值为0),调用代码段偏移0处的指令。
- 后续指令(INC AX等)不会执行,因为CALL跳转。
关键问题:CALL指令行为
- DS:位于栈段起始位置,值为0(初始化全0)。
- CALL跳转到代码段偏移0处(即程序开头),形成循环。
- 每次调用压栈返回地址(IP=0011h):
第1次:SP=14 → 栈内存入0011h
第2次:SP=12 → 存入0011h
...
第8次:SP=0→ 存入0011h
第9次:SP=FFFE(超出栈段)→ 崩溃
执行结果:
1. 循环8次后栈满(SP=0)。
2. 第9次调用时:
- 压栈操作写入SS:FFFE(非法内存)
- 程序崩溃,不会执行INC AX等指令。
3. 崩溃时AX的值:
- 最后一次循环中执行了MOV AX,stack
- AX = stack段的段地址(由系统分配的具体值)。
结论:
- 程序因无限循环导致栈溢出崩溃。
- AX最终值为stack段地址,不是0或3(INC AX未执行)。
- 需检查代码逻辑:CALL目标地址错误导致死循环。
建议修改CALL的目标地址或初始化栈内存数据以修复程序。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]