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

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


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

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

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

Коцюрбенко Алексей aka Жерар
Статус: Профессор
Рейтинг: 2733
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2636
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2115
∙ повысить рейтинг »

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

Номер выпуска:1476
Дата выхода:26.09.2011, 08:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:200 / 62
Вопросов / ответов:1 / 1

Консультация # 184063: Здравствуйте! Прошу помощи в следующем вопросе: Требуется написать программку на TASM для Win Xp для процессора Intel Core 2 Solo U3500, которая редактирует заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с чет-ными номерами. (Пример: How do you do -> od od) Огромное спасибо!...


Консультация # 184063:

Здравствуйте! Прошу помощи в следующем вопросе:
Требуется написать программку на TASM для Win Xp для процессора Intel Core 2 Solo U3500, которая
редактирует заданное предложение, удаляя из него все слова с нечетными номерами и переворачивая слова с чет-ными номерами.
(Пример: How do you do -> od od)

Огромное спасибо!

Дата отправки: 20.09.2011, 21:37
Вопрос задал: Юдин Евгений Сергеевич (8-й класс)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Юдин Евгений Сергеевич!
Хочу предложить такой вариант решения задачи:
1) Для хранения символов четного переворачиваемого слова используется стек.
2) Учитываются разные разделители и разное их количество. Все разделители заменяются одним пробелом.

Код :
;Программа редактирует заданное предложение, 
;удаляя из него все слова с нечетными номерами 
;и переворачивая слова с четными номерами. 
;(Пример: How do you do -> od od)
;tasm str.asm
;tlink str /t
;--------------
 .model tiny
 .data

prompt db 'Enter string: $'
result db 0ah,'Result:       $'
anykey db 0dh,0ah,'Press any key$'

Separators db 9,' ,.:;' ;Строка разделителей
SeparatorsCount equ $-Separators ;длина строки разделителей

buffer label byte  ;буфер для ф-и 0ah
max db 128  ;максим размер
len db 0  ;реальная длина
string db 128 dup (?) ;сам буфер

 .code
 .startup
 lea dx, prompt ;подсказка для ввода строки
 mov ah, 9
 int 21h

 lea dx, buffer
 mov ah, 0ah  ;вводим строку
 int 21h

 lea si, string ;адрес введенной строки
 call Make  ;обрабатываем

print:    ;выводим результат
 lea dx, result ;Result:
 mov ah, 9
 int 21h

 lea dx, string ;обработанная строка
 int 21h  ;ah = 9

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

 mov ah, 0  ;Ждем any key
 int 16h

 mov ax, 4c00h
 int 21h

Make proc   ;обработка строки
 mov di, si  ;результат будет на том же месте
 xor cx, cx  ;счетчик букв переворачиваемых слов
sep1:    ;цикл пропуска предворяющих разделителей
 lodsb   ;очередной символ
 cmp al, 0dh  ;конец строки?
 je finish
 call CmpSeparator ;разделитель?
 je sep1  ;да - ищем не разделитель
skip:    ;цикл пропуска нечетных слов
 lodsb   ;очередной символ
 cmp al, 0dh  ;конец строки?
 je finish
 call CmpSeparator ;разделитель?
 jne skip  ;нет - ищем разделитель, конец слова
sep2:    ;цикл пропуска разделителей между нечетным и четным словом
 lodsb   ;очередной символ
 cmp al, 0dh  ;конец строки?
 je finish
 call CmpSeparator ;разделитель?
 je sep2  ;да - ищем не разделитель
reversal:   ;цикл сохранения в стеке символов четного слова
 push ax  ;сохраним в стеке символ в al
 inc cx  ;считаем
 lodsb   ;очередной символ
 cmp al, 0dh  ;конец строки?
 je reversal_finish ;подправим индекс для последнего четного слова
 call CmpSeparator ;разделитель?
 jne reversal ;нет - сохраняем символ
reversal_save:   ;цикл вывода четного слова в обратном порядке
 pop ax  ;извлекаем из стека
 stosb   ;сохраняем
 loop reversal_save ;по всем символам слова
 mov al, ' '  ;отделяем одним пробелом
 stosb
 jmp sep1  ;на пропуск разделителей перед нечетным словом
reversal_finish:  ;для четного слова подправим указатель,
 dec si  ;чтобы потом опять прочитать 0dh и уйти на finish
 jmp reversal_save ;на вывод слова
finish:    ;закрываем строку знаком '$' 
 cmp di, offset string ;но сначала уберем последний пробел
 je set_dollar ;при этом для пустой строки обходим!
 dec di  ;перед последним пробелом
set_dollar:
 mov byte ptr [di], '$' ;для ф-и 9 прерывания 21h
 ret
Make endp

CmpSeparator proc  ;проверка на разделители
 push di  ;сохраним используемые регистры
 push cx
 lea di, Separators ;строка разделителей
 mov cx, SeparatorsCount ;длина
 repne scasb  ;ищем, результата во флаге FZ
 pop cx
 pop di
 ret
CmpSeparator endp

 end

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 23.09.2011, 01:23
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное