Консультация № 181035
30.11.2010, 03:04
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Не могли бы Вы мне помочь составить программу сортировки элементов массива из 20 целых чисел, которая располагает четные числа больше 100 в одной, а меньше 100 в другой области памяти.
Я только начала осваивать ассемблер, и пока не очень получается...(((
Заранее спасибо)


Приложение:
;сортировка массива

DATA SEGMENT ; Открыть сегмент данных
MAS DW 20 dup(6, 102, 12, 150, 46, -78, 150, 200, -4, 76, 89, 287, -190, 27, 85, -3, 9, 15, 156, -96) ; Определить массив из 20 чисел
Rn DW 2
MasMax DW 20 dup(?)
MasMin DW 20 dup(?)
DATA ENDS ; Закрыть сегмент данных

STK SEGMENT ; Открыть сегмент стека
DB 100 DUP (?) ; Определить стек длиной 100 байт
STK ENDS ; Закрыть сегмент стека

ASSUME DS:DATA, CS:CODE, SS:STK ; Задать соответствия сегментов

CODE SEGMENT ; открыть сегмент кода
START:
xor CX, CX ;очистить регистр AX
MOV AX, DATA ; инициализировать
MOV DS, AX ; сегментный регистр DS
MOV CX, 20 ; Задать счетчик для цикла
MOV SI, 00 ; Задать счетчик для массива MAS
MOV DI,00

MET1:
xor DX, DX ;очистить регистр AX
MOV AX, MAS[SI] ; Занести в AX SI-ый элемент массива MAS
MOV BX, AX
IDIV Rn
AND AX, 1 ; Логическ
ADD SI, 2 ; SI := SI + 2, Элемент массива MAS +1
CMP DX, 0 ; Сравнить значение остатка с 0
JZ MET2 ; Если остаток равен 0, перейти к MET2
LOOP MET1 ; CX := CX - 1, перейти к метке MET1
JMP EXIT2 ; перейти к метке EXIT

MET2:
CMP BX, 100 ; сравнить АХ со 100
JZ EXIT ; Если счетчик цикла =0, перейти к EXIT
MOV DX,BX
LEA BX, offset MasMin[DI]
MOV [BX], DX

;shr MasMin,1
SUB CX, 01 ; Отнять от CX единицу
CMP CX, 00 ; Сравнить CX c 00
JZ EXIT2 ; Если счетчик цикла =0, перейти к EXIT
JMP MET1 ; Вернуться к метке MET1

EXIT:
MOV DX,BX
LEA Bx, offset MasMax[DI]
MOV [BX], DX

;shr MasMax,1
SUB CX, 01 ; Отнять от CX единицу
CMP CX, 00 ; Сравнить CX c 00
JZ EXIT2 ; Если счетчик цикла =0, перейти к EXIT
JMP MET1 ; Вернуться к метке MET1

EXIT2:
mov ax,4c00h ;стандартный выход
int 21h

CODE ENDS ; закрыть сегмент кода
END START

Обсуждение

давно
Посетитель
7438
7205
30.11.2010, 14:34
общий
это ответ
Здравствуйте, Regina!
Я подправил Вашу программу. Сравните со своей. Полагаю, сами поймете суть изменений...
Удачи в освоении Ассемблера!

Код:
;сортировка массива

DATA SEGMENT ; Открыть сегмент данных
MAS DW 6, 102, 12, 150, 46, -78, 150, 200, -4, 76, 89, 287, -190, 27, 85, -3, 9, 15, 156, -96 ; Определить массив из 20 чисел
MasMax DW 20 dup(?)
MasMin DW 20 dup(?)
DATA ENDS ; Закрыть сегмент данных

STK SEGMENT ; Открыть сегмент стека
DW 100 DUP (?) ; Определить стек длиной 100 слов (а не байт!!!)
STK ENDS ; Закрыть сегмент стека

ASSUME DS:DATA, CS:CODE, SS:STK ; Задать соответствия сегментов

CODE SEGMENT ; открыть сегмент кода
START:
MOV AX, DATA ; инициализировать
MOV DS, AX ; сегментный регистр DS
MOV CX, 20 ; Задать счетчик для цикла
lea si, MAS ; Задать адрес массива MAS
lea di, MasMax ; адрес массива MasMax
lea bx, MasMin ; адрес массива MasMin

MET1: ; цикл по всем словам
lodsw ; читаем слово ax = ds:[si], si=si+2
test ax, 1 ; признаком четности является младший бит!
jnz next ; = 1 - нечет - обходим
cmp ax, 100 ; четные числа сравниваем с 100
jg SetMax ; если > 100, то пишем в массив MasMax
mov [bx], ax ; если <= 100, то пишем в массив MasMin
inc bx ; на следующий адрес
inc bx
jmp next ; на следующее слово
SetMax:
mov [di], ax ; пишем в MasMax
inc di ; на следующий адрес
inc di
next:
loop MET1 ; dec cx, переход на MET1, если cx не 0

mov ax,4c00h ;стандартный выход
int 21h

CODE ENDS ; закрыть сегмент кода
END START
5
Спасибо Вам огромное, Вы мне очень помогли!)))
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа