Вопрос № 178823: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Имеется предложение из нескольких слов. Переставить все пробелы в начало строки. Дополнительных строк не использовать. Выдать на печать число пробелов и модифици...
Вопрос № 178825: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Имеется строка длиной до 100 символов, в которой несколько раз встречается сочетание "школьник". Сформировать строку, содержащую вмест о указанного соч...
Вопрос № 178826: Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере: Задана строка символов. Составить программу, выясняющую, имеется ли в ней все буквы из слова "begin". Порядок букв не важен. В ассемблере я не о...
Вопрос № 178823:
Здравствуйте уважаемые эксперты! Помогите пожалуйста решить задачу на ассемблере:
Имеется предложение из нескольких слов. Переставить все пробелы в начало строки. Дополнительных строк не использовать. Выдать на печать число пробелов и модифицированную строку.
В ассемблере я не очень, так что прошу с подробными комментариями. Программа Tasm 5.0.
Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Петров Юрий Иванович. Вот Вам программа, решающая задачу. Решаем путем сдвига "непробельных" символов к правому краю с последующим заполнением до начала строки пробелами.
Код:
.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.
Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Петров Юрий Иванович. Вот программа. Выводит исходную строку и результат замены Обратите внимание, что русские буковки в 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, 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
Отвечает Лысков Игорь Витальевич, Модератор :
Здравствуйте, Петров Юрий Иванович. Программа под ДОС Проверяет введенную строку.
Код:
.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 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.