Перевод символа в верхний регистр для русского алфавита
function UpCaseRus(ch: Char): Char;
asm
CMP AL,'a'
JB @@exit
CMP AL,'z'
JA @@Rus
SUB AL,'a' - 'A'
RET
@@Rus:
CMP AL,'я'
JA @@Exit
CMP AL,'а'
JB @@yo
SUB AL,'я' - 'Я'
RET
@@yo:
CMP AL,'¸'
JNE @@exit
MOV AL,'¨'
@@exit:
end;
function LoCaseRus( ch : Char ) : Char;
{Перевод символа в нижний регистр для русского алфавита}asm
CMP AL,'A'
JB @@exit
CMP AL,'Z'
JA @@Rus
ADD AL,'a' - 'A'
RET
@@Rus:
CMP AL,'Я'
JA @@Exit
CMP AL,'А'
JB @@yo
ADD AL,'я' - 'Я'
RET
@@yo:
CMP AL,'¨'
JNE @@exit
MOV AL,'¸'
@@exit:
end;
Рецензия и перевод кода:
Код предоставляет две функции, UpCaseRus и LoCaseRus, которые конвертируют одиночный символ в верхний или нижний регистр для русского алфавита. Функции используют ассемблерный язык для выполнения конвертации.
UpCaseRus
Функция принимает символ ch в качестве входного параметра и возвращает его верхнюю форму, если он является нижним регистром в русском алфавите. Если входной символ не является нижним регистром, функция возвращает оригинальный символ без изменений.
Разбивка кода:
CMP AL,'a': Сравниваем ASCII-значение входного символа AL с ASCII-значением 'a'.
JB @@exit: Если входной символ меньше 'a', прыгаем к метке @@exit.
CMP AL,'z': Сравниваем ASCII-значение входного символа AL с ASCII-значением 'z'.
JA @@Rus: Если входной символ больше 'z', прыгаем к метке @@Rus.
SUB AL,'a' - 'A': Вычитаем ASCII-значение 'a' из ASCII-значения 'A'. Это эффективно конвертирует нижний регистр в верхний.
RET: Возвращаем преобразованный символ.
LoCaseRus
Функция принимает символ ch в качестве входного параметра и возвращает его нижнюю форму, если он является верхним регистром в русском алфавите. Если входной символ не является верхним регистром, функция возвращает оригинальный символ без изменений.
Разбивка кода:
CMP AL,'A': Сравниваем ASCII-значение входного символа AL с ASCII-значением 'A'.
JB @@exit: Если входной символ меньше 'A', прыгаем к метке @@exit.
CMP AL,'Z': Сравниваем ASCII-значение входного символа AL с ASCII-значением 'Z'.
JA @@Rus: Если входной символ больше 'Z', прыгаем к метке @@Rus.
ADD AL,'a' - 'A': Добавляем разницу между ASCII-значениями 'a' и 'A' к входному символу. Это эффективно конвертирует верхний регистр в нижний.
RET: Возвращаем преобразованный символ.
Альтернативное решение
Вместо использования ассемблерного языка можно использовать встроенные функции Pascal для конвертации символов в верхний или нижний регистр. Вот альтернативная реализация:
Эта реализация более легко читаемая и поддерживаемая, но может быть менее эффективной, чем оригинальный код на ассемблере.
Статья описывает функции UpCaseRus и LoCaseRus на языке Паскаль, реализующие перевод символов русского алфавита в верхний и нижний регистр соответственно.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.