鱼C论坛

 找回密码
 立即注册
查看: 91|回复: 9

问题3.12

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

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

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

x
mov bx,[4] 变成 mov bx,[c804] ,后面全乱了。。。。。请问什么原因???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 15:41 | 显示全部楼层
你好!你遇到的问题是在汇编语言中 mov bx, 指令后面多了一个逗号,导致语法错误。让我来帮你分析一下原因和解决方法:

原因分析:
1. 汇编语言的 mov 指令需要明确的操作数
2. 多出的逗号会导致汇编器无法正确解析指令格式
3. 可能是输入时的手误或复制粘贴错误

正确写法示例:

  1. mov bx, ax          ; 将ax寄存器的值赋给bx
  2. mov bx, 1234h       ; 直接赋值十六进制数
  3. mov bx, [si]        ; 将si指向的内存值赋给bx
  4. mov bx, offset var  ; 将变量var的偏移地址赋给bx
复制代码


解决方法:
1. 检查指令后面是否有多余的逗号
2. 确保操作数完整且格式正确
3. 如果是复制代码,请检查原始代码的完整性

如果你能提供具体的代码片段,我可以帮你更准确地分析问题所在。

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

使用道具 举报

 楼主| 发表于 昨天 16:19 | 显示全部楼层
FishC 发表于 2025-9-22 15:41
你好!你遇到的问题是在汇编语言中 mov bx, 指令后面多了一个逗号,导致语法错误。让我来帮你分析一下原因 ...
  1. mov ax,1000
  2. mov ss,ax
  3. mov sp,0020
  4. mov ax,cs
  5. mov ds,ax
  6. mov ax,[0]
  7. add ax,[2]
  8. mov bx,[4]
  9. add bx,[6]
  10. push ax
  11. push bx
  12. pop ax
  13. pop bx
  14. -r cs
  15. :1000
  16. -r ip
  17. :0
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 16:20 | 显示全部楼层
531035528 发表于 2025-09-22 16:19
FishC 发表于 2025-9-22 15:41
你好!你遇到的问题是 ...


你好!你遇到的问题是因为在汇编语言中,mov bx, 指令后面多了一个逗号,导致语法错误。汇编指令需要完整的操作数,多出的逗号会让汇编器无法解析,从而“后面全乱了”。

### 原因分析:
- 汇编指令如 mov 必须有两个操作数,例如 mov bx, axmov bx, 1234
- 如果写成 mov bx, ,,缺少第二个操作数,汇编器会报错。
- 你的代码中还有类似问题,如 mov ax,add ax,,这些都不完整。

### 解决方法:
1. 检查并移除所有多余的逗号。
2. 确保每个指令都有完整的操作数。例如:
   - mov ax, value 而不是 mov ax,
   - add ax, value 而不是 add ax,
3. 如果是调试器命令(如 -r cs :1000),确保它们单独执行,不要混在代码中。

### 正确代码示例:

  1. mov ax, 1000
  2. mov ss, ax
  3. mov sp, 0020
  4. mov ax, cs
  5. mov ds, ax
  6. mov ax, 0000   ; 示例:给ax赋值,不能为空
  7. add ax, 0001   ; 示例:给add指令添加操作数
  8. mov bx, 0002   ; 示例:给bx赋值
  9. add bx, 0003   ; 示例:给add指令添加操作数
  10. push ax
  11. push bx
  12. pop ax
  13. pop bx
复制代码


### 额外建议:
- 如果你在使用 Debug 工具,-r cs-r ip 是调试命令,应该在代码之外单独输入。
- 检查代码是否复制粘贴时格式错误,建议手动输入或清理格式。

如果问题依旧,请提供更多上下文,我可以进一步帮助!

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

使用道具 举报

 楼主| 发表于 昨天 16:31 | 显示全部楼层

mov ax,1000
mov ss,ax
mov sp,0020
mov ax,cs
mov ds,ax
mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
push bx
pop ax
pop bx
-r cs
:1000
-r ip
:0
-t
-t
-t
-t
-t
-t
mov bx,[4] 变成 mov bx,[c804]  后面代码全变了.....?????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 16:32 | 显示全部楼层
531035528 发表于 2025-09-22 16:31
531035528 发表于 2025-9-22 16:19


