'testl' eax против eax?

114
задан Michael Petch 17 April 2018 в 00:37
поделиться

5 ответов

Это тестирует, является ли eax 0, или выше, или ниже. В этом случае переход взят, если eax 0.

87
ответ дан Chris Jester-Young 24 November 2019 в 02:33
поделиться

Значение test к И аргументы вместе, и проверьте результат на нуль. Таким образом, этот код тестирует, если EAX является нулем или нет. je перейдет если нуль.

BTW, это генерирует меньшую инструкцию, чем cmp eax, 0, который является причиной, что компиляторы будут обычно делать это этот путь.

89
ответ дан phuclv 24 November 2019 в 02:33
поделиться

Тестовая инструкция делает логическую операцию И между операндами, но не записывает результат обратно в регистр. Только флаги обновляются.

В Вашем примере тест eax, eax установит нулевой флаг, если eax будет нулем, флаг знака если самый высокий набор битов и некоторые другие флаги также.

Переход, если Равный (je) инструкция переходит, если нулевой флаг установлен.

можно перевести код в более читаемый код как это:

cmp eax, 0
je  somewhere

, Который имеет ту же функциональность, но требует некоторых байтов больше пространства кода. Это - причина, почему компилятор испустил тест вместо сравнивания.

34
ответ дан Nils Pipenbrinck 24 November 2019 в 02:33
поделиться

Этот отрывок кода от подпрограммы, которая была дана подсказка к чему-то, вероятно, некоторая структура или объект. 2-я строка разыменовывает тот указатель, выбирая значение от той вещи - возможно самой указатель или возможно просто интервал, сохраненный как его 2-й участник (сместите +4). 3-и и 4-е строки тестируют это значение на нуль (ПУСТОЙ УКАЗАТЕЛЬ, если это - указатель), и пропустите следующие немного операций (не показанный), если это - нуль.

тест для нуля иногда кодируется как сравнивание с непосредственным литеральным нулевым значением, но компилятор (или человек?), кто записал, это, возможно, думало, что testl op будет работать быстрее - учет всего современного материала ЦП как переименование регистра и конвейерная обработка. Именно от того же набора хитрых приемов содержит идею очистить регистр с EAX XOR, EAX (который я видел на чьем-то номерном знаке в Колорадо!), а не очевидное, но возможно более медленный EAX MOV, № 0 (я использую более старую нотацию).

В asm, как жемчуг, TMTOWTDI.

5
ответ дан DarenW 24 November 2019 в 02:33
поделиться

Если eax будет нулем, то это выполнит условный переход, иначе это продолжит выполнение в 319e9

3
ответ дан Mike Thompson 24 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: