emu8086:ARR不包含任何值

时间:2015-11-15 19:04:57

标签: arrays assembly

我试图用汇编语言实现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

为了测试,我在那之后添加另一个字符串数组,甚至没有在变量窗口中显示。 screen shot of var

任何人都可以指出我的错误在哪里吗?

我是汇编语言中的新蜜蜂。所以可能会有一些愚蠢的错误。如果有任何不便,我道歉。

1 个答案:

答案 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