Welcome, Guest
Username: Password: Remember me
  • Page:
  • 1

TOPIC: Código visto hoy en clases

Código visto hoy en clases 4 weeks 2 days ago #9131

  • kirstein
  • kirstein's Avatar Topic Author
  • Offline
  • Profesor
  • Profesor
  • Posts: 2618
  • Karma: 666
  • Thank you received: 1535
Hola,

+ Alguien me pidió que les posteara esto.

Saludos,
Kirstein
Instrucción if de C:

<i> ::= if ( <exp> #if1 ) <i> #if2 <else> #if3 
<else> ::= else <i>
<else> ::= épsilon

Se piensa como se programaría en ensamblador el if:

...
pop ax         ; #if1
cmp ax, 0
je EtiElse

<i then>

jmp Etisalir   ; #if2
EtiElse:

<i else>

EtiSalir:      ; #if3


Se necesita de una pila de etiquetas que me permita tener if anidados y que no mezcle las etiquetas de else y de salir del if.

...
case if1: printf(AS,'pop ax\n');
          printf(AS,'cmp ax, 0\n'); 
          X = demeNextEtiqueta();
          printf(AS,'je %s\n',X);
          push(pilaEtIf,X); 
          break;

case if2: Z = demeNextEtiqueta();
          printf(AS,'jmp %s\n',Z);
          X = pop(pilaEtif);
          printf(AS,'%s:\n',X);
          push(pilaEtIf,Z);
          break;       

case if3: X = pop(pilaEtif);
          printf(AS,'%s:\n',X);
          break;

Necesitamos algo que me resuelva el problema de las etiquetas duplicadas.
Vamos a tener un generador de etquetas.  Va a ser una rutina a la que yo le pido demela siguiente etiqueta.

Para solucionar el problema de if anidados tendremos una pila de etiquetas de la instrucción if.

Problema de saltos fuera de rango.  Uso conejos dándoles vuelta a los saltos condicionales.

pop ax         ; #if1
cmp ax, 0
jne Etithen
jmp EtiElse
Etithen:

<i then>

jmp Etisalir   ; #if2
EtiElse:

<i else>

EtiSalir:      ; #if3

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
While:

<i> ::= while ( #while1 <exp> #while2 ) #b1 #c1 <i> #b2 #c2 #while3
<i> ::= #b3 #break1 break
<i> ::= #c3 #continue1 continue

ciclo: 

  <exp>

pop ax
cmp ax, 0
jne bloque
jmp salir
bloque:

 <i>:  ...
       jmp salir  ; break
       ...
       jmp ciclo  ; continue
       ...   
     
jmp ciclo 
salir:


#while1:
  EtCiclo = DemeNextEtiqueta();
  printf(AS,"%s:\n",EtCiclo);
  push(PilaEtiquetasInstrucciones,EtCiclo);
  push(PilaEtiquetasContinue,EtCiclo);

#while2:
  printf(AS,"pop ax\n");
  printf(AS,"cmp ax, 0\n");
  printf(AS,"jne ");
  EtBloque = DemeNextEtiqueta();
  printf(AS,"%s\n",EtBloque);
  EtSalir = DemeNextEtiqueta();
  printf(AS,"jmp ");
  printf(AS,"%s\n",EtSalir);
  printf(AS,"%s:\n",EtBloque);
  push(PilaEtiquetasInstrucciones,EtSalir);
  push(PilaEtiquetasBreak,EtSalir);

#while3:
   EtSalir = Pop(PilaEtiquetasInstrucciones);
   EtCiclo = Pop(PilaEtiquetasInstrucciones);
   printf(AS,"jmp ");
   printf(AS,"%s\n",EtCiclo);
   printf(AS,"%s:\n",EtSalir);
   pop(PilaEtiquetasBreak);   
   pop(PilaEtiquetasContinue);   



Instrucción break:

#break1:
  X=Top(PilaEtiquetasBreak);
  printf(AS,"jmp ");
  printf(AS,"%s\n",X);


Instrucción continue:
#Continue1:
  X=Top(PilaEtiquetasContinue);
  printf(AS,"jmp ");
  printf(AS,"%s\n",X);
The following user(s) said Thank You: aschmidt, joalpizar

Please Identificarse to join the conversation.

  • Page:
  • 1
  • Not Allowed: to create new topic.
  • Not Allowed: to reply.
  • Not Allowed: to add attachements.
  • Not Allowed: to edit your message.
Time to create page: 0.148 seconds
Powered by Kunena Forum