Как проверить, равен ли регистр нулю в сборке x86_64
Я пытаюсь проверить, является ли значение ноль в коде сборки x86_64. Я знаю, что это обычно состоит из cmp
вариант с последующим jmp
вариант, но я не уверен в точных инструкциях по использованию.
2 ответа
Если вы только что использовали инструкцию, которая изменяет ZF раньше, просто проверьте этот флаг и перейдите с помощью JZ
или же JE
, Например
and rax, rbx ; ZF was modified
jz is_zero ; so to check if rax is zero, a single jump is enough
Если ZF не был установлен, вам нужно сделать это явно. Очевидный путь
cmp rax, 0
je equal_zero
Однако так как cmp
больше, если вы посмотрите на выходной двоичный файл, test
или иногда and
, or
является предпочтительным
83F800 cmp eax, 0
09C0 or eax, eax
85C0 test eax, eax
Полученный код будет
test rax, rax
jz is_zero
Вы можете получить выходные данные сборки от компилятора и проверить или просмотреть его в онлайн-инструменте, таком как gcc godbolt
Узнайте больше: http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
test %eax, %eax ; set ZF to 1 if eax == 0
je 0x804f430 ; jump to 0x00804f4 if ZF == 1
ZF
это один битовый нулевой флаг, который будет установлен в 1, если eax
быть равным нулю. je
будет прыгать в 0x804f430
если ZF
быть установлен на 1.