Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2666
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2271
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1327
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1418
Дата выхода:20.01.2011, 17:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:217 / 67
Вопросов / ответов:1 / 1

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



Вопрос № 181890:

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

Отправлен: 15.01.2011, 16:57
Вопрос задал: Sanek (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Ситкин Александр Викторович!
1) данные вводятся, как числовая строка максимальной длины 128 байт с проверкой на код цифры.
Конец ввода - клавиша Enter или ровно 128 байт.
2) данные представляют собой байты-числа 0-9

Код:
;Отсортировать по возрастанию элементы массива чисел, кратные 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]
;по адресу arr ay[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

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 16.01.2011, 02:18
Номер ответа: 265437
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265437 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное