Поменять регистр в буквах вводимой строки - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите, пожалуйста, с программой. Нужно использовать упрощенный директивы сегментации, написать и забить в com-файл прогу, меняющую регистр в буквах вводимой строки. В принципе, все написано, но есть ошибки: 1) количество символов (2-й элемент в введенной через 0Ah DOS функцию строке) не записывается в регистр CX. 2)какая-то ошибка в конце программы со start. 3)проблемы c изменением сегмента данных: @data не определяется. Не судите строго, до этого только с Debug'ом дело имел. Компилировал в MASM'е.
Листинг программы
  1. .model small
  2. .data
  3. string db 20,?,20 dup ('$')
  4. .code
  5. org 100h
  6. start:
  7. mov ax, @data
  8. mov ds, ax
  9. lea dx, string % ввод строки
  10. mov ah, 0Ah
  11. int 21h
  12. mov cx, [string + 1] % запись реальной длины строки в счетчик CX
  13. lea bx, string + 2 % запись адреса первого элемента введенной строки в счетчик BX
  14. call symbol_process % проход по строке
  15. mov ah, 4Ch %
  16. int 21h
  17. symbol_process:
  18. mov dl,byte ptr [BX] % посимвольное считывание строки в регистр
  19. cmp dl,7bh % сравнение кода символа с диапазонами прописных букв, строчных букв и остальных символов в ASCII-таблице
  20. jge output
  21. call stroch1
  22. cmp dl, 5bh
  23. jge output
  24. call zaglav1
  25. cmp dl,41h
  26. jl output
  27. ret
  28. stroch1:
  29. cmp dl,61h
  30. jge stroch2
  31. ret
  32. stroch2:
  33. sub dx,20h % делает букву прописной
  34. call output
  35. ret
  36. zaglav1:
  37. cmp dl,41h
  38. jge zaglav2
  39. ret
  40. zaglav2:
  41. add dx,20h % делает букву строчной
  42. call output
  43. ret
  44. output: % вывод символа и переход к следующему символу
  45. mov ah, 2h
  46. int 21h
  47. inc bx
  48. loop symbol_process
  49. ret
  50.  
  51. end start

Решение задачи: «Поменять регистр в буквах вводимой строки»

textual
Листинг программы
  1. ;fasm code
  2. ;-----------------
  3. org  100h
  4. jmp  start
  5.  
  6. mess0   db  13,10,'String: $'
  7. mess1   db  13,10,'Result: '
  8. buff    db  80 dup('$')        ; буфер для строки
  9.  
  10. start:  mov   ah,9             ; запрос на ввод
  11.         mov   dx,mess0
  12.         int   21h
  13.  
  14.         mov   di,buff          ; приёмник для строки
  15.         mov   ah,1             ; ввод с эхом
  16. input:  int   21h
  17.         cmp   al,13            ; Enter - закончить ввод
  18.         je    stop
  19.  
  20.         mov   bl,al            ; символ в BL
  21.         sub   bl,41h           ;
  22.         cmp   bl,7Fh           ; фильтр только символов
  23.         ja    next             ; если цифры или знаки
  24.         xor   al,20h           ; инверсия регистра символа!
  25. next:   stosb                  ; записать символ в буфер
  26.         jmp   input            ; на повтор..
  27.  
  28. stop:   mov   ah,9             ; выводим результат на экран
  29.         mov   dx,mess1
  30.         int   21h
  31.  
  32.         xor   ax,ax            ; выход в DOS
  33.         int   16h
  34.         int   20h

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

На языке Assembler был написан код, который выполняет следующие действия:

  1. Запрос на ввод строки - пользователь вводит строку в буфер buff.
  2. Проверка на завершение ввода - если пользователь нажимает Enter, код переходит к этапу stop.
  3. Фильтрация символов - из буфера buff удаляются все символы, кроме цифр и знаков.
  4. Инверсия регистра символа - каждый символ в буфере buff инвертируется.
  5. Вывод результата на экран - на экран выводится результат в формате Result: с инвертированными символами.
  6. Выход в DOS - программа завершается.

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


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

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

14   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы