鱼C论坛

 找回密码
 立即注册
查看: 26|回复: 1

关于10.5(1)练习的问题,

[复制链接]
发表于 昨天 03:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 未掵铭 于 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:[0eh]
     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了,出现了几个数据,我没搞懂,为什么会出现数据呢,哪里来的数据呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 03:56 | 显示全部楼层
根据您提供的汇编程序,以下是对其执行过程的分析:

程序分析:
1. 栈段定义:8个字(16字节),初始化为0。
2. 代码段执行流程:
   - 设置SS和SP:建立栈空间(SP=16,栈底在0)。
   - 设置DS=SS:数据段与栈段重叠。
   - MOV AX,0:AX清零。
   - CALL WORD PTR DS:[0]:从DS:[0]读取目标地址(值为0),调用代码段偏移0处的指令。
   - 后续指令(INC AX等)不会执行,因为CALL跳转。

关键问题:CALL指令行为
- DS:[0]位于栈段起始位置,值为0(初始化全0)。
- CALL跳转到代码段偏移0处(即程序开头),形成循环。
- 每次调用压栈返回地址(IP=0011h):

  1.   第1次:SP=14 → 栈内存入0011h
  2.   第2次:SP=12 → 存入0011h
  3.   ...
  4.   第8次:SP=0  → 存入0011h
  5.   第9次:SP=FFFE(超出栈段)→ 崩溃
  6.   
复制代码


执行结果:
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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-21 14:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表