Suponha que as variáveis (int
)
a
, b
, c
e d
estão alocadas respectivamente nos registradores
eax
, ebx
, ecx
e edx
.
Como programar estruturas como:
if (a==b) c=d; else d=c; d=a+c;ou
while (a<=b) { ... a++; } d=a+c;?
Para implementar uma estrutura if ... else ...
é necessário utilizar um desvio condicional e um incondicional!
Tente fazê-lo!
Para programar o while
acima, poderíamos escrever:
loop: cmpl %ebx, %eax jgt depois ... incl %eax jmp loop ; desvia para teste depois: movl %eax, %edx addl %ecx, %edx
e se for um do..while?
Nos exemplos acima, as condições eram sempre condições simples, que podiam ser testadas com uma instrução de comparação. Muitas vezes, temos expressões mais complexas, envolvendo and e or.
A maior parte das linguagens de programação atuais utilizam o que se chama de curto circuito: a avaliação de uma expressão lógica é interrompida assim que o resultado é conhecido. Por exemplo, em uma expressão com and, se o resultado da primeira parte é falso, não se avalia a segunda. Por outro lado, em um or, se o resultado da primeira parte é verdadeiro, também não se avalia a segunda.
Como exemplo, supondo mais uma vez que
as variáveis
a
, b
, c
e d
estão alocadas nos registradores
eax
, ebx
, ecx
e edx
,
o código C:
if ((a==b)||(c<d)) { a = c; } c = d;pode ser implementado por:
cmpl %ebx, %eax je l1 cmpl %edx, %ecx lge l2 l1: movl %eax, %ecx l2: movl %ecx, %edx