SBYTE или SWORD с большими значениями дает MASM Error A2042 - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь создать пузырьковую сортировку, которая следует этому алгоритму:

   iterate = 0             ; reset outer loop condition
   for i = 0 to N-2
      if X[i] > X[i+1] then
            swap X[i], X[i+1]
            iterate = 1    ; this pass did at least 1 swap: not done
Until iterate = 0

Я получил этот код, но мой массив для X создает ошибку A2042 для больших значений (которые необходимы в этом случае ) и поэтому не может заглянуть в отладчик.

TITLE DISPLAY
      .MODEL SMALL
      .386
      .STACK
      .DATA
X     SWORD 4, 16, 28, 88, 100, 32766, -16374, -19650, -22926, -56, -44, -32, -20, 3282,
-6546, -9822, -13098, 22938, -116, -68, -104, -92, 40, 16, -3270, 26214, 6558,
16386, 29490, 13110, 9834, 52, -128, -80, -8, 19662, -26202, -29478, 64, 76
count EQU (LENGTHOF X)                        ;two less than X

.code
.startup
;Program
    MOV DX, count
    L0:
        MOV CX, DX
        SUB CX, 2
        LEA SI, X

        L1:
            MOV AX, WORD PTR [SI]        
            MOV BX, WORD PTR [SI+2]
            CMP AX, BX
            JLE common                 ; If AX <= BX, skip the below two lines
            MOV WORD PTR [SI+2], AX  ; Switch values: former BX to AX
            MOV WORD PTR [SI], BX    ; Switch values: former AX to BX
            common:
            ADD SI, 2
            LOOP L1

        DEC DX
        JNZ L0

.exit
end

1 Ответ

1 голос
/ 21 марта 2020

Ошибка

Слишком сложный оператор A2042

возникает из-за попытки вписать SWORD значения в массив SBYTE.

  • SBYTE может содержать значения от -128 до 127
  • SWORD может содержать значения от -32768 до 32767.

Ваш массив X имеет тип SBYTE, но вы пытаетесь вписать в него SWORD значения. Отсюда и ошибка. Поэтому измените ваш массив на

X SWORD 4, 16, 28, 88, 100, ...

и настройте индексы с шагом 2 байта вместо 1. Используйте AX вместо AL для хранения 2-байтовых слов.


Также (некоторые дополнительные подсказки - без стремления к завершению):

  • Измените свой прыжок JNZ l0 на JNZ L0. MASM чувствителен к регистру (если не указано иное).
  • Измените MOV CX, count на MOV CX, DX, чтобы избежать переполнения во внутренней l oop

Это упростит вашу внутреннюю l oop на следующее:

MOV CX, DX
SUB CX, 2
LEA SI, X

L1:
  MOV AX, WORD PTR [SI]        
  MOV BX, WORD PTR [SI+2]
  CMP AX, BX
JLE common                 ; If AX <= BX, skip the below two lines
  MOV WORD PTR [SI+2], AX  ; Switch values: former BX to AX
  MOV WORD PTR [SI], BX    ; Switch values: former AX to BX
common:
  ADD SI, 2
  LOOP L1
...