Operaciones aritméticas
Enviado por paultareas • 2 de Diciembre de 2020 • Apuntes • 1.405 Palabras (6 Páginas) • 57 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:
...