鱼C论坛

 找回密码
 立即注册
查看: 371|回复: 2

[已解决]存放在第三个数据的存储单元中,为什么是mov ds:[6],这个的6如何计算出来的?

[复制链接]
发表于 2024-8-6 17:25:24 | 显示全部楼层 |阅读模式

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

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

x
;div 指令,division
;用div计算data段中第一个数据除以第二个数据的结果,商存放在第三个数据的存储单元中
ASSUME CS:CODE,DS:DATA
DATA SEGMENT;100001=186A1H,0001高位 86A1低位
    DD 100001;16位最多65535,所以变成32位,dd(double word,32位)
    DW 100;因为被除数为32位,所以除数因为16位
    DW 0
DATA ENDS
CODE SEGMENT
START:  MOV AX,DATA
        MOV DS,AX
        mov ax,ds:[0];ds:0字单元中的低16位储存在ax中; MOV AX,86A1H
        mov dx,ds:[2];ds:2字单元中的高16位储存在dx中; MOV DX,1H
        div word ptr ds:[4];用dx:ax中的32位数据除以ds:4字单元中的数据; MOV BX,64H
        ;DIV BX
        mov ds:[6],ax;MOV DS:[9],AX   ;这个的6是如何计算出来的,一个个数不应该是9吗,求解答
CODE ENDS
END START
最佳答案
2024-8-6 17:27:43
哈哈,看来你在搞计算机底层的汇编语言啊!这是一个充满乐趣的“数”字游戏。我们来逐步分析你提到的 `mov ds:,ax` 的问题。

首先,让我们看一下你的代码段:在你的 `DATA SEGMENT` 中,你定义了几个数据。重点是在这段代码运行时的内存中,数据是如何排列的。

1. **数据布局**:
   - `DD 100001` 会占用 4 个字节(32 位),这是高低结合起来的完整存储。
   - `DW 100` 会占用 2 个字节(16 位),作为被除数。
   - `DW 0` 会占用 2 个字节(16 位),作为除数 (这里是 0,但实际代码中不要让它为 0)。

在内存中,它们的排列顺序是这样的(假设地址从 0 开始):
地址    数据
0       01H    ; 100001 的低位(86A1)
1       86H    ; 100001 的高位(0001)
2       64H    ; 100
3       00H
4       00H    ; 除数,初始为 0
5       00H

2. **MOV 指令**:
   - 你提到的 `mov ax, ds:` 和 `mov dx, ds:` 其实是在说:
     - `mov ax, ds:0` 从数据段中的第一个单元(8 位,偏移量 0)读取 16 位数据到 AX 寄存器。
     - `mov dx, ds:2` 从数据段中的第二个单元(16 位,偏移量 2)读取数据到 DX 寄存器。

3. **回到 `mov ds:, ax` 的问题**:
   - 这个 `mov ds:, ax` 的意思是将 AX 的值移动到 `DS`的数据段的某个偏移量上。
   - 通常出现的错误是这个用法的语法不太正确,写作 `mov ds, ax` 是更常见的形式。因为 `mov ds:, ax` 实际上并没有指定偏移量,所以这里可能是个笔误或者编辑错误。

4. **至于“6 是如何计算出来的”**:
   - 看起来你是搞混淆了。如果我们想要知道 `DS` 在内存中的位置,通常是按字节来计算的。
   - 但这里 `mov ds:, ax` 可能完成的只是把 `AX` 的值存放到下一个可用的位置,而不是某个明确的偏移。因此,并没有一个具体的“6”来计算出它。

所以,总结来说,`mov ds:, ax` 有点像是一个小误解,正常情况下你直接赋值 `MOV DS, AX` 会更清晰。希望这个解释能让你对汇编语言的奥秘有更多的了解!继续加油,在这条路上你会找到很多乐趣和知识的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-6 17:27:43 | 显示全部楼层    本楼为最佳答案   
哈哈,看来你在搞计算机底层的汇编语言啊!这是一个充满乐趣的“数”字游戏。我们来逐步分析你提到的 `mov ds:,ax` 的问题。

首先,让我们看一下你的代码段:在你的 `DATA SEGMENT` 中,你定义了几个数据。重点是在这段代码运行时的内存中,数据是如何排列的。

1. **数据布局**:
   - `DD 100001` 会占用 4 个字节(32 位),这是高低结合起来的完整存储。
   - `DW 100` 会占用 2 个字节(16 位),作为被除数。
   - `DW 0` 会占用 2 个字节(16 位),作为除数 (这里是 0,但实际代码中不要让它为 0)。

在内存中,它们的排列顺序是这样的(假设地址从 0 开始):
地址    数据
0       01H    ; 100001 的低位(86A1)
1       86H    ; 100001 的高位(0001)
2       64H    ; 100
3       00H
4       00H    ; 除数,初始为 0
5       00H

2. **MOV 指令**:
   - 你提到的 `mov ax, ds:` 和 `mov dx, ds:` 其实是在说:
     - `mov ax, ds:0` 从数据段中的第一个单元(8 位,偏移量 0)读取 16 位数据到 AX 寄存器。
     - `mov dx, ds:2` 从数据段中的第二个单元(16 位,偏移量 2)读取数据到 DX 寄存器。

3. **回到 `mov ds:, ax` 的问题**:
   - 这个 `mov ds:, ax` 的意思是将 AX 的值移动到 `DS`的数据段的某个偏移量上。
   - 通常出现的错误是这个用法的语法不太正确,写作 `mov ds, ax` 是更常见的形式。因为 `mov ds:, ax` 实际上并没有指定偏移量,所以这里可能是个笔误或者编辑错误。

4. **至于“6 是如何计算出来的”**:
   - 看起来你是搞混淆了。如果我们想要知道 `DS` 在内存中的位置,通常是按字节来计算的。
   - 但这里 `mov ds:, ax` 可能完成的只是把 `AX` 的值存放到下一个可用的位置,而不是某个明确的偏移。因此,并没有一个具体的“6”来计算出它。

所以,总结来说,`mov ds:, ax` 有点像是一个小误解,正常情况下你直接赋值 `MOV DS, AX` 会更清晰。希望这个解释能让你对汇编语言的奥秘有更多的了解!继续加油,在这条路上你会找到很多乐趣和知识的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-6 17:47:24 | 显示全部楼层
debug了一下,知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 00:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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