0

我正在尝试构建遵循此算法的冒泡排序:

   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

4

1 回答 1

1

错误

A2042 语句太复杂

发生是因为您尝试将SWORD值适合您的SBYTE数组。

  • SBYTE可以包含从 -128 到 127 的值
  • SWORD可以包含从 -32768 到 32767 的值。

您的数组X是 type SBYTE,但您尝试将SWORD值放入其中。因此错误。因此,将您的数组更改为

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

并将索引调整为 2 个字节而不是 1 个。使用AX而不是AL保存 2 个字节的字。


此外(一些进一步的提示 - 没有完成的愿望):

  • 将跳转更改JNZ l0JNZ L0. MASM 区分大小写(除非另有设置)。
  • 更改MOV CX, countMOV CX, DX避免内循环溢出

这会将您的内部循环简化为以下内容:

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
于 2020-03-21T01:10:22.973 回答