Operaciones aritméticas
Enviado por paultareas • 2 de Diciembre de 2020 • Apuntes • 1.405 Palabras (6 Páginas) • 76 Visitas
Operaciones aritméticas:
Ejemplo #1
Supongamos que se tiene la siguiente operación: x = a + y - z * w / a;
Lo primero que se debe realizar es el postfijo de la operación quedando de la siguiente manera: begin_main,x,a,y,+,z,w,*,a,/,-,=,end_main
Por el momento ignoraremos el inicio de main y fin de main, la expresión postfija se manejará como un arreglo de palabras, por lo tanto, se recorrerá hasta encontrar un operador aritmético, cuando se encuentre dicho operador se tomará su valor equivalente de ensamblador (Tabla 1.1), y se creara una nueva cadena de texto, donde numerotemporal es un contador
MOV temporal + numeroTemporal, i – 1
OP temporal + numeroTemporal, i – 2
En el arreglo de postfijo se sustituirá el valor i – 2 por el temporal y se eliminará el valor i – 1 e i.
MOV temporal1, a
SUM temporal1, y
Arreglo: begin_main,x,temporal1,z,w,*,a,/,-,=,end_main
MOV temporal2, z
MUL temporal2, w
Arreglo: begin_main,x,temporal1,temporal2,a,/,-,=,end_main
MOV temporal3, temporal2,
DIV temporal3, a
Arreglo: begin_main,x,temporal1,temporal3,-,=,end_main
MOV temporal4, temporal1,
SUB temporal4, temporal3
Arreglo: begin_main,x,temporal4,=,end_main
Nota: Cuando se encuentre un = el contador de temporales pasa a ser 0 y se elimina, i, i-1 e i-2
MOV x,temporal4,end_main
Arreglo: begin_main,end_main
Resultado:
MOV temp1, a
ADD temp1, y
MOV temp2, z
MUL temp2, w
MOV temp3, temp2
DIV temp3, a
MOV temp4, temp1
SUB temp4, temp3
MOV x, temp4
Operador Equivalente Ensamblador
+ SUM
- SUB
* MUL
/ DIV
Tabla 1.1
Ejemplo #2
Ahora supongamos que tenemos otra operación extra en nuestro código:
x = a + y - z * w / a;
y = x * w;
El postfijo queda de la siguiente manera:
begin_main,x,a,y,+,z,w,*,a,/,-,=,y,x,w,*,=,end_main
Se hace igual que en el ejemplo #1 se recorre la lista hasta encontrar un operador aritmetico:
MOV temporal1, a
SUM temporal1, y
Arreglo: begin_main,x,temporal1,z,w,*,a,/,-,=, y,x,w,*,=,end_main
MOV temporal2, z
MUL temporal2, w
Arreglo: begin_main,x,temporal1,temporal2,a,/,-,=, y,x,w,*,=,end_main
MOV temporal3, temporal2,
DIV temporal3, a
Arreglo: begin_main,x,temporal1,temporal3,-,=, y,x,w,*,=,end_main
MOV temporal4, temporal1,
SUB temporal4, temporal3
Arreglo: begin_main,x,temporal4,=, y,x,w,*,=,end_main
MOV x,temporal4
Arreglo: begin_main,y,x,w,*,=,end_main
Nota: Como se puede observar inicia en la temporal1, porque el contador se reinició con la igualación de la operación pasada
MOV temporal1, x
MUL temporal1, w
Arreglo: begin_main,y,temporal1,=,end_main
MOV y, temporal1
Arreglo: begin_main,end_main
Resultado:
MOV temp1, a
ADD temp1, y
MOV temp2, z
MUL temp2, w
MOV temp3, temp2
DIV temp3, a
MOV temp4, temp1
SUB temp4, temp3
MOV x, temp4
MOV temp1, x
MUL temp1, w
MOV y, temp1
Condiciones (if y while)
If sin else
Supongamos que tenemos el siguiente fragmento de código:
main {
if(x>10){
x = x + 10;
}
}
El postfijo queda de la siguiente manera:
begin_main,if1,x,10,>,begin_if1,x,x,10,+,=,end_if1,else1,begin_else1,end_else1,end_main
Se va recorrer el arreglo si se encuentra con un if, else, fin de else, while, inicio de main o fin de main se creará una etiqueta. Esto se hace solo concatenándole “:” a la palabra y se eliminara del arreglo.
begin_main:
Arreglo: if1,x,10,>,begin_if1,x,x,10,+,=,end_if1,else1,begin_else1,end_else1,end_main
if1:
Arreglo: x,10,>,begin_if1,x,x,10,+,=,end_if1,else1,begin_else1,end_else1,end_main
Nota: Cuando se tope con un operador relacional pregunta si el siguiente elemento es un inicio de if o while, si de lo contrario no es un inicio se realizará otro caso que se verá en los operadores lógicos.
CMP i – 2, i – 1
SALTO INVERSO elseCorrespondiente
Se eliminará i, i + 1, i – 2, e i -1 y el contador de temporales se reinicia a 0.
El salto inverso se encontrará en la tabla 1.2.
Operador relacional Salto inverso
> JLE
>= JL
< JGE
<= JG
== JNE
¡= JE
Tabla 1.2
Continuamos con el ejemplo
CMP x, 10
JLE end_else1
Arreglo: x,x,10,+,=,end_if1,else1,begin_else1,end_else1,end_main
MOV temporal1, x
SUM temporal1, 10
Arreglo: x,temporal1, =,end_if1,else1,begin_else1,end_else1,end_main
MOV x, temporal1
Arreglo: end_if1,else1,begin_else1,end_else1,end_main
end_if1:
Arreglo: else1,begin_else1,end_else1,end_main
Nota: En el caso del else también se borra el inicio de else
else1:
Arreglo: end_else1,end_main
end_else1:
Arreglo: end_main
end_main
Arreglo: Vacio
Resultado
begin_main:
if1:
CMP x, 10
JLE else1
MOV temp1, x
ADD temp1, 10
MOV x, temp1
JMP end_else1
else1:
end_else1:
end_main:
If con else:
Supongamos que tenemos el siguiente código:
main {
if(x>10){
x = x + 10;
}
else{
t = t – 230;
}
}
Postfijo:
begin_main,if1,x,10,>,begin_if1,x,x,10,+,=,end_if1,else1,begin_else1,x,x,230,-,=,end_else1,end_main,
Literal se hace como el if sin else.
begin_main:
Arreglo: if1,x,10,>,begin_if1,x,x,10,+,=,end_if1,else1,begin_else1, x,x,230,-,=,end_else1,end_main
if1:
Arreglo: x,10,>,begin_if1,x,x,10,+,=,end_if1,else1,begin_else1, x,x,230,-,=,end_else1,end_main
CMP x, 10
JLE end_else1
Arreglo: x,x,10,+,=,end_if1,else1,begin_else1, x,x,230,-,=,end_else1,end_main
...