Assembly AX-in从单词数组中获取奇怪的数字
我试图将两个数组细分以创建第三个数组,但当我尝试将它们细分时,AX寄存器得到的值与原始值完全不同。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
在第一小节中,正如您所看到的,我试图将数字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