存放在第三个数据的存储单元中,为什么是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 哈哈,看来你在搞计算机底层的汇编语言啊!这是一个充满乐趣的“数”字游戏。我们来逐步分析你提到的 `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 小助理,如未能正确解答您的问题,请继续追问。 debug了一下,知道了{:10_250:}
页:
[1]