Search code examples
arrayssortingassemblyx86-16emu8086

emu8086 : ARR do not contain any value


I was trying to implement QUICK SORT in assembly language .When I run the code in emulator , the array 'ARR' contains only zeros, no values are loaded. I don't know what I do wrong . (ARR is defined at the end of the code.)

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

To test , I add another string array after that which is not even shown in the variables windows. screen shot of var

Can anyone indicate where my mistake is ?


Solution

  • It appears you are trying to generate a COM program where the DS and CS segment are the same. The problem is that a COM program needs to start at offset 100h. So your ORG 1000H should be ORG 100H . Don't use a second ORG in your code so you should remove the line ORG 1500H . These two problems will confuse EMU8086 and when you go to display the variable it will be in the wrong place and will likely show data (like zeroes) that you don't expect.

    The code would look like this:

    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