mov ax,1000
m ...


你好!你遇到的问题是因为在汇编语言中,指令如 `mov bx,` 后面多了一个逗号,导致语法错误。汇编器需要完整的操作数,多出的逗号会让它无法解析,从而使后续代码混乱。

### 原因分析:
- 汇编指令如 `mov` 必须有两个操作数,例如 `mov bx, ax` 或 `mov bx, 1234`。
- 如果写成 `mov bx, ,`,缺少第二个操作数,汇编器会报错并可能误解后续代码。
- 你的代码中还有类似问题,如 `mov ax,` 和 `add ax,`,这些都不完整。
- 另外,`-r cs` 和 `-r ip` 是调试器命令(如 DOS 的 debug 工具),不应混在汇编代码中;它们应该单独执行。

### 解决方法:
1. 移除所有多余的逗号,确保每个指令都有完整的操作数。
2. 将调试器命令与汇编代码分开执行。

### 正确代码示例:
以下是修复后的汇编代码示例(假设你想给 ax 和 bx 赋值):


  1. mov ax, 1000
  2. mov ss, ax
  3. mov sp, 0020
  4. mov ax, cs
  5. mov ds, ax
  6. mov ax, 0000   ; 这里必须有一个值,例如 0000
  7. add ax, 0001   ; 这里必须有一个值,例如 0001
  8. mov bx, 0002   ; 这里必须有一个值,例如 0002
  9. add bx, 0003   ; 这里必须有一个值,例如 0003
  10. push ax
  11. push bx
  12. pop ax
  13. pop bx
复制代码


对于调试器命令,如 `-r cs` 和 `-r ip`,你应该在调试器中单独输入,而不是写在代码中。例如:
- 在 debug 中,先输入汇编代码,然后使用 `-r cs` 命令设置寄存器,再使用 `-t` 执行。

### 额外建议:
- 检查代码输入时是否有手误,避免多余字符。
- 如果使用复制粘贴,确保代码格式正确,没有隐藏字符。
- 练习时,逐步输入指令,并随时检查语法。

如果问题依旧,请提供更多上下文,我可以进一步帮助!

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

使用道具 举报

 楼主| 发表于 昨天 16:54 | 显示全部楼层
FishC 发表于 2025-9-22 16:32
你好!你遇到的问题是因为在汇编语言中,指令如 `mov bx,` 后面多了一个逗号,导致语法错误。汇编器需 ...

mov ax,1000
mov ss,ax
mov sp,0020
mov ax,cs
mov ds,ax
mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
push bx
pop ax
pop bx

执行到mov bx,[4]时变成mov bx,[C804]之后代码全变了????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 16:55 | 显示全部楼层
531035528 发表于 2025-09-22 16:54
FishC 发表于 2025-9-22 16:32
你好!你遇到的问题是 ...


你好!你遇到的问题是因为在汇编语言中,指令如 `mov bx,` 后面缺少操作数,导致语法错误。汇编器需要完整的操作数,多出的逗号或缺少值会使它无法解析,从而使后续代码被误解或混乱。

### 原因分析:
- 汇编指令如 `mov` 必须有两个操作数,例如 `mov bx, ax` 或 `mov bx, 1234`。
- 你的代码中出现了不完整的指令:`mov ax,`、`add ax,`、`mov bx,`、`add bx,`。这些缺少源操作数,汇编器会报错。
- 在调试器(如 DOS 的 debug)中,输入不完整指令时,调试器可能等待更多输入或将后续文本当作新指令,导致“后面代码全变了”。
- 另外,`-r cs` 和 `-r ip` 是调试器命令,不应混在汇编代码中;它们应该单独执行。

### 解决方法:
1. 确保所有指令都有完整的操作数。例如,给 `mov ax,` 添加一个值,如 `mov ax, 0000`。
2. 在调试器中,输入汇编代码时,每条指令必须完整输入后再执行。
3. 调试器命令如 `-r cs` 和 `-r ip` 应在代码输入后单独使用。

### 正确代码示例:
以下是修复后的汇编代码示例(假设你想给 ax 和 bx 赋值):

