leal -0x61(%edx), %eax
cmpl $0x19, %eax
ja ... ;jump if edx is not between 0x61-0x7a
В соответствии с описанием приведенный фрагмент кода проверяет, находится ли edx между 0x61-0x7a. Если нет, прыжок берется. Как я понимаю ja
проверяет флаги ZF и CF, anf прыгает, если они равны нулю. Единственное, что, я думаю, я понимаю, это то, что вторая строка, которая вычисляет edx-0x7a. Если edx < 0x7a, CF установлен в 1, и переход не выполняется.Понимание проверки интервалов сборки
Как проверено, что edx больше 0x61? Не переустанавливает ли вторую линию CF все время?
Давайте забудем вторую строчку. Если edx> 0x61 CF равно нулю, то скачок будет выполнен. Это не соответствует описанию.
Это немного трюк. Главное отметить, что вы эффективно нормализуете нижнюю часть проверки конца диапазона до 0x00 путем вычитания 0x61 из _EDX_. Ключевая часть здесь заключается в том, что _JA_ основан на ** неподписанном ** сравнении. Таким образом, вы сравниваете с верхним концом нормализованного диапазона с 0x19. Если сравнение ** unsigned ** (без знака важно) выше 0x19, чем _EDX_ изначально было вне 0x61 до 0x7a. –
Вы можете спросить, что произойдет, если _EDX_ был изначально ниже 0x61. Вычитание сделает их отрицательными, однако сравнение без знака рассматривает их как очень большие целые числа с самым значительным набором бит. например, если в _EDX_ было 0x60. 0x60-0x61 = -1. -1 = 0xFFFFFFFF. Как беззнаковое число, которое обтекает верхний конец целочисленного диапазона. –