Привет, в настоящее время я делаю проект на языке asm, и я придумал этот код:
mov ah, 07h
int 21h
mov bl,al
cmp bl, 'w'
je up
cmp bl, 'W'
je up
Код заключается в том, чтобы ввести букву и перейти к другой функции. То, что я хочу сделать, это сравнить его, даже если он в верхнем или нижнем регистре. Есть ли способ сделать это?
да, но я также хочу уменьшить количество строк кода. Есть ли способ сравнить с «w» или «W», что-то вроде этого cmp bl, «w» или «W]»
8086 не имеет OPCODE для выполнения 2 сравнений за один цикл. Ваш код не может быть сокращен больше.
@paladin: Как помогает 'W' + 32? В отличие от 'W' | 32, это не идемпотент, поэтому он не сводит оба входа к одному значению для проверки. (Как в ответе сентября). Или, я думаю, вы не пытались предложить оптимизацию, просто сказали, что это возможно нет. (Что в целом верно для двух произвольных значений, и оптимизация здесь требует дополнительной инструкции перед cmp)





Поскольку прописные буквы [A,Z] (коды ASCII [65,90]) отличаются от строчных букв [a,z] (коды ASCII [97,122]) на 32, а также из-за того, как организована таблица ASCII, все для строчных букв установлен бит5, в то время как ни для одной из прописных букв не установлен бит5.
Перед сравнением вы можете or код символа с 32, и тогда вам понадобится всего одно сравнение.
mov ah, 07h
int 21h
mov bl, al
or al, 32 ; Make case-insensitive
cmp al, 'w' ; Only comparing lowercase, but accepting both cases
je up
Что делает эта or al, 32 инструкция:
Также, что не менее важно, никакой небуквенный код ASCII также не может стать w; 'W' и 'w' — это входы Только, такие что c | 0x20 == 'w'. Установка или очистка бита нижнего регистра не превращает небуквы в буквы или наоборот, так что в целом это полезный прием для таких вещей, как проверка того, является ли символ буквой алфавита. (у В чем идея ^= 32, которая преобразует строчные буквы в прописные и наоборот? есть более подробная информация)
'w'и'W'— это просто числа.'w'=='W' + 32, посмотрите таблицу ASCII для получения дополнительной информации.