我正在尝试将两个数组分别创建第三个数组,但是当我尝试将它们分开时,AX寄存器获取的值与原始数据完全不同。
在第一个子项中,正如您所看到的,我正在尝试将数字2082(822小时)移动到AX,但在TD中它显示AX得到类似32849(8052小时)的数字。怎么了???感谢!!!
.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
答案 0 :(得分:2)
每个数据值3
存储为2个字节,最低有效字节优先(little-endian)。但是您使用的ARR1 4D 01 FD 51 80 0D 22 08
... ^^ ^^
偏移量与数据不对齐。
您的数据值将以
的形式显示在内存中3
通过从偏移AX
加载寄存器8051
将收到值6
(little-endian),其十进制为32849。
您应该使用MOV EAX, ARR1[EDI*2]
的偏移量来读取该数组中的最后一个元素。或者(使用32位模式时),您可以使用
current_user.events.update(params[:events].keys,params[:events].values)
答案 1 :(得分:1)
出了什么问题?
数组中的每个元素都占用一个单词(因为DW
)。在x86术语中,一个字是16位,即2个字节。
因此ARR1
中的第4个字位于[ARR1+3*2]
,即[ARR1+6]
。
TD它显示AX得到类似32094
的东西
您正在加载ARR1
之后的第3个和第4个字节,所以让我们看看它们包含的内容:
DW 333,20989,3456,2082
为了清晰起见,为十六进制:
DW 014Dh, 51FDh, 0D80h, 0822h
as bytes(x86是little-endian):
DB 4Dh,01h,FDh,51h,80h,0Dh,22h,08h
因此,您要加载AX
字节51h
,80h
,即8051h
(或十进制的32849)。