Маленькие процессоры endian (как и большинство современных настольных) упорядочивают значения в памяти назад. Например, если значение в 0xDEADBEEF является 42
, иначе 0x0000002A
, то он будет сохранен как
2A 00 00 00
Вы можете заставить, сколько байтов команда cmp [rax], rdi;
сравнивает, предваряя байт/слово/двойное. Например, в NASM
cmp BYTE [rax], rdi;
бы сравнить только первый байт, на который указывает указатель rax
.
Проверьте документацию ассемблера на точный синтаксис. Также проверьте, сколько байтов ваш ассемблер сравнивается с командой cmp
по умолчанию.
Edit: Игнорирование все, что я написал выше.
С вашего вопроса отмечен x86-64
Я предполагаю, что ваша программа 64 бит.
rdi
имеет длину 8 байт. Ваш код делает все правильно, если значение в 0xDEADBEEF
составляет 8 байт, а также:
2A 00 00 00 00 00 00 00
В противном случае, если только первые 4 или 2 или байты установлены для коррекции значения, ваша программа может или не может работать правильно. Например, если значение в 0xDEADBEEF
длиной 4 байта, то она будет выглядеть следующим образом
2A 00 00 00 ?? ?? ?? ??
Остальная часть memooryy будет содержать какой-либо другой случайной информации. Ваша программа будет иметь худший вид ошибки - тот, который происходит случайным образом. Инструкция cmp по-прежнему будет сравнивать 8 байтов, так как rdi
имеет длину 8 байтов.
И ответить на ваш комментарий к вопросу наводчика (так как я не имею привилегии комментировать):
mov rax, [0xDEADBEEF]
cmp rax, 1
такого же, как
mov rax, 0xDEADBEEF
cmp [rax], 1
Неудачник или отказ? –
@KerrekSB нет, но он не делает то, что я ожидаю, и я не уверен, что ошибка из-за этого кода или из-за чего-то еще. – alexandernst
Тестирование модулей :-) –