Assembly 大值的SBYTE或SWORD给出MASM错误A2042

Assembly 大值的SBYTE或SWORD给出MASM错误A2042,assembly,x86,masm,bubble-sort,Assembly,X86,Masm,Bubble Sort,我正在尝试按照以下算法构建气泡排序: 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 我获得了这段

我正在尝试按照以下算法构建气泡排序:

   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

标题显示
.小型模型
.386
堆栈
.数据
X剑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
计数等式(长度X);比X小两个
.代码
.启动
;节目
MOV-DX,计数
L0:
MOV-CX,DX
副秘书长,2
莉丝,X
L1:
MOV AX,单词PTR[SI]
MOV-BX,单词PTR[SI+2]
CMP-AX,BX
JLE-common;如果AX

A2042语句太复杂

发生的原因是您试图将
SBYTE
值放入
SBYTE
数组

  • SBYTE
    可以包含从-128到127的值
  • swarm
    可以包含-32768到32767之间的值
您的数组
X
的类型为
SBYTE
,但您尝试将
swarm
值放入其中。因此出现了错误。因此,将数组更改为

X SWORD 4, 16, 28, 88, 100, ...
并将索引调整为步进2字节,而不是1字节。使用
AX
而不是
AL
来保存2字节字


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

  • 将跳转
    jnzl0
    更改为
    jnzl0
    。MASM区分大小写(除非另有设置)
  • MOV-CX,count
    更改为
    MOV-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
MOV-CX,DX
副秘书长,2
莉丝,X
L1:
MOV AX,单词PTR[SI]
MOV-BX,单词PTR[SI+2]
CMP-AX,BX

JLE-common;如果你的算法有奇怪的缩进
iterate=0
应该与for
循环属于同一个外循环,因此它应该与for i
语句缩进到同一列。此外,上限可以缩小,这样就不必每次外循环都从
0
循环到
N-2
。看见另请参阅,以获得一个不错的冒泡排序(32位代码,但可以很容易地移植到16位)。它不使用提前退房;如果您想使简单的O(N^2)排序更有效,通常您应该使用更好的算法,如InsertionSort,而不是将BubbleSort复杂化为“是否进行了任何交换?”检查。@PeterCordes我为缩进问题道歉。您不必道歉,只需修复它。@PeterCordes好的。我这样做了。我还按照zx485的建议编辑了代码,但是第6行的错误A2042仍然存在,以及调用任意X的X的未定义符号错误(第12行和第15行)。我将
SBYTE
更改为
swarm
,A2042仍然出现在唯一的错误处。它发生在哪一行?您还需要修复这一行:
CMP[SI+1]
,因为它不是有效的指令。第9行。因此,它在第20行创建了另一个错误,并带有“error A2006 undefined symbol X”。要更改索引,我是否必须执行
count eq 38
而不是
count eq 39
,以确保?您的代码中有无效指令
.startup
。移除它,或用
启动:
替换它。另外,请参阅与您的
计数相关的情况<代码>计数相等(X的长度)
就是您想要的。