未掵铭 发表于 2025-7-20 03:52:02

关于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了,出现了几个数据,我没搞懂,为什么会出现数据呢,哪里来的数据呢?

FishC 发表于 2025-7-20 03:56:22

根据您提供的汇编程序,以下是对其执行过程的分析:

程序分析:
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]
查看完整版本: 关于10.5(1)练习的问题,