关于汇编课程问题8.1的代码
data segmentdd 100001
dw 100
dw 0
data ends
code segment
asd: mov ax, data
mov ds, ax
mov bx, 0
mov ax,
add bx, 2
mov dx,
mov cx, ds:
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,
add bx, 2
mov dx,
div ds:
mov ax,4c00H
int 21H
code ends
end asd
这样就会报错
code segment
asd: mov ax, data
mov ds, ax
mov bx, 0
mov ax,
add bx, 2
mov dx,
div word ptr ds:
mov ax,4c00H
int 21H
code ends
end asd
这样又不会报错呢
在汇编语言中,`DIV` 指令的操作数必须是完整的内存地址或寄存器。以下是问题分析及解决方案:
### 错误原因分析:
1. **第二段代码报错**:`div ds:`
- `ds:` 仅表示段前缀,缺少内存偏移量(如 ``、``),导致汇编器无法识别操作数。
- 正确写法需包含偏移量,例如 `div word ptr `。
2. **第三段代码不报错**:`div word ptr ds:`
- 虽然语法不标准,但某些汇编器(如旧版MASM/TASM)会将 `ds:` 隐式解释为 `ds:`(偏移量0)。
- 加上 `word ptr` 明确操作数大小后,汇编器能按 `ds:0` 地址处理数据。
3. **第一段代码不报错**:
- 实际代码 `mov cx, ds:` 也应报错(缺少偏移量),可能是题目笔误。正确写法应为 `mov cx, ` 或 `mov cx, ds:`。
---
### 解决方案:
修改代码,确保内存操作数包含 **完整地址**(段前缀+偏移量):
data segment
dd 100001 ; 定义双字 (100001)
dw 100 ; 定义字 (100)
dw 0 ; 预留空间
data ends
code segment
asd:
mov ax, data
mov ds, ax ; 设置DS指向数据段
mov bx, 0 ; BX=0
mov ax, ; 从ds:0读取低16位到AX
add bx, 2 ; BX=2
mov dx, ; 从ds:2读取高16位到DX
div word ptr ; 除以ds:4处的值(100)
mov ax, 4c00h
int 21h ; 退出程序
code ends
end asd
### 关键点:
1. 内存操作数必须包含偏移量(如 ``、``)。
2. 用 `word ptr` 明确操作数大小(16位除数为字类型)。
3. 数据段布局:
- `ds:0` → 100001 的低16位
- `ds:2` → 100001 的高16位
- `ds:4` → 除数 100
按此修正即可避免语法错误,实现 `100001 ÷ 100` 的运算。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]