Перевод русских строчных букв в прописные (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).
- Выход из программы: выполняется выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д