Backpatching Lista de saltos de salida Todas las
Backpatching
Lista de saltos de salida • Todas las instrucciones tienen una lista de saltos de salida. • Son instrucciones JMx a las cuales no se les ha asignado el parámetro.
Clase código • • void add. Instruction(Ins, param) void add. Instruction(Ins) int next. Instruction() backpatch
backpatch(int pos, int arg) pos JMx arg
backpatch(int pos) pos JMx nx nx=get. Next. Instruction
backpatch(Linked. List l, int arg) l 1 ln JMx arg
backpatch(Linked. List l) l 1 ln JMx nx nx=get. Next. Instruction
Traducción de Is Is I ( ; I) * Al encontrar “; ” sabe que acaba de traducir una instrucción que puede haber dejado saltos.
Traducción de while I while ( E) do Is od I Se debe marcar el principio de la condición Al encontrar do sabe que acaba de traducir una condición que tiene como efecto dejar true o false en el tope de la pila. Se agrega una instrucción, JMPF que es el único punto de salida Despues de traducir Is hay que rellenar los saltos con el principio de la condición. Además hay que agregar otra condición de salida
Traducción de If else I If ( E) then Is 1 else Is 2 fi Al encontrar then sabe que acaba de traducir una condición que tiene como efecto dejar true o false en el tope de la pila. Se agrega una instrucción, JMPF que es el salto a las instrucciones Is 2. Despues de traducir Is 1 hay que agregar un salto (todavía indeterminado) para salirse de la instrucción. Esta instrucción hay que marcarla. En este punto ya se puede llenar el salto a false Los saltos de salido son los saltos de Is 1 y Isa de más el salto quese agregó después de Is 1.
Ejemplo X = read(); If (x < 0) then y = -x; Else y = x; Fi; Write (x) 0 get 1 Asgvar 0 2 Pushv 0 3 Push 0 4 EQ 5 JMPF False. Jump = 5 ?
Ejemplo X = read(); If (x < 0) then y = -x; Else y = x; Fi; Write (x) 0 get 1 Asgvar 0 2 Pushv 0 3 Push 0 4 LT 5 JMPF ? 6 Pushv 0 7 Chgsgn 8 Asgmem 1 9 Jmp ? False. Jump = 5 End. If = [9]
Ejemplo X = read(); If (x < 0) then y = -x; Else y = x; Fi; Write (x) 0 get 1 Asgvar 0 2 Pushv 0 3 Push 0 4 LT 5 JMPF ? 6 Pushv 0 7 Chgsgn 8 Asgmem 1 9 Jmp ? False. Jump = 5 End. If = [9] Backpatcj(false. Jump)
Ejemplo X = read(); If (x < 0) then y = -x; Else y = x; Fi; Write (x) 0 get 1 Asgvar 0 2 Pushv 0 3 Push 0 4 JMPF 9 5 Pushv 0 6 Chgsgn 7 Asgmem 1 8 Jmp ? False. Jump = 4 End. If = [8] Backpatch(false. Jump)
Ejemplo X = read(); If (x < 0) then y = -x; Else y = x; Fi; Write (x) 0 get 1 Asgvar 0 2 Pushv 0 3 Push 0 4 JMPF 9 5 Pushv 0 6 Chgsgn 7 Asgmem 1 8 Jmp ? 9 Pushv 0 10 Asgmem 2 End. If = [8] Backpatch(End. If)
Ejemplo 0 X = read(); If (x < 0) then y = -x; Else y = x; Fi; Write (x) get 1 Asgvar 0 2 Pushv 0 3 Push 0 4 JMPF 9 5 Pushv 0 6 Chgsgn 7 Asgmem 1 8 Jmp 11 9 Pushv 0 10 Asgmem 2 11 Pushv 0 12 put End. If = [8] Backpatch(End. If)
- Slides: 16