Как проверить, равен ли регистр нулю в сборке 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.

Другие вопросы по тегам