Перевод русских строчных букв в прописные (UpCase) - Assembler

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

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

Составить внешнюю подпрограмму и оформить его в отдельном модуле. Для проведения отладки программы необходимо также составить две основные программы: на языке ассемблера и на паскале, вызывающие составленную подпрограмму как внешнюю. Тип вызова выбирается самостоятельно. funcrtion StrUpCase(S:string):string. Возвращает строку в которой все строчные русские и латинские буквы заменены на прописные. Для перевода русских букв использовать их порядковые номера

Решение задачи: «Перевод русских строчных букв в прописные (UpCase)»

textual
Листинг программы
  1. code    segment
  2.         assume cs:code, ds:data, ss:stk
  3.  
  4. Example:mov ax,data         ;настройка сегмента данных
  5.         mov ds, ax          ;на сегмент кода
  6.                             ;подготовка параметров вызова StrUpCase(S)
  7.         push ds             ; сегмент строки результата Res
  8.         mov ax, offset Res
  9.         push ax             ; смещение Res
  10.         push ds             ; сегмент исходной строки S
  11.         mov ax, offset S
  12.         push ax             ; смещение S
  13.         call Change     ; far-вызов StrUpCase
  14.                             ;чтение адреса результата функции StrUpCase из стека
  15.         pop bx              ;bx:=смещение Res
  16.         pop ds              ;ds:=сегмент Res
  17.         mov ch, 0           ; подготовка в cx длины строки Res
  18.         mov cl, [bx]
  19.         jcxz Exit           ; выход, если строка Res пуста
  20. Write:  inc bx              ;продвижение указателя символа
  21.         mov dl, [bx]        ;dl - очередной символ Res
  22.         mov ah, 2           ;вывод символа из dl
  23.         int 21h             ;на экран средствами DOS
  24.         loop Write          ;цикл по длине строки Res
  25. Exit:   mov ax, 4c00h       ;завершение программы
  26.         int 21h             ;через функцию DOS
  27.  
  28.     ;function StrUpCase(S:string).Возвращает строку, в которой все строчные русские и латинские буквы заменены на прописные Для перевода русских букв используются их порядковые номера: уквам "А".."Я", "а".."п", "р..Я" соответствуют десятичные номера 128..159, 160..175, 224..239.
  29.    
  30. Change proc far     ; адреса параметров в стеке:
  31. S1   equ dword ptr [bp+6]; параметр S
  32. Res1 equ dword ptr [bp+10];параметр Res (результат)
  33.         push  bp        ; сохранение bp
  34.         mov   bp,sp     ; настройка bp на вершину стека
  35.         push  ds        ; сохранение ds
  36.         les   di,Res1   ; es:di:=адрес результата
  37.         lds   si,S1     ; ds:si:=адрес исходной строки
  38.         cld             ; очистка флага направления (инкремент)
  39.         lodsb           ; al:=(ds:[si]), si:=si+1 (al - длина S);
  40.         stosb           ; (es:[di]):=al, di:=di+1 (запись длины)
  41.         mov   ch,0      ; подготовка сх в качестве счетчика
  42.         mov   cl,al     ; количества символов строки S
  43.         jcxz  ExitC     ; выход, если S - пустая строка (сх=0)
  44.         mov bx,00h
  45. begin:  push cx;
  46.         lodsb           ; считать в al очередной символ S
  47.         cmp   al,'a'    ; символ меньше 'a'?
  48.         jb part1
  49.         cmp al,'z'
  50.         ja part1
  51.         and al,0dfh     ; перевод строчная в прописную
  52.         ;sub al,20h     ; другой вариант
  53.         jmp Save
  54. part1:  cmp al, 160     ; A0h?
  55.         jb Save
  56.         cmp al,175      ; AFh?
  57.         ja part2
  58.         sub al, 32      ; 20h?
  59.         jmp Save
  60. part2:  cmp al, 224     ; E0h?
  61.         jb Save
  62.         cmp al, 239     ; EFh?
  63.         ja Save
  64.         sub al, 80      ; 50h?
  65.         jmp Save
  66. Save:   inc bx
  67.         stosb           ; записать очередной символ результата Res
  68.         pop cx
  69.         loop begin      ; повторять, пока есть символы в S (cx>0)
  70. ExitC:  les di,Res1
  71.         mov ax,bx
  72.         stosb
  73.         pop   ds        ; восстановить ds
  74.         pop   bp        ; восстановить bp (sp изменен корректно)
  75.         ret 4           ; выход с удалением параметров Ch1, Ch2 и
  76.                         ; адреса S (Res удалять нельзя!)
  77. Change endp
  78.  
  79. code ends
  80.  
  81. data    segment
  82. S db Len, 'Привет, моЙ друг! Hello my firend!'
  83. Len = $-S-1
  84. Res dw 128 dup(?)
  85. data ends
  86.  
  87. stk    segment  stack
  88.         db      256 dup (?)
  89. ends
  90.  
  91. end Example

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

Пример кода на языке Assembler. Перевод строчных букв в прописные (UpCase). Список действий:

  1. Перевод русских букв в их порядковые номера: уквам А..Я, а..п, р..Я соответствуют десятичные номера 128..159, 160..175, 224..239.
  2. Настройка сегментов данных и кода:
    • сегмент данных (ds): обычно равен seg-регистру, в котором находится сегмент кода (cs), или равен 0, если сегмент кода не определен.
    • сегмент кода (cs): обычно равен seg-регистру, в котором находится сегмент данных (ds), или равен 0, если сегмент данных не определен.
  3. Подготовка параметров вызова функции StrUpCase:
    • сегмент строки результата Res: сохраняется в стеке.
    • смещение Res: сохраняется в стеке.
    • сегмент исходной строки S: сохраняется в стеке.
    • смещение S: сохраняется в стеке.
  4. Вызов функции StrUpCase: функция изменяет регистры прописных букв в строке, используя их порядковые номера.
  5. Чтение адреса результата функции StrUpCase из стека:
    • выход, если строка Res пуста: проверяется, не пуста ли строка Res. Если строка пуста, выполняется выход.
  6. Вывод символов строки Res на экран:
    • продвижение указателя символа: указатель символа продвигается на следующий символ.
    • вывод очередного символа из dl: очередной символ из dl выводится на экран.
    • цикл по длине строки Res: повторяется, пока есть символы в строке Res (cx больше нуля).
  7. Восстановление сегментов данных и кода: восстанавливаются исходные значения сегментов данных (ds) и кода (cs).
  8. Выход из программы: выполняется выход из программы.

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


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

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

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

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

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

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