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的长度)
就是您想要的。