mov ax, 1000
mov ss, ax
mov sp, 0020
mov ax, cs
mov ds, ax
mov ax, 0000   ; 添加操作数,例如 0000
add ax, 0001   ; 添加操作数,例如 0001
mov bx, 0002   ; 添加操作数,例如 0002
add bx, 0003   ; 添加操作数,例如 0003
push ax
push bx
pop ax
pop bx

对于调试器命令,如设置寄存器和单步执行(`-t`),应在调试器中单独输入。例如:
- 先输入以上汇编代码。
- 然后使用 `-r cs` 设置 CS 寄存器为 1000。
- 使用 `-r ip` 设置 IP 寄存器为 0。
- 最后使用 `-t` 多次单步执行。

### 额外建议:
- 检查代码输入时是否有手误,避免多余逗号或缺少操作数。
- 如果使用复制粘贴,确保代码格式正确,没有隐藏字符。
- 练习时,逐步输入指令,并随时检查语法。

如果问题依旧,请提供更多上下文(如使用的调试器类型或完整操作步骤),我可以进一步帮助!

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

使用道具 举报

发表于 昨天 16:57 | 显示全部楼层
531035528 发表于 2025-09-22 16:54
FishC 发表于 2025-9-22 16:32
你好!你遇到的问题是 ...


你好!你遇到的问题是因为在汇编语言中,指令如 `mov bx,` 后面缺少操作数,导致语法错误。汇编器或调试器(如 DOS 的 debug)无法解析不完整的指令,从而可能将后续代码误解为操作数或错误指令,造成“后面代码全变了”的现象。

### 原因分析:
- 汇编指令如 `mov` 和 `add` 必须有两个完整的操作数,例如 `mov ax, 1000` 或 `add ax, 1`。
- 如果你的代码中有 `mov ax,` 或 `add ax,`,缺少第二个操作数,汇编器会报错并可能混乱后续代码的解析。
- 在调试器中,输入不完整指令后,按回车可能立即触发错误,影响后续输入。

### 解决方法:
1. **检查并修复所有不完整指令**:确保每个 `mov` 和 `add` 指令都有两个操作数。
2. **重新输入正确代码**:避免多余逗号或缺少操作数。
3. **在调试器中分开执行命令**:如 `-r cs` 和 `-r ip` 是调试器命令,应在代码之外单独输入,不要混合在汇编指令中。

### 正确代码示例:
假设你想给 `ax` 和 `bx` 赋值,以下是修复后的代码示例:

mov ax, 1000
mov ss, ax
mov sp, 0020
mov ax, cs
mov ds, ax
mov ax, 0000   ; 这里必须有一个值,例如 0000
add ax, 0001   ; 这里必须有一个值,例如 0001
mov bx, 0002   ; 这里必须有一个值,例如 0002
add bx, 0003   ; 这里必须有一个值,例如 0003
push ax
push bx
pop ax
pop bx

### 额外建议:
- 如果你在使用 debug 工具,汇编代码应使用 `a` 命令输入,而调试命令如 `-r cs` 应单独在提示符下输入。
- 例如,在 debug 中:
  - 输入 `a` 开始汇编,然后输入正确的代码。
  - 退出汇编模式后,再输入 `-r cs` 和 `-r ip` 设置寄存器。
  - 最后使用 `-t` 单步执行。
- 检查输入时是否有手误,避免复制粘贴带来的隐藏错误。

如果问题依旧,请提供更多细节,例如你使用的工具或完整上下文,我可以进一步协助!

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

使用道具 举报

发表于 昨天 18:29 | 显示全部楼层
S 段 + 绝对偏移~

mov bx,[4] 取的是 DS:0004 处的字(16位)。通常在 .COM 程序里 DS=CS,很多人把小偏移当作自己数据区里的变量用。

改成 mov bx,[c804] 后,你取的就是 DS:0xC804 处的字了。如果 DS 还是原来的段,这个地址多半已经跑到你代码/数据之外了,只能读到“垃圾值”,接下来用到 BX 的地方自然全乱。

如果你本来就只想读你数据段里那个“偏移是4”的变量,就别把偏移改成一个超大的常量;或确保 DS 指向包含该偏移的段。

你真要读代码段里某个固定位置,明确写:mov bx, cs:[0C804h](并确保那里确实有一个word变量)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-23 23:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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