1

アセンブリ言語で 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

をテストするために、変数ウィンドウにも表示されていない別の文字列配列をその後に追加します。 var のスクリーンショット

誰が私の間違いがどこにあるかを示すことができますか?

4

1 に答える 1

1

DSセグメントとCSセグメントが同じである COM プログラムを生成しようとしているようです。問題は、COM プログラムがオフセット100hで開始する必要があることです。だからあなたはそうORG 1000HあるべきですORG 100HORGコードで秒を使用しないでください。そのため、行を削除する必要がありますORG 1500H。これらの 2 つの問題は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
于 2015-11-15T19:47:26.140 に答える