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

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

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

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

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

textual
Листинг программы
code    segment
        assume cs:code, ds:data, ss:stk
 
Example:mov ax,data         ;настройка сегмента данных
        mov ds, ax          ;на сегмент кода
                            ;подготовка параметров вызова StrUpCase(S)
        push ds             ; сегмент строки результата Res
        mov ax, offset Res
        push ax             ; смещение Res
        push ds             ; сегмент исходной строки S
        mov ax, offset S
        push ax             ; смещение S
        call Change     ; far-вызов StrUpCase
                            ;чтение адреса результата функции StrUpCase из стека
        pop bx              ;bx:=смещение Res
        pop ds              ;ds:=сегмент Res
        mov ch, 0           ; подготовка в cx длины строки Res
        mov cl, [bx]
        jcxz Exit           ; выход, если строка Res пуста
Write:  inc bx              ;продвижение указателя символа
        mov dl, [bx]        ;dl - очередной символ Res
        mov ah, 2           ;вывод символа из dl
        int 21h             ;на экран средствами DOS
        loop Write          ;цикл по длине строки Res
Exit:   mov ax, 4c00h       ;завершение программы
        int 21h             ;через функцию DOS
 
    ;function StrUpCase(S:string).Возвращает строку, в которой все строчные русские и латинские буквы заменены на прописные Для перевода русских букв используются их порядковые номера: уквам "А".."Я", "а".."п", "р..Я" соответствуют десятичные номера 128..159, 160..175, 224..239.
    
Change proc far     ; адреса параметров в стеке:
S1   equ dword ptr [bp+6]; параметр S
Res1 equ dword ptr [bp+10];параметр Res (результат)
        push  bp        ; сохранение bp
        mov   bp,sp     ; настройка bp на вершину стека
        push  ds        ; сохранение ds
        les   di,Res1   ; es:di:=адрес результата
        lds   si,S1     ; ds:si:=адрес исходной строки
        cld             ; очистка флага направления (инкремент)
        lodsb           ; al:=(ds:[si]), si:=si+1 (al - длина S);
        stosb           ; (es:[di]):=al, di:=di+1 (запись длины)
        mov   ch,0      ; подготовка сх в качестве счетчика
        mov   cl,al     ; количества символов строки S
        jcxz  ExitC     ; выход, если S - пустая строка (сх=0)
        mov bx,00h
begin:  push cx;
        lodsb           ; считать в al очередной символ S
        cmp   al,'a'    ; символ меньше 'a'?
        jb part1
        cmp al,'z'
        ja part1
        and al,0dfh     ; перевод строчная в прописную 
        ;sub al,20h     ; другой вариант
        jmp Save
part1:  cmp al, 160     ; A0h?
        jb Save
        cmp al,175      ; AFh?
        ja part2
        sub al, 32      ; 20h?
        jmp Save
part2:  cmp al, 224     ; E0h?
        jb Save
        cmp al, 239     ; EFh?
        ja Save
        sub al, 80      ; 50h?
        jmp Save
Save:   inc bx
        stosb           ; записать очередной символ результата Res
        pop cx
        loop begin      ; повторять, пока есть символы в S (cx>0)
ExitC:  les di,Res1
        mov ax,bx
        stosb
        pop   ds        ; восстановить ds
        pop   bp        ; восстановить bp (sp изменен корректно)
        ret 4           ; выход с удалением параметров Ch1, Ch2 и
                        ; адреса S (Res удалять нельзя!)
Change endp
 
code ends
 
data    segment
S db Len, 'Привет, моЙ друг! Hello my firend!'
Len = $-S-1
Res dw 128 dup(?)
data ends
 
stk    segment  stack
        db      256 dup (?)
ends
 
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
Похожие ответы