Удвоить буквы в каждом слове строки - 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

Объяснение кода листинга программы

В этом коде выполняется следующая задача: удваивание букв в каждом слове строки. Список действий:

  1. Задаются начальные значения переменных:
    • CRLF (символы возврата каретки и перевода строки)
    • MAX_STR_SIZE (максимальный допустимый размер вводимой строки)
    • buf (буфер для сохранения строки, введенной пользователем)
    • delimiters (разделители, список можно изменять по желанию)
    • numOfDelimiters (длина списка разделителей)
    • title (сообщение для пользователя о задаче)
    • prompt (сообщение для пользователя с приглашением к вводу строки)
    • info (сообщение для пользователя о том, что будет выведено)
    • warning (сообщение для пользователя об пустой строке)
  2. Вводим строку в буфер с помощью функции буферизированного ввода строки со стандартного устройства ввода (0Ah).
  3. Проверяем, что строка не пустая.
  4. Выводим пояснение.
  5. Выводим каждый символ строки в первый раз.
  6. Проверяем, является ли очередной символ строки разделителем.
  7. Если символ является разделителем, то прерываем проверку и не печатаем этот символ.
  8. Если символ не является разделителем, то выводим его во второй раз.
  9. Проверяем, остались ли еще символы в строке.
  10. Если достигли конца строки, выходим из программы.
  11. Если введены символы, то выводим следующий символ.
  12. Если строка пустая, выводим предупреждение и завершаем программу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.5 из 5
Похожие ответы