Консультация № 181890
15.01.2011, 16:57
59.73 руб.
0 7 1
Здравствуйте! У меня возникли сложности с написание следующей программе на Assembler (TASM): "Отсортировать по возрастанию элементы массива чисел, кратные 3". К программе желательно краткое пояснение. Заранее спасибо.

Обсуждение

давно
Старший Модератор
31795
6196
15.01.2011, 20:49
общий
Что именно для Вас сложно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
16.01.2011, 01:32
общий
Ох, уж это выражение "сложности с написанием"... Не скромничайте, Вы хотите, чтобы за Вас все написали?

Хотя бы скажите:
1) массив - байты, слова, двойные слова?
2) их надо - ввести с клавиатуры, можно задать в коде программы?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
16.01.2011, 02:18
общий
это ответ
Здравствуйте, Ситкин Александр Викторович!
1) данные вводятся, как числовая строка максимальной длины 128 байт с проверкой на код цифры.
Конец ввода - клавиша Enter или ровно 128 байт.
2) данные представляют собой байты-числа 0-9

[code h=200];Отсортировать по возрастанию элементы массива чисел, кратные 3.

model small ;модель памяти
.stack 512 ;стек

.data
array DB 128 dup (?) ;массив
n equ $-array ;max длина массива
len dw 0 ;реальная длина массива
sArray db 'Array: $'
sSorted db 0dh,0ah,'Sorted: $'
press db 0dh,0ah,'Press any key$'

.code
start: ;точка входа
mov ax, @data ;зададим сенменты данных
mov ds, ax
mov es, ax

lea dx, sArray
mov ah, 9
int 21h ;строка приглашения для ввода array

mov len, 0 ;будем считать длину введенной строки
lea di, array ;адрес массива array
mov cx, n ;максимальная длина массива array
c1: mov ah, 8 ;функция ввода кода без отображения
c2: int 21h
cmp al, 0dh ;по Enter-у прекращаем ввод
je sort ;на сортировку
cmp al, '0' ;проверка на цифру
jb c2 ;нецифру игнорируем
cmp al, '9'
ja c2
mov dl, al ;сохраним для вывода
and al, 0fh ;превратим в число
stosb ;сохраним
mov ah, 2 ;функция вывода символа из dl
int 21h
inc len ;считаем длину массива
loop c1 ;по всем
;попадаем сюда, если введем все 128 кодов
;отсортируем массив методом пузырька
sort:
xor si, si ;индекс элемента в массиве
mov cx, len ;число сортируемых элементов
cmp cx, 2 ;если не ввели ни одного или один
jbe result ; то нечего и сортировать - на вывод результата
dec cx ;число сравнений
mov bl, 3 ;будем делить на 3
SortLoop: ;цикл по поиску очередного минимального
mov al, array[si] ;текущий максимальный по адресу [si]
call div3 ;проверим, делится ли на 3
jne ExternalNext ;нет - обходим - на увеличение индекса текущего элемента
mov ah, al ;считаем минимальным, сохраним в ah
lea di, [si+1] ;начинаем со следующего
push cx ;сохраним счетчик
SearchMinLoop: ;цикл по всем последующим
;сравниваем текущий со всеми последующими
mov al, array[di] ;очередной последующий
call div3 ;проверим, делится ли на 3
jne InternalNext ;нет - обходим - на увеличение индекса последующего элемента
cmp ah, al ;если текущий минимальный <= последующего,
jle InternalNext ; то обходим обмен
;меняем местами элементы
xchg ah, array[di] ;ah=array[di], array[di]=ah=array[si]
mov array[si], ah ;array[si]=ah=array[di]
;по адресу array[si] и в ah новый минимальный
InternalNext:
inc di ;на следующий последующий
loop SearchMinLoop ;по всем последющим элементам
pop cx ;восстановим счетчик сравнений
ExternalNext:
inc si ;на следующий текущий
loop SortLoop ;по всем текущим элементам

result: ;массив отсортирован
lea dx, sSorted ;выводимая строка перед массивом
call print ;выведем

lea dx, press
mov ah, 9
int 21h ;press any key

mov ah, 8
int 21h ;подождем нажатия на клавишу, чтобы окно сразу не уходило :)

mov ax, 4c00h
int 21h ;выход в ДОС

print proc ;вывод массива чисел 0-9 на экран
mov ah, 9
int 21h ;выведем строку, адрес которой в dx
lea si, array ;адрес массива
mov cx, len ;число элементов
jcxz PrintRet ;если ничего не было введено, то нечего и выводить
mov ah, 2 ;функция вывода символа
PrintLoop:
mov dl, [si] ;очередной байт
or dl, '0' ;делаем символ
inc si ;на следущий байт
int 21h ;выводим
loop PrintLoop ;по всем байтам
PrintRet:
ret
print endp

;проверка деления на 3, при этом должно быть bl=3
;результат в флаге FZ: установлен - делится нацело
div3 proc
push ax ;сохраним и al и ah в стеке
mov ah, 0 ;подготовимся к делению
div bl ;ax:bl
cmp ah, 0 ;ah - остаток от деления = 0 -> разделилось нацело
pop ax ;восстановим al и ah
ret
div3 endp

end start[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.01.2011, 19:06
общий
Извините, что сразу не получилось ответить. Да, на счет "сложности с написанием" - точно сказано, правильнее "я ниче не знаю, выручайте". Числа в массив вводятся с клавиатуры. Данные представляют собой байты-числа 0-9.
давно
Старший Модератор
31795
6196
16.01.2011, 23:15
общий

Порстите за сорказм!

Шутки с ассемблерщиками плохи:

Вот такие мы "редиски", в несколько байт вирус запихнуть - элементарно.

В будущем. пожалуйста, задание - задачу - формулируйте полностью.





для экспертов: кто не знает, обращайтесь
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
17.01.2011, 00:26
общий
Ничего страшного, сарказм принят, впредь буду умнее
давно
Посетитель
7438
7205
17.01.2011, 03:50
общий
Я подправил программу с учетом ввода числового массива.

PS Изучите ассемблер. Вы увидите, насколько это удивительный и мощный язык...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа