我试图用汇编语言实现QUICK SORT。当我在模拟器中运行代码时,数组' ARR'仅包含零,不加载任何值。我不知道自己做错了什么。 (ARR在代码末尾定义。)
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 1000H
MOV DI,05H ; LAST INDEX (6-1)
XOR SI,SI; INNITAL INDEX
XOR BX,BX; PIVOT INDEX
XOR BP,BP;
CALL QSORT
HLT
QSORT:
PUSH BP
PUSH DI
PUSH SI
CALL PARTITION
MOV SI,BP;
INC SI ; PIVOT INDEX +1 = INITIA IDEX
CMP SI,DI
JNL SKIP_CALL
CALL QSORT
SKIP_CALL:
POP SI;
PUSH SI;
MOV DI,BP;
DEC DI;
CMP SI,DI;
JNL SKIP_AGAIN
CALL QSORT
SKIP_AGAIN:
POP SI;
POP DI;
POP BP;
RET
PARTITION:
PUSH SI
PUSH DI
MOV BP,SI ;PIVOT INDEX
DEC SI; // TO INVALIDATE FIRST INCREMENT
FOR_1:
INC SI
CMP SI,DI
JGE END_FOR_1
MOV AL,ARR[SI]
CMP AL,ARR[DI]; COMPAREING TWO INDEXVAL
JL NO_SWAP
;SWAP OPERATION
PUSH AX;
XOR AX,AX; ENSURING ZEROS IN AH
MOV AL,ARR[BP]; SAVING ARR[SI] CONTENT
MOV ARR[SI],AL;
POP AX;
MOV ARR[BP],AL; SAVING BP'S CONTENT IN SI :P
INC BP;
NO_SWAP:
JMP FOR_1;
END_FOR_1:
MOV AL,ARR[DI];
MOV AH,ARR[BP];
MOV ARR[DI],AH;
MOV ARR[BP],AL;
POP DI;
POP SI;
RET
ORG 1500H
ARR DB 01H,02H,0AH,03H,00H,0CH; RANDOM ARRAY
NAME DW 'ANKLON'
ENDS
为了测试,我在那之后添加另一个字符串数组,甚至没有在变量窗口中显示。
任何人都可以指出我的错误在哪里吗?
我是汇编语言中的新蜜蜂。所以可能会有一些愚蠢的错误。如果有任何不便,我道歉。
答案 0 :(得分:1)
您似乎正在尝试生成一个COM程序,其中 DS 和 CS 段相同。问题是COM程序需要从偏移 100h 开始。因此,ORG 1000H
应为ORG 100H
。不要在代码中使用第二个ORG
,因此您应该删除行ORG 1500H
。这两个问题会混淆 EMU8086 ,当你去显示变量时,它会在错误的位置,并且可能显示你不期望的数据(如零)。
代码如下所示:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
MOV DI,05H ; LAST INDEX (6-1)
XOR SI,SI; INNITAL INDEX
XOR BX,BX; PIVOT INDEX
XOR BP,BP;
CALL QSORT
HLT
QSORT:
PUSH BP
PUSH DI
PUSH SI
CALL PARTITION
MOV SI,BP;
INC SI ; PIVOT INDEX +1 = INITIA IDEX
CMP SI,DI
JNL SKIP_CALL
CALL QSORT
SKIP_CALL:
POP SI;
PUSH SI;
MOV DI,BP;
DEC DI;
CMP SI,DI;
JNL SKIP_AGAIN
CALL QSORT
SKIP_AGAIN:
POP SI;
POP DI;
POP BP;
RET
PARTITION:
PUSH SI
PUSH DI
MOV BP,SI ;PIVOT INDEX
DEC SI; // TO INVALIDATE FIRST INCREMENT
FOR_1:
INC SI
CMP SI,DI
JGE END_FOR_1
MOV AL,ARR[SI]
CMP AL,ARR[DI]; COMPAREING TWO INDEXVAL
JL NO_SWAP
;SWAP OPERATION
PUSH AX;
XOR AX,AX; ENSURING ZEROS IN AH
MOV AL,ARR[BP]; SAVING ARR[SI] CONTENT
MOV ARR[SI],AL;
POP AX;
MOV ARR[BP],AL; SAVING BP'S CONTENT IN SI :P
INC BP;
NO_SWAP:
JMP FOR_1;
END_FOR_1:
MOV AL,ARR[DI];
MOV AH,ARR[BP];
MOV ARR[DI],AH;
MOV ARR[BP],AL;
POP DI;
POP SI;
RET
ARR DB 01H,02H,0AH,03H,00H,0CH; RANDOM ARRAY
NAME DW 'ANKLON'
ENDS