Добавить пробелы в строке - Assembler
Формулировка задачи:
Дана строка, слова разделены пробелами, необходимо добавить между словами еще по одному пробелу.
Преподаватель просит использование строковых команд, и обязательно REPNE!
Сделала сама, но команду REPNE не использую, не получается(
В ассемблере совсем новичок!
Пожалуйста, помогите исправить!
Заранее спасибо!
org 100h .MODEL tiny start: mov ah,09h lea dx,Input_str int 21h call Enter input: call ReadChar mov [Str_in+si],al cmp al,13 je continue_input inc si loop input continue_input: mov [Str_in+si],'$' call Enter mov ah,09h lea dx,Res int 21h call Enter ; основная программа CLD LEA si,str_in LEA di,str_out LODSB READ1: STOSB MOV bl, ' ' LODSB CMP al,last JE DONE1 CMP al,space JNE READ1 MOV al,bl STOSB MOV al,space JMP READ1 DONE1: MOV al,bl STOSB MOV al,space STOSB PRINT: MOV AL, '$' STOSB MOV DX, OFFSET STR_OUT MOV AH, 09H INT 21H MOV AH, 4CH INT 21H ;----------------------------------------------------- ReadInteger proc push cx push bx push dx mov fl,0 xor cx, cx mov bx, 10 call ReadChar cmp al,'-' je minus jmp nn minus: mov fl,1 read: call ReadChar nn: cmp al, 13 je done sub al, '0' xor ah, ah xor dx, dx xchg cx, ax mul bx add ax, cx xchg ax, cx jmp read done: xchg ax, cx cmp fl,1 je eee jmp ee eee: neg ax ee: pop dx pop bx pop cx ret ReadInteger endp ; ввод одного символа ReadChar proc mov ah,1 int 21h ret ReadChar endp ; перевод строки Enter proc mov ah,09h lea dx,crlf int 21h ret Enter endp Str_in db 128 dup (?) ; начальная строка STR_OUT DB 100 DUP(?) ; строка-результат fl dw ? LAST DB '$' ;конец строки SPACE DB ' ' ;пробел Input_str db 'Введите строку: ','$' crlf db 0dh,0ah,'$' Res db 'Результат: ','$' end start
Решение задачи: «Добавить пробелы в строке»
textual
Листинг программы
mov edi,str_in mov esi,str_out mov ebx,edi;запомнили edi mov ecx,-1;почти "бесконечный" цикл поиска символа '$' в введённой строке mov al,'$' cld repne scasb;увеличивается edi пока не встретится символ '$' mov ecx,edi sub ecx,ebx;сосчитали сколько символов в введённой строке mov edi,ebx mov al,' ' mRepeat:;ищем пробелы... mov ebx,edi cld repne scasb;увеличивается edi пока не встретится символ ' ' mov edx,0 jnz mFinish;этот переход будет осуществлён когда пробел уже не найден, а в ecx уже 0 mov edx,1;если найден пробел, то в edx будет 1 mFinish: push ecx mov ecx,edi sub ecx,ebx mov edi,ebx xchg esi,edi cld repe movsb;копируем из source в target cmp edx,0 je mFinish2 stosb;добавляем пробел mFinish2: xchg esi,edi pop ecx cmp edx,0 jne mRepeat;тут я немножко укоротил :)
Объяснение кода листинга программы
- Входные данные:
- str_in: строка, в которой нужно добавить пробелы
- str_out: строка, в которую будут добавлены пробелы
- Выполняемые действия:
- Переменная edi содержит адрес первого символа строки str_in
- Переменная esi содержит адрес первого символа строки str_out
- Переменная ebx используется для хранения значения edi
- Переменная ecx используется для цикла поиска символа '$' в строке str_in
- Переменная al содержит символ '$'
- Используется команда repne scasb для поиска символа '$' в строке str_in. Увеличивается значение edi до тех пор, пока не будет найден символ '$'
- Переменная ecx вычисляется как разница между edi и ebx, что дает количество символов в строке str_in
- Переменная edi устанавливается равной ebx, что означает, что поиск пробелов начинается с начала строки str_in
- Переменная al устанавливается равной символу ' ', что означает, что мы ищем пробелы
- Используется цикл repne scasb для поиска пробелов в строке str_in. Увеличивается значение edi до тех пор, пока не будет найден пробел
- Если пробел найден, то в переменной edx устанавливается значение 1
- Если пробел не найден, то в переменной edx устанавливается значение 0
- Если в переменной edx установлено значение 0, то мы достигли конца строки str_in и завершаем выполнение программы
- Если в переменной edx установлено значение 1, то мы нашли пробел и переходим к следующему шагу
- Используется команда xchg esi,edi для обмена значений esi и edi
- Используется команда cld для установки флага направления строки в 1, что означает, что мы будем копировать символы из str_in в str_out слева направо
- Используется команда repe movsb для копирования символов из str_in в str_out
- Если в переменной edx установлено значение 0, то мы достигли конца строки str_in и завершаем выполнение программы
- Если в переменной edx установлено значение 1, то мы нашли пробел и добавляем его в строку str_out с помощью команды stosb
- Используется команда xchg esi,edi для обмена значений esi и edi
- Используется команда pop ecx для удаления значения из стека
- Если в переменной edx установлено значение 0, то мы достигли конца строки str_in и завершаем выполнение программы
- Если в переменной edx установлено значение 1, то мы нашли пробел и переходим к следующему шагу
- Если значение в переменной edx не равно 0, то мы продолжаем поиск пробелов с начала строки str_in
- Выходные данные:
- Строка str_out с добавленными пробелами
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д