GUNDAM_00 发表于 2024-8-6 17:25:24

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

;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:;ds:0字单元中的低16位储存在ax中; MOV AX,86A1H
      mov dx,ds:;ds:2字单元中的高16位储存在dx中; MOV DX,1H
      div word ptr ds:;用dx:ax中的32位数据除以ds:4字单元中的数据; MOV BX,64H
      ;DIV BX
      mov ds:,ax;MOV DS:,AX   ;这个的6是如何计算出来的,一个个数不应该是9吗,求解答
CODE ENDS
END START

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

GUNDAM_00 发表于 2024-8-6 17:47:24

debug了一下,知道了{:10_250:}
页: [1]
查看完整版本: 存放在第三个数据的存储单元中,为什么是mov ds:[6],这个的6如何计算出来的?