Я пытаюсь объединить два массива для создания третьего, но когда я пытаюсь добавить их, значение, получаемое регистром 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
Liad BR 25 Ноя 2016 в 18:04

2 ответа

Лучший ответ

Каждое значение данных DW хранится в виде 2 байтов, начиная с младшего байта (с прямым порядком байтов). Но вы используете смещение 3, которое не совпадает с данными.

Ваши значения данных появятся в памяти как

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

При загрузке со смещения 3 регистр AX получит значение 8051 (с прямым порядком байтов), которое в десятичном виде равно 32849.

Вы должны использовать смещение 6 для чтения последнего элемента в этом массиве. В качестве альтернативы (при использовании 32-битного режима) вы можете масштабировать смещение с помощью

MOV EAX, ARR1[EDI*2]
2
Weather Vane 25 Ноя 2016 в 15:32

в чем дело?

Каждый элемент в ваших массивах занимает одно слово (из-за DW). В терминологии x86 слово составляет 16 бит, то есть 2 байта.

Таким образом, 4-е слово из ARR1 будет расположено в [ARR1+3*2], то есть [ARR1+6].


TD показывает, что AX получает что-то вроде 32094

Вы загружаете 3-й и 4-й байты после ARR1, поэтому давайте посмотрим, что они содержат:

DW 333,20989,3456,2082

В шестнадцатеричном формате для ясности:

DW 014Dh, 51FDh, 0D80h, 0822h

В байтах (x86 с прямым порядком байтов):

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

Итак, вы загружаете AX байтами 51h, 80h, то есть 8051h (или 32849 в десятичном формате).

1
Michael 25 Ноя 2016 в 15:23