鱼C论坛

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

[已解决]6.1章节一个问题求大佬解惑

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

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

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

x
assume cs:abc
abc segment
        dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
        mov bx, 0
        mov ax, 0
        mov cx, 8
s:add ax,cs:[bx]
        add bx, 2
        loop s
        mov ax, 4c00H
        int 21H
abc ends
end

现在可以理解DW 后面的8个16进制数据从CS段的0偏移开始申请位置,8个数据占了16字节的位置,
那么MOV bx, 0应该是从 CS:10开始的  

debug中-U CS:10  可以查看到
MOV BX,0000
MOV AX,0000
.
.
.
等等
但是如果我-U CS:F的时候理论上应该是F之后显示CS:10的内容也就是mov bx,0啊

实际上查看到的是
CS:000F 09BB0000     OR     [BP+DI+0000],DI
CS:0013 B80000        MOV   AX,0000
他直接跳过CS:10从13开始显示的,这个是什么原理呢?求大佬解惑!
最佳答案
昨天 11:57
在汇编程序加载到内存后,数据区和代码区是连续存放的。你的程序布局如下:


  1. 偏移地址  内容(十六进制)     说明
  2. 0000H:  23 01             ; 0123H(数据)
  3. 0002H:  56 04             ; 0456H(数据)
  4. ...
  5. 000EH:  87 09             ; 0987H(数据)
  6. 000FH:  09               ; 数据最后一个字节
  7. 0010H:  BB 00 00         ; mov bx,0 的机器码
  8. 0013H:  B8 00 00         ; mov ax,0 的机器码
复制代码


关键问题分析:
1. 当执行 `-u cs:f` 时,DEBUG 从偏移地址 0FH 开始反汇编
2. 0FH 处的字节是 09H(来自数据 0987H 的高字节)
3. 09H 是 OR r/m16, r16 指令的操作码
4. DEBUG 将后续字节误解释为:
   - 09H (操作码)
   - BBH (ModR/M 字节)
   - 00H 00H (立即数)
5. 这导致 DEBUG 错误地显示为 OR [bp+di], di(占4字节)

实际代码从 0010H 开始:

  1. 0010H: BB 00 00   → mov bx,0
  2. 0013H: B8 00 00   → mov ax,0
复制代码


原因总结:
DEBUG 的反汇编器无法区分数据和代码,当从数据区内部(0FH)开始反汇编时,会将数据字节错误解释为指令,导致显示错位。正确做法是直接从代码起始地址反汇编:
-u cs:10

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 11:57 | 显示全部楼层    本楼为最佳答案   
在汇编程序加载到内存后,数据区和代码区是连续存放的。你的程序布局如下:


  1. 偏移地址  内容(十六进制)     说明
  2. 0000H:  23 01             ; 0123H(数据)
  3. 0002H:  56 04             ; 0456H(数据)
  4. ...
  5. 000EH:  87 09             ; 0987H(数据)
  6. 000FH:  09               ; 数据最后一个字节
  7. 0010H:  BB 00 00         ; mov bx,0 的机器码
  8. 0013H:  B8 00 00         ; mov ax,0 的机器码
复制代码


关键问题分析:
1. 当执行 `-u cs:f` 时,DEBUG 从偏移地址 0FH 开始反汇编
2. 0FH 处的字节是 09H(来自数据 0987H 的高字节)
3. 09H 是 OR r/m16, r16 指令的操作码
4. DEBUG 将后续字节误解释为:
   - 09H (操作码)
   - BBH (ModR/M 字节)
   - 00H 00H (立即数)
5. 这导致 DEBUG 错误地显示为 OR [bp+di], di(占4字节)

实际代码从 0010H 开始:

  1. 0010H: BB 00 00   → mov bx,0
  2. 0013H: B8 00 00   → mov ax,0
复制代码


原因总结:
DEBUG 的反汇编器无法区分数据和代码,当从数据区内部(0FH)开始反汇编时,会将数据字节错误解释为指令,导致显示错位。正确做法是直接从代码起始地址反汇编:
-u cs:10

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-8 02:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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