Удвоить буквы в каждом слове строки - Assembler
Формулировка задачи:
Здравствуйте! Нужно удвоить буквы в каждом слове строки. MASM
Ввод строки...
Вывод на экран...
А как удвоить не знаю... Подскажите, пожалуйста...
code segment assume cs:code, ds:data main proc mov ax,data mov ds,ax mov ah,09h mov dx,offset msg int 21h mov ah,3Fh mov bx,0 mov cx,80 mov dx,offset buf int 21h mov actlen,ax mov cx,actlen mov si,0
mov ah,40h mov bx,1 moc cx,actlen mov dx,offset buf int 21h mov ah,01 int 21h mov ax4C00h int 21h main endp code ends data segment msg db 'Вводите $' buf db 80 dup(' ') actlen dw 0 data ends stk segment stack dw 128 dup (?) stk ends end main
Решение задачи: «Удвоить буквы в каждом слове строки»
textual
Листинг программы
ASSUME CS:CSEG,DS:DSEG ; Символы возврата каретки и перевода строки. CRLF EQU 0Dh,0Ah ; Максимальный допустимый размер вводимой строки с учетом символа возврата ; каретки. Размер должен быть в пределах от 1 до 254 (см. описание DOS Fn 0Ah). MAX_STR_SIZE EQU 40 DSEG SEGMENT BYTE ; Сообщения пользователю. title DB CRLF,'Doubling of Letters in Words',CRLF,CRLF,'$' prompt DB 'Please, enter a string and then press Enter to complete:',CRLF,'$' info DB CRLF,'The following is the resulting string:',CRLF,'$' warning DB 'The entered string is empty, there is nothing to print!','$' ; Разделители (список можно изменять по желанию). delimiters LABEL BYTE ; Пробельные символы: табуляция, пробел. DB 09h,20h ; Знаки препинания. DB ',.!?;:"''' ; Скобки. DB '(){}[]<>' ; Математические знаки. DB '+=-' numOfDelimiters=$-delimiters ; Буфер для сохранения строки, введенной пользователем. Буфер имеет формат, ; требуемый для фукции буферизированного ввода строки со стандартного ; устройства ввода (см. описание DOS Fn 0Ah). buf LABEL BYTE ; Максиммально допустимый размер строки с учетом символа возврата каретки. maxSize DB MAX_STR_SIZE ; Длина строки без учета символа возврата каретки. len DB 0 ; Сама строка. itself DB MAX_STR_SIZE DUP (?) DSEG ENDS CSEG SEGMENT START: mov ax,DSEG mov ds,ax ; Выводим приглашение для ввода строки. mov dx,OFFSET prompt mov ah,09h int 21h ; Получаем адрес буфера, в который будем вводить строку. mov di,OFFSET buf ; Вводим строку в буфер. mov dx,di mov dx,OFFSET buf mov ah,0Ah int 21h ; Проверяем, что строка не является пустой. inc di ; Сдвигаемся к адресу байта, где хранится длина. xor bx,bx ; (Тоже самое, что mov bx,0) mov bl,BYTE PTR [di] ; Считываем значение длины строки. test bx,bx ; Длина не равна нулю? (Тоже, самое что cmp bx,0) jz EMPTY_STRING ; Переходим, если длина равна нулю (строка пустая). ; Выводим пояснение. mov dx,OFFSET info mov ah,09h int 21h xor dx,dx OUTPUT_NEXT_CHAR: ; Выводим очередной символ строки в первый раз. inc di ; Сдвигаемся к адресу первого байта строки. mov dl,BYTE PTR [di] ; Считываем первый символ строки. mov ah,02h int 21h ; Проверяем, что очередной символ не является разделителем. mov si,OFFSET delimiters ; Адрес начала массива разделителей. mov cx,numOfDelimiters ; Получаем количество разделителей. CHECK_NEXT_DELIMITER: lodsb ; Загружаем очередной разделителя. cmp al,dl ; Является ли символ строки разделителем? ;test al,dl jz CHAR_IS_DELIMITER ; Если символ строки является разделителем, то ; прерываем проверку. Символ повторно не печатаем. loop CHECK_NEXT_DELIMITER; Иначе, продолжаем проверку. ; Если очередной символ строки не является разделителем, то выводим этот ; символ во второй раз. mov ah,02h int 21h CHAR_IS_DELIMITER: ; Проверяем, отсались ли еще символы в строке. dec bx ; Уменьшаем счетчик символов в строке. jz EXIT ; Если достигли конца строки, выходим из программы. jmp OUTPUT_NEXT_CHAR ; Иначе выводим следующий символ. EMPTY_STRING: ; Выводим предупреждение о пустой строке. mov dx,OFFSET warning mov ah,09h int 21h EXIT: mov ax,4C00h int 21h CSEG ENDS END START
Объяснение кода листинга программы
В этом коде выполняется следующая задача: удваивание букв в каждом слове строки. Список действий:
- Задаются начальные значения переменных:
- CRLF (символы возврата каретки и перевода строки)
- MAX_STR_SIZE (максимальный допустимый размер вводимой строки)
- buf (буфер для сохранения строки, введенной пользователем)
- delimiters (разделители, список можно изменять по желанию)
- numOfDelimiters (длина списка разделителей)
- title (сообщение для пользователя о задаче)
- prompt (сообщение для пользователя с приглашением к вводу строки)
- info (сообщение для пользователя о том, что будет выведено)
- warning (сообщение для пользователя об пустой строке)
- Вводим строку в буфер с помощью функции буферизированного ввода строки со стандартного устройства ввода (0Ah).
- Проверяем, что строка не пустая.
- Выводим пояснение.
- Выводим каждый символ строки в первый раз.
- Проверяем, является ли очередной символ строки разделителем.
- Если символ является разделителем, то прерываем проверку и не печатаем этот символ.
- Если символ не является разделителем, то выводим его во второй раз.
- Проверяем, остались ли еще символы в строке.
- Если достигли конца строки, выходим из программы.
- Если введены символы, то выводим следующий символ.
- Если строка пустая, выводим предупреждение и завершаем программу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д