Что делает инструкция sete при сборке? - PullRequest
0 голосов
/ 26 октября 2018

Мой курс универа требует базовых знаний по сборке ... хотя у меня НЕТ. Однако они дали нам этот пример кода сборки:

080485fa <check_pin>:
 80485fa:       55                      push   ebp
 80485fb:       89 e5                   mov    ebp,esp
 80485fd:       81 7d 08 bf 07 00 00    cmp    DWORD PTR [ebp+0x8],0x7bf
 8048604:       0f 94 c0                sete   al
 8048607:       0f b6 c0                movzx  eax,al
 804860a:       5d                      pop    ebp
 804860b:       c3                      ret

Предполагается, что он более или менее эквивалентен следующему коду C:

int check_pin(int pin) {
        return pin == 0x7bf;
}

Я пытаюсь выяснить, что именно делает этот ассемблерный код, и я просто ошеломлен этой sete инструкцией. Что делает эта инструкция?

В Wikibooks есть курс по сборке x86 , но я не смог найти ничего о sete в главе, посвященной инструкциям по сборке.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Может быть немного трудно найти sete во многих руководствах, так как они не перечисляют его напрямую, как cmove.Одна хитрость заключается в том, чтобы использовать функцию документирования в компиляторе Годболта

Просто напишите инструкцию, как эта

__asm("sete %al");

sete al также будет работать, так как мы неНе важно, что это за операнды, важнее всего мнемоника.Затем, если вы наведете указатель мыши на слово sete, вы увидите всплывающую подсказку с документацией.Теперь наведите курсор на это слово и нажмите Ctrl + F8 .Появится другое всплывающее окно

SETE help

Устанавливает целевой операнд на 0 или 1 в зависимости от настроек флагов состояния (CF, SF, OF, ZF и PF) врегистр EFLAGS.Операнд-адресат указывает на регистр байтов или байт в памяти.Суффикс кода условия (cc) указывает на условие, которое проверяется.

В конце всплывающего окна вы также увидите ссылку на документацию для этой инструкции , где выможно увидеть это

0F 94           SETE r/m8   M   Valid   Valid   Set byte if equal (ZF=1).
REX + 0F 94     SETE r/m8*  M   Valid   N.E.    Set byte if equal (ZF=1).

ZF будет установлен, когда результат равен нулю, что также указывает на «равное» условие

0 голосов
/ 26 октября 2018

Инструкция sete (и ее эквивалент setz) устанавливает свой аргумент на 1, если установлен нулевой флаг, или на 0 в противном случае. Флаг нуля устанавливается, если последняя сравнительная или арифметическая инструкция дала равенство или результат нуля. Таким образом, в вашем случае sete устанавливает al в 0 или 1 в соответствии с результатом предыдущей инструкции cmp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...