Перевод русских строчных букв в прописные (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). Список действий:
- Перевод русских букв в их порядковые номера: уквам
А
..Я
,а
..п
,р..Я
соответствуют десятичные номера 128..159, 160..175, 224..239. - Настройка сегментов данных и кода:
- сегмент данных (ds): обычно равен seg-регистру, в котором находится сегмент кода (cs), или равен 0, если сегмент кода не определен.
- сегмент кода (cs): обычно равен seg-регистру, в котором находится сегмент данных (ds), или равен 0, если сегмент данных не определен.
- Подготовка параметров вызова функции StrUpCase:
- сегмент строки результата Res: сохраняется в стеке.
- смещение Res: сохраняется в стеке.
- сегмент исходной строки S: сохраняется в стеке.
- смещение S: сохраняется в стеке.
- Вызов функции StrUpCase: функция изменяет регистры прописных букв в строке, используя их порядковые номера.
- Чтение адреса результата функции StrUpCase из стека:
- выход, если строка Res пуста: проверяется, не пуста ли строка Res. Если строка пуста, выполняется выход.
- Вывод символов строки Res на экран:
- продвижение указателя символа: указатель символа продвигается на следующий символ.
- вывод очередного символа из dl: очередной символ из dl выводится на экран.
- цикл по длине строки Res: повторяется, пока есть символы в строке Res (cx больше нуля).
- Восстановление сегментов данных и кода: восстанавливаются исходные значения сегментов данных (ds) и кода (cs).
- Выход из программы: выполняется выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д