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

Assembly AX-in从单词数组中获取奇怪的数字,assembly,x86,tasm,Assembly,X86,Tasm,我试图将两个数组细分以创建第三个数组,但当我尝试将它们细分时,AX寄存器得到的值与原始值完全不同。 在第一小节中,正如您所看到的,我试图将数字2082(822h)移动到AX,但在TD中,它显示AX得到了类似32849(8052h)的值。怎么了???谢谢 .MODEL SMALL .STACK 100h .DATA ARR1 DW 333,20989,3456,2082 ARR2 DW 333,15,5436,2082 ARR3 DW ? ANSWER DB 'The last dig

我试图将两个数组细分以创建第三个数组,但当我尝试将它们细分时,AX寄存器得到的值与原始值完全不同。
在第一小节中,正如您所看到的,我试图将数字2082(822h)移动到AX,但在TD中,它显示AX得到了类似32849(8052h)的值。怎么了???谢谢

.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]
怎么了

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

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


TD显示AX获得了类似于32094的数据

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

DW 333,20989,3456,2082
为清晰起见:

DW 014Dh, 51FDh, 0D80h, 0822h
作为字节(x86为小端):


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

数据类型
DW
占用2个字节的存储空间,但
MOV-AX,ARR1[3]
使用奇数3。所以你不会读任何有意义的东西。偏移量必须是2的倍数,在本例中为
6
。可能值得注意的是,对于其他读者来说,
MOV AX,ARR1[3]
不是数组索引(看起来像),而是一种愚蠢的编写
MOV AX,[ARR1+3]
的方式。这可能就是OP的想法。
DB 4Dh,01h,FDh,51h,80h,0Dh,22h,08h