我正在尝试构建一个遵循此算法的冒泡排序:
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
发布于 2020-03-21 01:10:23
错误
A2042语句太复杂
因为您尝试将SWORD
值放入SBYTE
数组中而发生。
SBYTE
可以包含-32768到32767之间的值,127SWORD
可以包含-128到32767之间的值。您的数组X
的类型为SBYTE
,但是您尝试将SWORD
值放入其中。因此出现了错误。因此,将数组更改为
X SWORD 4, 16, 28, 88, 100, ...
并将索引调整为2字节,而不是1。使用AX
而不是AL
来保存2字节字。
还有(一些进一步的提示-没有完成的愿望):
JNZ l0
更改为JNZ L0
。MASM区分大小写(除非将otherwise).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
https://stackoverflow.com/questions/60783208
复制相似问题