AX in 从单词数组中获取奇怪的数字

AX in gets strange number from word array

我正在尝试对两个数组进行子数组创建第三个数组,但是当我尝试对它们进行子数组时,AX 寄存器获得的值与原始值完全不同。
在第一个子中,如您所见,我试图将数字 2082(822 h) 移动到 AX,但在 TD 中它显示 AX 得到类似 32849(8052 h) 的东西。怎么了???谢谢!!!

.MODEL SMALL
.STACK 100h
.DATA
ARR1   DW 333,20989,3456,2082
ARR2   DW 333,15,5436,2082
ARR3   DW ?
ANSWER DB 'The last digit is: X' ,13,10,'$'
TEN    DW 10


.CODE
     MOV AX,@DATA   ; DS can be written to only through a register
     MOV DS,AX      ; Set DS to point to data segment

     ; Making the first arr3 number

     MOV DI,3
 MOV AX,0
 MOV AX, ARR1[DI]
 SUB AX,ARR2[0]
 MOV ARR3[0], AX
 MOV AX,0

每个数据值 DW 存储为 2 个字节,最低有效字节在前(小端)。但是您使用的偏移量 3 与数据不一致。

您的数据值将在内存中显示为

ARR1    4D 01 FD 51 80 0D 22 08
...              ^^ ^^

通过从偏移量 3 加载,寄存器 AX 将接收值 8051(小端),十进制为 32849。

您应该使用 6 的偏移量来读取该数组中的最后一个元素。或者(使用 32 位模式时)您可以使用

缩放偏移量
MOV EAX, ARR1[EDI*2]

what's wrong?

数组中的每个元素占用一个 word(因为 DW)。在 x86 术语中,一个字是 16 位,即 2 个字节。

因此 ARR1 中的第 4 个单词将位于 [ARR1+3*2],即 [ARR1+6]


TD it shows AX get something like 32094

您正在加载 ARR1 之后的第 3 个和第 4 个字节,所以让我们看看它们包含的内容:

DW 333,20989,3456,2082

为清楚起见,使用十六进制:

DW 014Dh, 51FDh, 0D80h, 0822h

作为字节(x86 是小端):

DB 4Dh,01h,FDh,51h,80h,0Dh,22h,08h

因此您正在加载 AX 字节 51h80h,即 8051h(或十进制的 32849)。