И против SUB при преобразовании строчных букв в прописные в ассемблере

Мне было интересно, почему вы используете инструкцию and вместо инструкции sub при преобразовании символов ASCII нижнего регистра в символы верхнего регистра.

mov dx, 'a'
sub dx, 32

против

mov dx, 'a'
and dx, 11011111b

На самом деле не имеет значения, если вы уже установили, что ввод в нижнем регистре, поэтому вы знаете, что бит № 5 установлен. Вы можете очистить его, вычитая или маскируя, как вам нравится. Но если ввод уже может быть в верхнем регистре, and оставит его без изменений, а sub испортит.

Jester 12.01.2023 17:05
xor 0100000b тоже работает.
Erik Eidt 12.01.2023 17:06

Спасибо вам за помощь. Ввод устанавливается в нижнем регистре.

Markian 12.01.2023 17:07

Это не одинарные кавычки ASCII (или двойные кавычки или обратные кавычки); NASM не будет собирать этот источник. Используйте mov dx, 'a'

Peter Cordes 13.01.2023 03:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Любой из них приемлем, это просто вопрос предпочтений. Мне нравится использовать and себя. Не имеет значения, если вы сначала проверили, находится ли ваш персонаж между 'a' и 'z'.

Нет никакой разницы в производительности или правильности, если вы уже знаете, что ввод является буквенным символом нижнего регистра. and имеет преимущество, когда вы знаете, что это алфавит, но он может быть уже в верхнем регистре, поскольку он оставляет заглавные буквы без изменений. (Или как часть определения алфавита и нормализации к одному регистру, либо с and с ~0x20, либо с or с 0x20, как в В чем идея ^= 32, которая преобразует строчные буквы в прописные и наоборот?)


Если следующая инструкция jcc похожа на jnz, sub и and в равной степени способны макросплавиться с ней в один uop на процессорах семейства Intel Sandybridge, так что здесь нет преимущества.

Если вы используете его в цикле по строке C с нулевым завершением, вы можете сделать что-то вроде movzx edx, byte [rdi] / and edx, ~0x20 / jnz .loop в конце цикла, поскольку все буквенные символы имеют ненулевые биты, кроме бита нижнего регистра. (0x20 — пробел ASCII ).

Использование sub в этом случае позволяет выйти из цикла на любом символе меньше пробела, то есть на управляющих символах, табуляциях или новой строке. sub edx, 0x20 / ja .loop или jae .loop, чтобы зацикливаться даже на пробеле (но не на табуляции или новой строке).

Другие вопросы по теме