Это тестирует, является ли eax
0, или выше, или ниже. В этом случае переход взят, если eax
0.
Значение test
к И аргументы вместе, и проверьте результат на нуль. Таким образом, этот код тестирует, если EAX является нулем или нет. je
перейдет если нуль.
BTW, это генерирует меньшую инструкцию, чем cmp eax, 0
, который является причиной, что компиляторы будут обычно делать это этот путь.
Тестовая инструкция делает логическую операцию И между операндами, но не записывает результат обратно в регистр. Только флаги обновляются.
В Вашем примере тест eax, eax установит нулевой флаг, если eax будет нулем, флаг знака если самый высокий набор битов и некоторые другие флаги также.
Переход, если Равный (je) инструкция переходит, если нулевой флаг установлен.
можно перевести код в более читаемый код как это:
cmp eax, 0
je somewhere
, Который имеет ту же функциональность, но требует некоторых байтов больше пространства кода. Это - причина, почему компилятор испустил тест вместо сравнивания.
Этот отрывок кода от подпрограммы, которая была дана подсказка к чему-то, вероятно, некоторая структура или объект. 2-я строка разыменовывает тот указатель, выбирая значение от той вещи - возможно самой указатель или возможно просто интервал, сохраненный как его 2-й участник (сместите +4). 3-и и 4-е строки тестируют это значение на нуль (ПУСТОЙ УКАЗАТЕЛЬ, если это - указатель), и пропустите следующие немного операций (не показанный), если это - нуль.
тест для нуля иногда кодируется как сравнивание с непосредственным литеральным нулевым значением, но компилятор (или человек?), кто записал, это, возможно, думало, что testl op будет работать быстрее - учет всего современного материала ЦП как переименование регистра и конвейерная обработка. Именно от того же набора хитрых приемов содержит идею очистить регистр с EAX XOR, EAX (который я видел на чьем-то номерном знаке в Колорадо!), а не очевидное, но возможно более медленный EAX MOV, № 0 (я использую более старую нотацию).
В asm, как жемчуг, TMTOWTDI.
Если eax будет нулем, то это выполнит условный переход, иначе это продолжит выполнение в 319e9