Я только что попробовал простую программу на C с использованием инструкции if и проанализировал ее сборку. Однако его поведение сильно отличается, когда для компиляции используется флаг -O2.понимание сборки: -O2, если ветвление
код C для то же: -
#include<stdio.h>
int main(int argc, char **argv) {
int a;
if(a<0) {
printf("A is less than 0\n");
}
}
И соответствующая сборка: -
main:
push %ebp
mov %ebp, %esp
sub %esp, 8
and %esp, -16
sub %esp, 16
test %eax, %eax
js .L4
leave
ret
.p2align 4,,15
.L4:
sub %esp, 12
push OFFSET FLAT:.LC0
call puts
add %esp, 16
leave
ret
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.6"
Я прочитал, что test
инструкции в основном только выполняет логическое И двух операндов , Я также читал, что инструкция js
выполняет скачок, когда есть изменение знака в предыдущей инструкции. Итак, test
ing eax с eax дадут 0
или 1
, и скачок будет зависеть от этого.
Я не понимаю, как он используется здесь для ветвления. Может ли кто-нибудь объяснить, как это работает?
Хороший компилятор должен оптимизировать всю программу до нуля, так как имеет неопределенное поведение (использование неинициализированной переменной). Или, если 'a' были инициализированы, он должен оптимизировать условие, основанное на значении' a'. –