2016-11-25 51 views
1

我想分兩個數組來創建第三個,但是當我試圖將他們的價值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 
+1

數據類型「DW」需要2個字節的存儲空間,但是「MOV AX,ARR1 [3]」使用的是奇數3.因此,您不會閱讀任何有意義的內容。偏移量必須是2的倍數,在本例中爲'6'。 –

回答

2

每個數據值DW存儲爲2個字節,用最少的顯著字節第一(小端)。但是,您正在使用與數據不一致的偏移量3

你的數據值將出現在內存

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

通過從偏移3寄存器AX加載將獲得價​​值8051(小端),它以十進制是32849.

您應該使用讀取該數組中最後一個元素的偏移量爲6。或者(使用32位模式下),你可以擴展與

MOV EAX, ARR1[EDI*2] 
+0

非常感謝你!現在我明白了 !! –

+3

也許值得注意的是,對於其他讀者,'MOV AX,ARR1 [3]'不是一個數組索引(看起來好像是),而是寫'MOV AX,[ARR1 + 3]'的一種愚蠢的方式。這可能是OP想到的。 –

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 

由於字節(86是小端):

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

所以你加載AX與字節51h80h,即8051h(或32849十進制)。

+0

非常感謝! –