AX in从单词数组

时间:2016-11-25 15:04:44

标签: assembly x86 tasm

我正在尝试将两个数组分别创建第三个数组,但是当我尝试将它们分开时,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

2 个答案:

答案 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字节51h80h,即8051h(或十进制的32849)。