Мне было интересно, почему вы используете инструкцию and
вместо инструкции sub
при преобразовании символов ASCII нижнего регистра в символы верхнего регистра.
mov dx, 'a'
sub dx, 32
против
mov dx, 'a'
and dx, 11011111b
xor 0100000b
тоже работает.
Спасибо вам за помощь. Ввод устанавливается в нижнем регистре.
Это не одинарные кавычки ASCII (или двойные кавычки или обратные кавычки); NASM не будет собирать этот источник. Используйте mov dx, 'a'
Любой из них приемлем, это просто вопрос предпочтений. Мне нравится использовать 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
, чтобы зацикливаться даже на пробеле (но не на табуляции или новой строке).
На самом деле не имеет значения, если вы уже установили, что ввод в нижнем регистре, поэтому вы знаете, что бит № 5 установлен. Вы можете очистить его, вычитая или маскируя, как вам нравится. Но если ввод уже может быть в верхнем регистре,
and
оставит его без изменений, аsub
испортит.