Compilação para Assembly de Mecanismos de Repetição e Decisão (2)

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 
Referência