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

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


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

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

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

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

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

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

Вопрос № 181795: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Дано следующее условие задачи: Отсортировать по убыванию элементы массива, имеющие чётный индекс. TASM/DOS/16-bit /модель памяти small/размер переменных db (про остальные типы нам как б...



Вопрос № 181795:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Дано следующее условие задачи:
Отсортировать по убыванию элементы массива, имеющие чётный индекс.
TASM/DOS/16-bit
/модель памяти small/размер переменных db (про остальные типы нам как бы не рассказывали)/

Потуги были.. Такие что.. выкладывать стыдно. Брал чужие программы и.. потрошил.
По мимо того что это .. не работает. Тов. Преподаватель ругается на то что я "лез в сегменты" offset и проч. Не я лез, так получилось.
Последний срок сдачи завтра.
Очень рассчитываю на Вашу помощь.

(И вот этот ужас ниже)

Код:

.286p
model small
.stack 48
.data
sseg segment stack 'stack'
db 64 dup(0)
sseg ends
dseg segment
array DB 2,1,7,3,4
n db 5
result db dup(0)
s db dup(0)
dseg ends
cseg segment

.code
mov ds, @data
mov ss, ds
mov cs, ss
rpr proc far
push ds
sub ax,ax
push ax
mov ax,dseg
mov ds,ax
mov si,offset array

m1: lodsb
test al,00000001b
jz m2
add [result],al
adc [result+1],0
cmp array, 5
jne m1
jmp print
m2:
mov al, result[si]
cmp si, 5
jne m1
jmp print

print:
mov dl, 30h
mov cl, ','
sub si,si
j1:
mov al, result[si]
add al,dl
mov s[si],al
inc si
mov s[si],cl
inc si
cmp si,dx
jl j1
mov ah, 09h
mov dx, offset s
int 21h
ret
rpr endp
cseg ends
end rpr

Отправлен: 09.01.2011, 12:34
Вопрос задал: Шнайдер П. А. (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Шнайдер П. А.!
Не надо стыдиться того, что Вы что-то делаете, а у Вас не получается.
Стыдно должно быть ничего не делать... "Да осилит дорогу идущий"
Посмотрите программу, сравните со своей.
Посмотрите также комментарий в мини-форуме Зенченко Константина Николаевича...
Если что непонятно, спрашивайте в мини-форуме. С удовольствием ответим.

PS Для сортировки применен "метод пузырька".

Код:
;Отсортировать по убыванию элементы массива, имеющие чётный индекс.

.286p
model small
.stack 512 ;стек

n equ 5 ;зададим размер массива константой
.data
array DB 2,1,7,3,4 ;массив
;отсортируем байты с индексами 0,2,4 (т.е. 2,7,4)

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

;отсортируем массив методом пузырька
xor si, si ;индекс элемента в массиве
mov cx, n ;число сортируемых элементов
dec cx ;число сравнений
SortLoop: ;цикл по поиску очередного минимального
test si, 1 ;нечетные пропускаем!
jnz ExternalNext ;на увеличение индекса текущего элемента
lea di, [si+1] ;начинаем со следующего
push cx ;сохраним счетчик
mov al, array[si] ;текущий максимальный по адресу [si]
SearchMinLoop: ;цикл по всем последующим
test di, 1 ;нечетные индексы внутреннего цикла также пропускаем
jnz InternalNext ;на увеличение индекса последующего элемента
;сравниваем текущий со всеми последующими
cmp al, array[di] ;если текущий максимальный >= пос ледующего,
jge InternalNext ; то обходим обмен
;меняем местами элементы
xchg al, array[di] ;al=array[di], array[di]=al=array[si]
mov array[si], al ;array[si]=al=array[di]
;по адресу array[si] и в al новый максимальный
InternalNext:
inc di ;на следующий последующий
loop SearchMinLoop ;по всем последющим элементам
pop cx ;восстановим счетчик сравнений
ExternalNext:
inc si ;на следующий текущий
loop SortLoop ;по всем текущим элементам

;массив отсортирован
lea si, array ;адрес массива
mov cx, n ;число элементов
mov ah, 2 ;функция вывода символа
PrintLoop:
mov dl, [si] ;очередной байт
or dl, '0' ;делаем символ
inc si ;на следущий байт
int 21h ;выводим
loop PrintLoop ;по всем байтам

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

end rpr ;

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

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

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


  • Отвечает Сергей (2-й класс) :
    Здравствуйте, Шнайдер П. А.!

    Ох, давно это было...

    Приложение:

    Ответ отправил: Сергей (2-й класс)
    Ответ отправлен: 09.01.2011, 22:40
    Номер ответа: 265310
    Россия, Мурманск

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


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

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

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

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

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

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

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



    В избранное