鱼C论坛

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

关于汇编课程问题8.1的代码

[复制链接]
发表于 11 小时前 | 显示全部楼层 |阅读模式

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

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

x
data segment
dd 100001
dw 100
dw 0
data ends
code segment
asd: mov ax, data
        mov ds, ax
        mov bx, 0
        mov ax, [bx]
        add bx, 2
        mov dx, [bx]
        mov cx, ds:[4]
        div cx
        mov ax,4c00H
        int 21H
code ends
end asd
这样就不会报错
code segment
asd: mov ax, data
        mov ds, ax
        mov bx, 0
        mov ax, [bx]
        add bx, 2
        mov dx, [bx]
        div ds:[4]
        mov ax,4c00H
        int 21H
code ends
end asd
这样就会报错
code segment
asd: mov ax, data
        mov ds, ax
        mov bx, 0
        mov ax, [bx]
        add bx, 2
        mov dx, [bx]
        div word ptr ds:[4]
        mov ax,4c00H
        int 21H
code ends
end asd
这样又不会报错呢

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 11 小时前 | 显示全部楼层
在汇编语言中,`DIV` 指令的操作数必须是完整的内存地址或寄存器。以下是问题分析及解决方案:

### 错误原因分析:
1. **第二段代码报错**:`div ds:`  
   - `ds:` 仅表示段前缀,缺少内存偏移量(如 `[bx]`、`[0]`),导致汇编器无法识别操作数。
   - 正确写法需包含偏移量,例如 `div word ptr [bx]`。

2. **第三段代码不报错**:`div word ptr ds:`  
   - 虽然语法不标准,但某些汇编器(如旧版MASM/TASM)会将 `ds:` 隐式解释为 `ds:[0]`(偏移量0)。  
   - 加上 `word ptr` 明确操作数大小后,汇编器能按 `ds:0` 地址处理数据。

3. **第一段代码不报错**:  
   - 实际代码 `mov cx, ds:` 也应报错(缺少偏移量),可能是题目笔误。正确写法应为 `mov cx, [0]` 或 `mov cx, ds:[0]`。

---

### 解决方案:
修改代码,确保内存操作数包含 **完整地址**(段前缀+偏移量):

  1. data segment
  2.     dd 100001    ; 定义双字 (100001)
  3.     dw 100       ; 定义字 (100)
  4.     dw 0         ; 预留空间
  5. data ends

  6. code segment
  7. asd:
  8.     mov ax, data
  9.     mov ds, ax   ; 设置DS指向数据段
  10.     mov bx, 0    ; BX=0
  11.     mov ax, [bx] ; 从ds:0读取低16位到AX
  12.     add bx, 2    ; BX=2
  13.     mov dx, [bx] ; 从ds:2读取高16位到DX
  14.     div word ptr [bx+2] ; 除以ds:4处的值(100)
  15.     mov ax, 4c00h
  16.     int 21h      ; 退出程序
  17. code ends
  18. end asd
复制代码


### 关键点:
1. 内存操作数必须包含偏移量(如 `[bx]`、`[0]`)。
2. 用 `word ptr` 明确操作数大小(16位除数为字类型)。
3. 数据段布局:
   - `ds:0` → 100001 的低16位
   - `ds:2` → 100001 的高16位
   - `ds:4` → 除数 100

按此修正即可避免语法错误,实现 `100001 ÷ 100` 的运算。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-19 12:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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