Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Чемпионы рейтинга экспертов в этой рассылке Номер выпуска: | 1354 | Дата выхода: | 08.06.2010, 11:30 | Администратор рассылки: | Лысков Игорь Витальевич, Модератор | Подписчиков / экспертов: | 241 / 61 | Вопросов / ответов: | 3 / 4 | IRC-канал по теме: | #assembler | Вопрос № 178823: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Имеется предложение из нескольких слов. Переставить все пробелы в начало строки. Дополнительных строк не использовать. Выдать на печать число пробелов и модифици... Вопрос № 178825: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Имеется строка длиной до 100 символов, в которой несколько раз встречается сочетание "школьник". Сформировать строку, содержащую вмест о указанного соч... Вопрос № 178826: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Задана строка символов. Составить программу, выясняющую, имеется ли в ней все буквы из слова "begin". Порядок букв не важен. В ассемблере я не о... Вопрос № 178823: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере:
Имеется предложение из нескольких слов. Переставить все пробелы в начало строки. Дополнительных строк не использовать. Выдать на печать число пробелов и модифицированную строку.
В ассемблере я не очень, так что прошу с подробными комментариями. Программа Tasm 5.0. Отправлен: 03.06.2010, 11:23 Вопрос задал: Петров Юрий Иванович, Посетитель Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич, Модератор : Здравствуйте, Петров Юрий Иванович. Вот Вам программа, решающая задачу. Решаем путем сдвига "непробельных" символов к правому краю с последующим заполнением до начала строки пробелами.
Код: .model small .data sAny db 0dh,0ah,'Press any key$' string db ' word1 12345 word2 word3$' sCount db 'Count of spaces = $'
.code .286 .startup ;данное макро настраивает сегмент SS и DS mov ax, @DATA ;надо еще и ES mov es, ax
lea di, string ;исследуемая строка call MoveSpaces ;переносим пробелы в начало ;получим в cx число пробелов lea dx, sCount mov ah, 9 int 21h ;выведем количество пробелов mov ax, cx ;количество call PrintNum ;выведем чис ло
mov al, 0dh ;перевод строки int 29h mov al, 0ah int 29h
lea dx, string ;модифицированная строка mov ah, 9 int 21h
lea dx, sAny ;Press any key mov ah, 9 int 21h
mov ah,0 int 16h ;ждем нажатия на клавишу
mov ax, 4c00h int 21h
MoveSpaces proc ;переносим пробелы в начало or cx, -1 ;посчитаем длину строки mov al, '$' ;ищем признак конца строки repne scasb not cx ;cx = длине строки + 1
lea di, [di-2] ;на позицию последнего символа mov si, di ;будем писать по адресу [si] std ;автодекремент search_loop: mov al, ' ' ;ищем пробел repe scasb jcxz spaces ;cx=0, когда пройдем всю строку mov al, [di+1] ;найденный "непробел" mov [si], al ;сдвигаем на правый край dec si ;на следующий адрес jmp search_loop ;пока не пройдем строку spaces: ;пропишем до начала строки пробелами xor cx, cx ;и посчитаем ;al = ' ' spaces_loop: cmp si, offset string jb finish ;сравниваем, прошли ли начало mov [si], al ;пишем пробел dec si inc cx jmp spaces_loop finish: cld ;вернем автоинкремент ret MoveSpaces endp
PrintNum proc ;выводим число из ax xor cx, cx ;счетчик цифр mov bx, 10 ;будем делить на 10 PrDiv: ;цикл поиска цифр xor dx, dx ;подготавливаемся к делению div bx ;делим dx:ax на 10 push dx ;остаток = очередной цифре inc cx ;считаем test ax, ax ;еще есть? jnz PrDiv PrOut: ;цикл вывода pop ax ;извлекаем из стека цифры в обратном порядке or al, '0' ;0-9 в '0'-'9' int 29h ;выводим loop PrOut ;всего cx цифр ret PrintNum endp
end
----- Удачи! Ответ отправил: Лысков Игорь Витальевич, Модератор Ответ отправлен: 03.06.2010, 21:31 Номер ответа: 261862 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Абонент Skype: igorlyskov Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 261862 на номер 1151 (Россия) | Еще номера » | Вопрос № 178825: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере:
Имеется строка длиной до 100 символов, в которой несколько раз встречается сочетание "школьник". Сформировать строку, содержащую вмест о указанного сочетания строку с сочетанием "студент".
В ассемблере я не очень, так что прошу с подробными комментариями. Программа Tasm 5.0. Отправлен: 03.06.2010, 11:26 Вопрос задал: Петров Юрий Иванович, Посетитель Всего ответов: 1 Страница вопроса » Отвечает Лысков Игорь Витальевич, Модератор : Здравствуйте, Петров Юрий Иванович. Вот программа. Выводит исходную строку и результат замены Обратите внимание, что русские буковки в ANSI кодировке. Поэтому либо перекодируйте в ASCII, либо загрузите прикрепленый файл
Код: .model small .data sAny db 'Press any key$' string1 db '12345 школьник пошел в школу. Там были другие школьники',0 string2 db 100 dup (?) str1 db 'школьник' len_str1 equ $-str1 str2 db 'студент' len_str2 equ $-str2
.code .startup ;данное макро настраивает сегмент SS и DS (посмотрите в листинге - параметр /la) mov ax, @DATA ;надо еще и ES mov es, ax
lea si, string1 call PrintString ;выведем исходную строку
call ChangeStrin g ;заменим школьника на студента
lea si, string2 call PrintString ;выведем результат
lea dx, sAny ;Press any key mov ah, 9 int 21h
mov ah,0 int 16h ;ждем нажатия на клавишу
mov ax, 4c00h int 21h
PrintString proc ;выводим строку lodsb cmp al, 0 ;0 - признак конца je PS_ret int 29h ;выводит символ из al jmp PrintString PS_ret: mov al, 0dh ;в конце - перевод строки int 29h mov al, 0ah int 29h ret PrintString endp
ChangeString proc ;замена школьника на студента lea si, string1 ;исходная строка lea di, string2 ;результат CS_loop: cmp byte ptr [si], 0;конец строки je CS_ret push di ;сравним строки [si] и [di]='школьник' push si lea di, str1 mov cx, len_str1 ;длина repe cmpsb ;сравниваем ds:si es:di pop si pop di jz InsertStudent ;равно - пишем 'студент' movsb ;не равно - просто копируем байт jmp CS_loop ;на следующий байт исходной строки InsertStudent: add si, len_str1 ;обойдем 'школьник' push si ;сохраним адрес lea si, str2 ;копируем 'студент' mov cx, len_str2 ;длина rep movsb pop si ;si - адрес байта за школьником jmp CS_loop CS_ret: ret ChangeString endp
end
Прикрепленный файл: загрузить »
----- Удачи! Ответ отправил: Лысков Игорь Витальевич, Модератор Ответ отправлен: 03.06.2010, 14:16 Номер ответа: 261843 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Абонент Skype: igorlyskov Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 261843 на номер 1151 (Россия) | Еще номера » | Вопрос № 178826: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере:
Задана строка символов. Составить программу, выясняющую, имеется ли в ней все буквы из слова "begin". Порядок букв не важен.
В ассемблере я не очень, так что прошу с подробными комментариями. Программа Tasm 5.0. Отправлен: 03.06.2010, 11:28 Вопрос задал: Петров Юрий Иванович, Посетитель Всего ответов: 2 Страница вопроса » Отвечает Лысков Игорь Витальевич, Модератор : Здравствуйте, Петров Юрий Иванович. Программа под ДОС Проверяет введенную строку.
Код: .model small .data max db 81 ;максимальная длина буфера count db 0 ;реальная длина строки string db 81 dup (?) ;сам буфер
sPrompt db 'Enter string: $' sBegin db 'begin' lenBeg equ $-sBegin ;длина строки sYes db 0dh,0ah,'All letters are found!$' sNo db 0dh,0ah,'Some letters are NOT found!$' sAny db 0dh,0ah,'Press any key$'
.code .startup ;данное макро настраивает сегмент SS и DS (посмотрите в листинге - параметр /la) mov ax, @DATA ;надо еще и ES mov es, ax
lea dx, sPrompt ;подсказка mov ah, 9 int 21h
lea dx, max ;вводим строку mov a h, 0ah int 21h
call Search ;ищем lea dx, sYes ;формируем адрес строки сообщения jz PrintMess ;флаг FZ=1 - найдены все буковки lea dx, sNo PrintMess: mov ah, 9 int 21h
lea dx, sAny ;Press any key mov ah, 9 int 21h
mov ah,0 int 16h ;ждем нажатия на клавишу
mov ax, 4c00h int 21h
Search proc ;поиск xor bx, bx mov bl, count ;длина введенной строки lea si, sBegin ;адрес строки 'begin' mov cx, lenBeg ;длина строки 'begin' Search_loop: lodsb ;очередной байт из строки 'begin' push cx ;сохраним счетчик байт lea di, string ;введенная строка mov cx, bx ;ее длина repne scasb ;ищем байт al в es:[di] pop cx jne Search_not_found;увы, не нашли loop Search_loop ;пока не найдем все xor ax, ax ;ура! нашли все (FZ=1) ret Search_not_found: or ax, 1 ;чтобы FZ=0 ret Search endp
end
----- Удачи! Ответ отправил: Лысков Игорь Витальевич, Модератор Ответ отправлен: 03.06.2010, 13:37 Номер ответа: 261840 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru Абонент Skype: igorlyskov Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 261840 на номер 1151 (Россия) | Еще номера » | Отвечает Alex_S, 8-й класс : вот еще 16-разрядный вариант с использованием цепочечных команд и подпрограммами в стиле "C" при наличии всех необходимых символов выдается звуковой сигнал Приложение: ----- йо-хо-хо! Ответ отправил: Alex_S, 8-й класс Ответ отправлен: 03.06.2010, 14:17 Номер ответа: 261844 Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"? | Отправить SMS #thank 261844 на номер 1151 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий