![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 05.12.2019
Сообщений: 2
|
![]()
По пути обучения встретился с данным заданием, не могу придумать принцип решения, может у кого возникнут идеи? Я дошел только до принципа полного реверса строки и последующего реверса каждого слова, но организовать его пока не получилось
Задание: Ввести с клавиатуры строку, содержащую несколько слов, разделенных пробелом. Переставить в ней слова, поменяв местами первое слово с последним, второе с предпоследним и т.д. Вывести результаты на экран. Встречал решения подобных задачек, но так и не смог в них разобраться, так как еще не сильно шарю. Из уточнений: Должен быть организован ввод(и вывод) через прерывание, именно в командной строке, а не в самом коде, сам код желательно должен быть как можно проще, либо же помогите в последствии мне разобраться во всем. |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
так помогают тому, кто сам хоть что-то сделал..
наработки и мысли имеются какие-нибудь?
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#3 | |
Новичок
Джуниор
Регистрация: 05.12.2019
Сообщений: 2
|
![]() Цитата:
.model small .stack 200h .data DelimChar equ ' ' ;символ, разделитель слов _STDOUT_ equ 1 ;описатель вывода на экран ;обрабатываемая строка String db 'loll goog bbooob suup mooling some paper to garbage' Len dw $-String ;сообщения программы CrLf db 0Dh, 0Ah, '$' msgSourceString db 'Instant:', 0Dh, 0Ah, '$' msgResultString db 'Result:', 0Dh, 0Ah, '$' .code Reverse proc push si push di jmp @@next @@while: mov al, [si] mov ah, [di] mov [di], al mov [si], ah inc si dec di @@next: cmp si, di jb @@while pop di pop si ret Reverse endp Show proc push ax push bx push cx push dx push si push di mov ah, 40h mov bx, _STDOUT_ mov cx, [Len] lea dx, [String] int 21h mov ah, 09h lea dx, CrLf int 21h pop di pop si pop dx pop cx pop bx pop ax ret Show endp main proc mov ax, @data mov ds, ax ;вывод исходных данных mov ah, 09h lea dx, [msgSourceString] int 21h mov ah, 40h mov bx, _STDOUT_ mov cx, [Len] lea dx, [String] int 21h mov ah, 09h lea dx, CrLf int 21h ;обработка строки lea si, String mov cx, Len cld ;реверс всей строки mov di, si add di, cx dec di call Reverse @@Loop: ;пропускаем все разделители @@WhileDelimiter: lodsb cmp al, DelimChar loope @@WhileDelimiter jcxz @@Finish ;если строка закончилась - выйти ;найдено новое слово mov di, si ;(di-1) указатель на начало слова ;пропускаем все буквы слова до разделителя @@WhileWord: lodsb cmp al, DelimChar loopne @@WhileWordт cmp cx, 1 ;учтём возможный выход из цикла по завершению строки adc si, 0 ;когда на первый символ слова будет указывать (esi+1) ;теперь слово выделено ;(di-1) - начало слова ;(si-2) - конец слова sub si, 2 dec di xchg si, di call Reverse xchg si, di add si, 2 test cx, cx jnz @@Loop @@Finish: ;вывод результатов mov ah, 09h lea dx, [msgResultString] int 21h mov ah, 40h mov bx, _STDOUT_ mov cx, [Len] lea dx, [String] int 21h mov ah, 09h lea dx, [CrLf] int 21h ;завершение программы mov ax, 4C00h main endp Это мой код, но не работает корректно data segment IN_STR db 80,?,82 dup(?) OUT_STR db 80,?,82 dup(?) data ends code segment assume cs: code, ds: data start: lea dx,IN_STR mov ah,0ah int 21h xor ah,ah mov dl,IN_STR+1 lea bx,IN_STR+2 add bl,dl dec bx lea si,OUT_STR+2 mov dl,0 mov cx,0 mov di," " push di H: cmp dl,IN_STR+1 je P jge ex mov al,[bx] cmp al," " jne M P: pop cx mov [Si],cl inc si cmp cx," " je M loop p M: push ax inc dl dec bx loop H ex: lea dx,OUT_STR mov ah,09h int 21h lea dx,IN_STR mov ah,0ah int 21h quit: mov ax, 4c00h int 21 code ends end start |
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
вариантов тут много, и вот один из них..
Вводишь строку и смещаешься в её конец. Теперь справа-налево ищем пробел, по-ходу считая длину слова. Как найдёшь пробел, ставишь флаг Direction (DF) в прямое направление, и копируешь слово в выходной буфер. Потом опять DF в единицу (обратный шаг), и так по всей строке. Вариант на FASM'e примерно такой (блох не вылавливал, но вроде работает): Код:
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
Если ввод в ком.строке, тогда запускаешь прогу с параметром в виде строки. Введённую строку потом найдёшь по смещению 0х80 в PSP (от начала выделенного тебе сегмента).
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
#6 |
Участник клуба
Регистрация: 16.06.2011
Сообщений: 1,428
|
![]()
вот так выглядит запуск программы с аргументом "Hello World! 123456" в ком.строке. Соответственно SI настраиваешь на 0х80, а дальше всё так-же (первый байт 0х12 - это длина аргумента):
Нашедшего выход - затаптывают первым..
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Определите меня с выбором пути обучения | Raxxxy | Помощь студентам | 8 | 17.01.2012 18:54 |
Не могу найти книгу Стивена Праты "Язык программирования C. Лекции и упражнения". Может есть у кого? | Catharsis | Общие вопросы C/C++ | 0 | 10.06.2010 12:46 |
У кого есть идеи по созданию мордоленты? | slips | JavaScript, Ajax | 1 | 29.10.2009 20:21 |
Как решать японские кроссворды или судоку? Может у кого-нибудь есть идеи? | TwiX | Свободное общение | 2 | 16.08.2009 07:56 |