2015-11-15 5 views
1

Я пытался реализовать QUICK SORT на языке ассемблера. Когда я запускаю код в эмуляторе, массив «ARR» содержит только нули, значения не загружаются. Я не знаю, что я делаю неправильно. (ARR определяется в конце кода.)emu8086: 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

Похоже, вы пытаетесь генерировать 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 
Смежные вопросы