Documente Academic
Documente Profesional
Documente Cultură
PowerPC con
Mac OS X
MacProgramadores
MacProgramadores
Pg 3
MacProgramadores
Notaciones utilizadas
En general, cuando describamos una instruccin ensamblador vamos a utilizar
las minsculas para indicar valores que tengamos que escribir literalmente,
mientras que vamos a utilizar maysculas para indicar valores que deban ser
sustituidos por su valor, es decir, si escribimos el formato de una instruccin,
escribiremos:
cmp CRF,L,rA,rB
Cuando la vayamos a ejecutar con determinados valores escribiremos:
cmp 2,0,r5,r6
Donde CRF y L han sido sustituidos por un valor, al igual que la A y B de rA y
rB, mientras que cmp se escribe literalmente por ser minsculas.
Nota legal
Este tutorial ha sido escrito por Fernando Lpez Hernndez para
MacProgramadores, y de acuerdo a los derechos que le concede la legislacin
espaola e internacional el autor prohbe la publicacin de este documento en
cualquier otro servidor web, as como su venta, o difusin en cualquier otro
medio sin autorizacin previa.
Sin embargo el autor anima a todos los servidores web a colocar enlaces a
este documento. El autor tambin anima a cualquier persona interesada en
aprender a programar el PowerPC a bajarse o imprimirse este tutorial.
Madrid, Diciembre 2005
Para cualquier aclaracin contacte con:
fernando@DELITmacprogramadores.org
Pg 4
MacProgramadores
Tabla de contenido
TEMA 1: Introduccin al PowerPC
1 La arquitectura del PowerPC ..............................................................10
2 Los entornos del PowerPC..................................................................12
3 Los registros del PowerPC..................................................................13
4 Byte ordering....................................................................................14
5 Alineacin.........................................................................................16
TEMA 2: Empezando a programar
1 Herramientas necesarias....................................................................18
2 El programa mnimo ..........................................................................21
3 El lenguaje ensamblador....................................................................23
3.1
Sintaxis del lenguaje ...................................................................23
3.2
Elementos del lenguaje ...............................................................24
3.2.1
Literales ..............................................................................25
3.2.2
Identificadores.....................................................................26
3.2.3
Las expresiones ...................................................................27
3.2.4
El location counter ...............................................................30
3.3
Las sentencias de asignacin directa ............................................31
3.4
Las definiciones ..........................................................................32
4 Acceso a memoria .............................................................................33
4.1
Segmentacin del programa ........................................................33
4.2
Las secciones .............................................................................34
4.2.1
Secciones del segmento de cdigo ........................................34
4.2.2
Secciones del segmento de datos..........................................38
4.2.3
Crear nuevas secciones ........................................................39
4.2.4
Agrupar las secciones...........................................................40
4.3
Indireccionamiento de memoria en las mquinas RISC ..................41
4.4
Modos de indireccionamiento.......................................................43
4.4.1
Indireccionamiento de registro base e ndice inmediato ..........44
4.4.2
Ejemplo...............................................................................47
4.4.3
Acceso a memoria con actualizacin de registro .....................48
4.4.4
Uso del operador ha16() ....................................................49
4.4.5
Indireccionamiento de registro base y registro ndice..............51
4.5
Carga y almacenamiento de bloques de bytes...............................54
4.6
Mnemonics.................................................................................56
5 Instrucciones de trabajo con enteros ..................................................59
5.1
El registro CR (Condition Register) ...............................................59
5.2
El registro XER ...........................................................................63
5.3
Instrucciones aritmticas.............................................................65
5.3.1
Instrucciones aritmticas de suma.........................................65
5.3.2
Instrucciones aritmticas de resta .........................................70
5.3.3
Instrucciones de negacin aritmtica.....................................72
5.3.4
Instrucciones aritmticas de multiplicacin.............................72
5.3.5
Instrucciones aritmticas de divisin......................................74
5.4
Instrucciones de comparacin de enteros .....................................75
Pg. 5
MacProgramadores
5.5
Instrucciones lgicas con enteros.................................................76
5.6
Instrucciones de rotacin y desplazamiento con enteros................78
5.6.1
Instrucciones de desplazamiento con enteros.........................79
5.6.2
Instrucciones de rotacin con enteros ...................................80
5.7
Mnemonics.................................................................................83
5.7.1
Mnemonics para la resta.......................................................83
5.7.2
Mnemonics para las operaciones de comparacin ...................84
5.7.3
Mnemonics para operaciones de desplazamiento y rotacin ....85
5.7.4
Mnemonics para acceder al registro XER................................86
5.7.5
Otros mnemonics.................................................................86
5.8
Operaciones comunes con enteros...............................................87
5.8.1
Valor absoluto .....................................................................87
5.8.2
Mximo y mnimo de un nmero sin signo .............................88
5.8.3
Mximo y mnimo de un nmero con signo ............................90
5.8.4
Resto de una divisin ...........................................................91
5.8.5
Divisin entre una constante entera ......................................92
5.8.6
Divisin de 64 bits en mquinas de 32 bits.............................96
6 Instrucciones de bifurcacin.............................................................101
6.1
Tipos de clculo de la direccin de salto de una instruccin .........101
6.1.1
Instrucciones de salto relativo.............................................102
6.1.2
Instrucciones de salto absoluto ...........................................103
6.1.3
Las instrucciones de salto condicional..................................104
6.1.4
Instrucciones condicionales de salto relativo ........................107
6.1.5
Instrucciones condicionales de salto absoluto.......................108
6.1.6
Instrucciones condicionales de salto al Count Register ..........109
6.1.7
Instrucciones condicionales de salto al Link Register.............110
6.2
Mnemonics...............................................................................112
6.2.1
Mnemonics para saltos incondicionales ................................112
6.2.2
Mnemonics para saltos condicionales...................................112
6.2.3
Mnemonics para acceder a los registros CR, CTR y LR ..........116
6.3
Implementacin en ensamblador de las sentencias de control de
flujo ms conocidas del lenguaje C ......................................................116
6.3.1
Condicional simple y doble..................................................116
6.3.2
Condicional mltiple ...........................................................117
6.4
Los bucles................................................................................120
6.4.1
Mnemonics para bucles ......................................................120
6.4.2
Bucle do-while ...................................................................121
6.4.3
Bucle while ........................................................................122
6.4.4
Bucle for ...........................................................................122
6.5
Operaciones lgicas con los bits del registro CR ..........................124
7 Instrucciones de trabajo con nmeros en punto flotante ....................127
7.1
Introduccin.............................................................................127
7.2
Los registros de punto flotante ..................................................127
7.3
El registro FPSCR......................................................................128
7.3.1
Instrucciones para acceder a los bits de registro FPSCR ........131
7.3.2
Los flags de excepcin .......................................................132
7.3.3
Los bits de condicin y el bit de clase ..................................134
7.3.4
Los bits de redondeo..........................................................136
Pg. 6
MacProgramadores
7.4
El registro CR ...........................................................................136
7.5
Manejo de traps .......................................................................137
7.6
Instrucciones de carga y almacenamiento ..................................138
7.7
Instrucciones aritmticas...........................................................140
7.8
Instrucciones de conversin ......................................................143
7.9
Instrucciones de comparacin ...................................................144
7.10
Instrucciones de movimiento de datos ....................................145
8 Incrustar cdigo ensamblador en un programa C...............................146
8.1
Integracin entre C y ensamblador ............................................146
8.2
Acceso a variables C desde ensamblador....................................146
8.3
Expresiones C como operandos de instrucciones ensamblador .....148
8.3.1
Las constraints y los modificadores......................................149
8.3.2
Expresiones C en gcc 3.1....................................................153
9 Llamada a funciones........................................................................154
9.1
Tipos de datos..........................................................................154
9.2
Mecanismo general de llamada a procedimientos ........................155
9.3
Convencin del uso de los registros ...........................................155
9.4
Estructura de la pila..................................................................157
9.4.1
Las reas del frame............................................................158
9.5
Paso de control a un procedimiento ...........................................159
9.5.1
El prlogo y el eplogo ........................................................159
9.5.2
Los procedimientos terminales ............................................164
9.5.3
Paso de parmetros ...........................................................165
9.5.4
Funciones con un nmero variable de parmetros ................168
9.5.5
Retorno de una funcin ......................................................169
9.6
Ejemplo ...................................................................................169
APNDICE A: Aritmtica binaria
1 Tcnicas bsicas de aritmtica entera ...............................................173
1.1
Nmeros sin signo ....................................................................173
1.1.1
Suma con transmisin de acarreo........................................173
1.1.2
Resta con peticin de acarreo .............................................175
1.1.3
Multiplicacin en base 2 .....................................................177
1.1.4
Divisin en base 2..............................................................178
1.2
Nmeros con signo ...................................................................181
1.2.1
Representacin ..................................................................181
1.2.2
Suma y resta de nmeros en complemento a 2 ....................182
1.3
Aspectos del sistema ................................................................183
2 Introduccin al punto flotante ..........................................................186
3 Formato de los datos en punto flotante.............................................188
3.1
Nmeros denormalizados ..........................................................191
3.2
Nmeros especiales ..................................................................192
Rangos mximos y mnimos en los nmeros en punto flotante...............194
4 El problema del redondeo en punto flotante......................................196
4.1
La precisin en punto flotante ...................................................196
4.2
Error absoluto y relativo ............................................................197
4.3
Modos de redondeo ..................................................................198
5 Las excepciones ..............................................................................199
Pg. 7
MacProgramadores
Pg. 8
Tema 1
Introduccin al PowerPC
Sinopsis:
Este primer tema sirve para orientar al lector sobre el contenido del tutorial, y
ayuda a concretar una serie de conceptos bsicos que sern necesario tener
claro para leer el resto del tutorial.
MacProgramadores
MacProgramadores
Pg 11
MacProgramadores
OEA
VEA
UISA
Pg 12
MacProgramadores
Pg 13
MacProgramadores
4 Byte ordering
Los bytes de la memoria se numeran empezando a contar por 0. Cada
nmero es la direccin de memoria de un byte. En este sentido los bytes son
unidades indivisibles y no existe problema respecto a la forma de ordenar los
bits de un byte en memoria. El problema surge con las variables cuyo tamao
es mayor a un byte.
En este caso existen dos formas de colocar los bytes que forman una variable
en memoria llamadas:
Big-Endian. Donde el byte ms significativo se coloca en la direccin de
memoria ms baja (el primero).
Little-Endian. Donde el byte menos significativo se coloca el la direccin de
memoria ms baja (el primero).
Por ejemplo, el nmero 617163 en binario se escribe como 1001 0110 1010
1100 1011. Si lo queremos guardar en memoria necesitaremos una variable
de tamao suficiente para almacenarlo.
Los tamaos tpicos de variables enteras (vistas desde el punto de vista de C)
aparecen en la Tabla 1.1:
Tipo dato
char
short
int
Tamao
(bytes)
1 byte
2 bytes
4 bytes
Rango Valores
-128..+127
-32.768..+32.767
-2.147.483.648..+ 2.147.483.647
4.1.1.1
Big-Endian
0000 0000
0
4.1.1.2
MacProgramadores
0000 1001
1
0110 1010
2
1100 1011
3
0000 1001
2
0000 0000
3
Little-Endian
1100 1011
0
0110 1010
1
Pg 15
MacProgramadores
5 Alineacin
PowerPC dispone de instrucciones que permiten transferir entre memoria y
los registros tanto bytes, como halfwords (16 bits), words (32 bits), o
doublewords (64 bits). En las mquinas de 32 bits, estos ltimos slo se usan
para los datos en representacin de punto flotante con precisin doble que
queramos guardar en los FPR, mientras que en los procesadores de 64 bits,
los GPRs tienen 64 bits con lo que es su tamao por defecto.
Estas instrucciones de acceso a memoria funcionan ms rpido si el acceso lo
hacemos a una direccin de memoria que sea mltiplo del tamao de los
datos a transferir, por ejemplo si accedemos a variables de tipo int (4
bytes), el acceso ms rpido se consigue cuando accedemos a una direccin
de memoria mltiplo de 4.
Como regla general, debemos colocar las variables en zonas de memoria cuya
direccin sea mltiplo del tamao de la variable que estamos guardando.
Si esto no se hace el microprocesador tiene que hacer dos accesos a
memoria, uno para leer los cuatro primeros bytes alineados y otro para leer
los siguientes 4 bytes, para finalmente componer el valor de la variable, lo
cual enlentece el acceso.
La Tabla 1.2 muestra la alineacin recomendada para cada tamao de dato.
Operando
Longitud
byte
halfword
word
doubleword
1 byte
2 bytes
4 bytes
8 bytes
Direccin
alineada
xxxx
xxx0
xx00
x000
Pg 16
Tema 2
EMPEZANDO A PROGRAMAR
Sinopsis:
MacProgramadores
1 Herramientas necesarias
Vamos a empezar viendo qu herramientas de programacin en ensamblador
existen para Mac OS X y como se pueden usar.
Los primero que vamos a necesitar es obtener las Development Tools que
podemos conseguir gratuitamente de la Apple Developer Connection (ADC) en
[DEVTOOLS]:
Dentro de estas herramientas encontramos el conocido compilador gcc de
GNU, que es el que nos va a permitir compilar cdigo C, C++, Objective-C y
ensamblador desde la lnea de comandos.
Para probar este comando podemos escribir un fichero llamado saluda.c
como el del Listado 1.1:
#include <stdio.h>
#define MENSAJE "Hola mundo\n"
int main ()
{
printf(MENSAJE);
return 0;
}
Listado 1.1: Programa ensamblador mnimo
Preprocesado
Generacin del cdigo ensamblado (compilacin)
Generacin del cdigo objeto (ensamblado)
Enlazado
MacProgramadores
$ as saluda.s -oD.o
De hecho esta es la principal herramienta que vamos a usar para compilar los
programas en ensamblador que hagamos a lo largo de este tutorial.
Tambin , antes de continuar, conviene comentar que las Development Tools
tambin traen una herramienta visual llamada Xcode que nos permite de
Pg 19
MacProgramadores
.cpp
.cc
.cxx
.C
.m
Preprocesa, ensambla,
compila y enlaza
.h
No usados directamente
.i
.ii
.s
.S
.o
.a
.so
Ensambla, compila y
enlaza
Ensambla, compila y
enlaza
Compila y enlaza
Preprocesa, compila y
enlaza
Enlaza
Enlaza
Enlaza
Pg 20
MacProgramadores
2 El programa mnimo
Ya que sabemos cmo se usa el compilador, vamos a escribir un programa
mnimo para ver cmo se compila y enlaza un programa ensamblador en Mac
OS X.
Para ello escribimos un fichero llamado basico.s de la forma:
/* Descripcin: Programa bsico en ensamblador
* Escrito por: Fernando Lpez Hernndez
*/
.text // Empieza la seccin de cdigo
.align 2
.globl _main ; Hacemos global la funcin main()
_main:
blr ;Retorna de la funcin main
En primer lugar, en este programa hemos utilizado los 3 tipos de comentarios
que soporta el lenguaje ensamblador, los cuales se resumen en la Tabla 2.2.
Comentario
/* */
//
;
Descripcin
Comentario multilnea de C
Comentario de una sola lnea de C
Comentario de una sola lnea propio del ensamblador as
Pg 21
MacProgramadores
.globl sirve para declarar como global el siguiente smbolo que aparece. La
funcin main() debe de ser un smbolo global para que Mac OS X pueda
acceder a ella. Obsrvese que la funcin se llama _main y no main, esto es
as porque todos los smbolos sufren un name-mangling al estilo C (poner un
_ delante) antes de meterlos en la tabla de smbolos.
blr es la nica instruccin ensamblador que tiene el programa y que lo que
hace es retornar de la llamada a la funcin main(). Como veremos la
direccin a la que retorna esta llamada se almacena en un registro del
microprocesador llamado LR (Link Register), cuyo principal uso es almacenar
direcciones de retorno de las funciones.
Ahora ya lo podemos compilar y ejecutar:
$ gcc basico.s -o basico
$ ./basico
Pg 22
MacProgramadores
3 El lenguaje ensamblador
Ahora que ya sabemos cmo se hace un programa en ensamblador, vamos a
comentar brevemente cuales son los principales elementos del lenguaje
ensamblador, as como la sintaxis de las sentencias que soporta.
MacProgramadores
mflr r0
stwu r1,-80(r1)
mr r30,r1
bcl 20,31,inicio
Pg 24
MacProgramadores
3.2.1 Literales
Un literal es una representacin escrita de un valor. Dentro de los literales
encontramos:
Los caracteres, los cuales se representan encerrados entre comillas simples.
Por ejemplo: 'A', 'a', '2','?'. Cuando el compilador los encuentra los
sustituye por el valor ASCII del carcter correspondiente.
li r3,'A'
Las cadenas de caracteres, las cuales se representan encerradas entre
comillas dobles, como por ejemplo "Hola mundo". El compilador las
sustituye por los cdigos ASCII de sus caracteres.
Estas se utilizan sobre todo para reservar trozos de memoria con la directiva
.ascii as:
.ascii "Hola mundo"
El compilador no pone el 0 de final de cadena, aunque si queremos que lo
ponga podemos usar la directiva .asciz
.asciz "Hola mundo"
Los nmeros enteros, los cuales se pueden representar en decimal, octal o
hexadecimal.
o Los nmeros en decimal se representan en su forma natural: 4, -37.
No pueden empezar por 0.
o Los nmeros en hexadecimal se representan precedidos por 0x, por
ejemplo: 0x45, 0xF259B4C2. Para las letras se pueden usar
maysculas o minsculas indistintamente, es decir podemos escribir
0x3F 0x3f
o Los nmeros en octal empiezan por 0. Por ejemplo, 037, 041241
Los nmeros en punto flotante, se representan de una forma un poco
especial, cuyo formato general sera:
0flt_char[{+-}[dec...][.[dec...]]e[{+-}][dec...]]
flt_char indica si el nmero es un nmero real de precisin simple (r) o de
precisin doble (d). El primer dec... indica la parte entera, el segundo
dec... la parte decimal, y por ltimo va una e seguida de la parte
exponencial del nmero. Con unos ejemplos seguro que queda ms claro:
Pg 25
Nmero
1.34
0.00045
2456
MacProgramadores
Precisin
doble
doble
float
Representacin
0d1.34e0
0d45.0e-4
0r2456.0e0
Cuando usamos uno de estos literales con las directivas .single y .double
que sirven para reservar memoria para un nmero en punto flotante de
precisin simple o doble, respectivamente, la directiva ignora el tipo del
literal, y slo se tiene en cuenta el tipo de la directiva, aun as es
recomendable indicar el tipo por claridad.
Por ejemplo:
F1:
F2:
D1:
D2:
.single 0r2456.0e0 ;
;
;
.single 0d2456.0e0 ;
.double 0d1.34e0
;
;
;
.double 0r1.34e0
;
3.2.2 Identificadores
Un identificador es un nombre que damos a uno de estos dos elementos:
o Una etiqueta, que sirve para referirnos a un trozo del programa o a
una variable.
o Una constante, que es un nombre al que le asociamos un literal.
Cada identificador consiste en una secuencia de caracteres alfanumrica, que
no puede empezar por un nmero, y en la que se diferencian maysculas de
minsculas.
Como curiosidad, en ensamblador los identificadores pueden tener espacios,
en cuyo caso debemos de encerrarlos entre comillas dobles. Por ejemplo:
"maximo relativo"
"diferencia en pixeles"
Aunque por homogeneidad con los dems lenguajes es mejor no usar esta
forma, que da lugar a confusin con las cadenas de caracteres, y en vez de
ello usar guiones bajos o maysculas y minsculas para separar palabras.
MaximoRelativo
diferencia_en_pixeles
Pg 26
MacProgramadores
Respecto al mbito de las etiquetas, estas slo son visibles dentro del fichero
que las declara, pero podemos hacer las etiquetas de mbito global (para
poder acceder a ellas desde otros ficheros) con la directiva .globl:
.global A
A:
lwi r4,5
Esto hace a la etiqueta A accesible desde otros mdulos. La directiva debe
preceder a la etiqueta que vamos a declarar como global.
Tambin podemos usar las llamadas etiquetas numricas, que son
etiquetas que se pueden redefinir en distintas partes de un mismo fichero.
Estas etiquetas se crean con los dgitos del 0 al 9, y tambin deben de ir
precedidas por :. Aunque puede haber muchas declaraciones de la misma
etiqueta en distintas partes del fichero, slo la etiqueta numrica
inmediatamente anterior y siguiente pueden ser accedidas desde un punto
concreto del programa. Para ello usamos el nombre digitob (back) y
digitof (forward), respectivamente.
Por ejemplo:
1:
instruccionA
1:
instruccionB
b 1 ; Salta a instruccionB
b 1b ; Salta a instruccionB
b 1f ; Salta a instruccionC
1:
instruccionC
Pg 27
MacProgramadores
<<
&
|
^
&&
||
<
>
<=
>=
==
!=
Nombre
Menos unrio
Negado binario
Negado lgico
Descripcin
El complemento a 2 de un nmero
Complemento a uno de un nmero
El resultado es 0 si el operando es distinto de
0, y -1 en caso contrario
Suma
La suma de dos nmeros
Resta
La resta de dos nmeros
Multiplicacin
El producto de dos nmeros
Divisin
Divisin entera de dos nmeros. Trunca los
posibles decimales
Mdulo
El resto de la divisin entera
Desplazamiento El resultado es el valor del primer operando
a la derecha
desplazado a la derecha, tantas veces como
diga el segundo operando. El desplazamiento
es siempre aritmtico, respecto a que no
modifica el bit del signo
Desplazamiento El resultado es el valor del primer operando
a la izquierda
desplazado a la izquierda, tantas veces como
diga el segundo operando. El desplazamiento
es siempre aritmtico, respecto a que no
modifica el bit del signo
and binario
El and binario de los dos operandos
or binario
El or binario de los dos operandos
xor binario
El xor binario de los dos operandos
and lgico
El resultado es 1 si ambos operandos son
distintos de 0, y 0 en caso contrario
or lgico
El resultado es 1 si alguno de los operandos
son distintos de 0, y 0 en caso contrario
Menor que
Mayor que
Menor o igual
que
Mayor o igual
que
Igual
Distinto
Tabla 2.3: Operandos que pueden aparecer en una expresin del ensamblador
Pg 28
MacProgramadores
Pg 29
MacProgramadores
Pg 30
MacProgramadores
Pg 31
MacProgramadores
// Directivas .set
.set operando1,3
.set operando2,5
.text
.align 2
.globl _main
_main:
li r3,operando1
li r4,operando2
add r5,r3,r4
blr
Listado 2.3: Programa que usa .set en lugar de identificadores
= 3 ; Correcto
= r3 ; Error ensamblado
var1 3; correcto
var1 r3 ; Error ensamblado
Pg 32
MacProgramadores
4 Acceso a memoria
En esta seccin vamos a explicar una serie de conceptos fundamentales para
poder acceder a memoria.
de
generacin
de
un
ejecutable
consta
MacProgramadores
.data
.text
Cuando el enlazador recibe los ficheros de cdigo objeto, ste fusiona todos
los segmentos de un mismo tipo bajo un nico segmento.
Otro concepto importante que va unido a los segmentos es el de
reubicacin. Cuando el compilador genera cdigo objeto, ste almacena
todas las referencias a memoria como direcciones reubicables, es decir, como
offsets respecto a una direccin base 0, que es el principio del segmento.
Cuando el enlazador rene todos los ficheros objetos para generar el
ejecutable, tiene que asignar direcciones absolutas a las direcciones relativas
que deposit el compilador, para ello simplemente concatena todos los
segmentos del mismo tipo, y luego calcula las direcciones absolutas de cada
una de las direcciones reubicables.
Seccin
(__TEXT,__text)
.const
.literal4
(__TEXT,__const)
(__TEXT,
__literal4)
Pg 34
Descripcin
Almacena
cdigo
de
programa
Variables constantes
Variables constantes de 4
bytes
.literal8
.cstring
.constructor
.destructor
.fvmlib_init0
.fvmlib_init1
MacProgramadores
(__TEXT,
__literal8)
(__TEXT,
__cstring)
(__TEXT,
__constructor)
(__TEXT,
__destructor)
(__TEXT,
__ fvmlib_init0)
(__TEXT,__
fvmlib_init1)
.symbol_stub
(__TEXT,
__symbol_stub)
.picsymbol_stub (__TEXT,
__picsymbol_stub)
Variables constantes de 8
bytes
Cadenas
de
caracteres
constantes
Usada
slo
por
los
constructores de C++
Usada
slo
por
los
destructores de C++
Estas secciones las debe de
usar solamente el sistema de
memoria virtual de las
libreras de enlace dinmico.
Nosotros nunca debemos
poner nada aqu.
Usadas
para
llamar
a
funciones de libreras de
enlace
dinmico.
Como
veremos ms adelante
Tabla 2.4: Directivas para cada tipo de seccin del segmento de cdigo
Pg 35
MacProgramadores
Descripcin
Reserva espacio para un byte, y le asigna el valor
dado en valor, 0 si no se especifica.
.short [valor]
Reserva espacio para una variable entera de 2
bytes, y le asigna el valor dado en valor, 0 si
no se especifica.
.long [valor]
Reserva espacio para una variable entera de 4
bytes, y le asigna el valor dado en valor, 0 si
no se especifica.
.single [valor]
Reserva espacio para una variable de punto
flotante con precisin simple (4 bytes), y le asigna
el valor dado en valor, 0 si no se especifica.
.double [valor]
Reserva espacio para una variable de punto
flotante con precisin doble (8 bytes), y le asigna
el valor dado en valor, 0 si no se especifica.
.ascii cadena
Reserva espacio para la cadena dada en cadena.
No pone el 0 de final de cadena
.asciz cadena
Reserva espacio para la cadena dada en cadena.
Y pone un 0 al final de la cadena.
.fill
Pone el valor dado en valor tantas veces como
repeticiones,
diga repeticiones. El tamao de la variable
tamao, valor
puede ser 1,2 4 segn diga tamao
.space
n_bytes, Pone el valor dado en valor tantas veces como
[valor]
diga n_bytes, o ceros si no damos valor
Tabla 2.5: Directivas para indicar la cantidad de memoria a reservar y valor inicial
MacProgramadores
f:
.float 0r1.34e0
.literal8
d:
.double 0d56.e7
.cstring
msg: .ascii
"Hola mundo\013\000"
.text ; Ahora van las instrucciones en ensamblador
; en una seccion de codigo regular
lwz r4,0(r9)
lwz r5,0(r11)
Una optimizacin que aplica el compilador a los datos marcados como
.literal4, .literal8 o .cstring es que si el mismo valor aparece
varias veces en distintos ficheros de cdigo objeto (aunque aparezcan con
distinto identificador), utiliza slo una zona de memoria para todos los
cdigos objetos que accedan a ellas.
La optimizacin que hace el compilador al reunir todas las variables con el
mismo valor en la misma direccin de memoria puede confundir al
programador, por ejemplo si hacemos:
.literal4
A1: .long
A2: .long
A3: .long
A4: .long
0
0
0
0
0
0
0
0
Pg 37
MacProgramadores
Seccin
(__DATA,__data)
(__DATA,__static_data)
(__DATA,
__nl_symbol_pointer)
.lazy_symbol
_pointer
(__DATA,
__la_symbol_pointer)
.dyld
(__DATA,__dyld)
.const_data
(__DATA,__const)
Descripcin
Seccin de datos regular
Almacena datos estticos
El compilador guarda en
esta seccin punteros a
smbolos
non-lazy
(excepto punteros a
funciones)
El compilador guarda en
esta seccin punteros a
smbolos lazy.
Esta seccin se usa para
el
enlazado
con
funciones de libreras de
enlace
dinmico.
Nosotros no debemos
usarla.
Para almacenar datos
constantes en libreras
de enlace dinmico
Tabla 2.6: Directivas usadas para cada tipo de seccin del segmento de datos
Directiva
.comm etiqueta, tamao
MacProgramadores
Descripcin
Reserva tamao bytes y crea la etiqueta
global etiqueta que apunta a esta zona
de memoria sin inicializar.
Igual a .comm, slo que la etiqueta es de
mbito local, con lo que no es accesible
desde fuera del mdulo
Tabla 2.7: Directivas para reservar memoria en las secciones del segmento de datos
.text
; Ahora van las instrucciones en ensamblador
; en la seccin regular del segmento de cdigo
; (__TEXT,__text)
lwz r4,0(r9)
lwz r5,0(r11)
.comm D, 20 ; Reserva 20 bytes sin inicializar
; en la seccin (__DATA,__data)
; Mas instrucciones en la seccin regular
; del segmento de cdigo (__TEXT,__text)
mtlr r0
lmw r30,-8(r1)
Listado 2.4: Ejemplo de reserva de memoria
Pg 39
MacProgramadores
.const
.text
.const
Pg 40
MacProgramadores
SPARC
slo
se
permite
el
MacProgramadores
MacProgramadores
La razn por la que podemos indicar cualquiera de los registros menos el r0,
es que en la codificacin binaria de la instruccin, el cdigo 0 se utiliza para
indicar un 0 binario, y no el contenido del registro r0.
Luego ahora podemos usar la instruccin:
addis r2,0,hi16(expr)
Esta instruccin carga el valor de SIMM en r2, e inmediatamente despus
desplaza este valor a la derecha 16 posiciones, para cargar los 16 bits altos
de expr en el registro r2.
A continuacin tenemos que cargar los 16 bits bajos de expr en el registro,
para lo cual podemos usar la instruccin:
ori rA,rS,UIMM /* OR Immediate */
rA es el destino de la operacin
rS es uno de los operandos.
UIMM (Unsigned IMMediate) es el otro operando.
La operacin calcula el OR binario entre rS y 0000||UIMM y lo deposita en
rA.
Luego ahora ya podemos escribir las dos instrucciones que cargan una
direccin de memoria de 32 bits en un registro.
addis r2,0,hi16(expr)
ori r2,r2,lo16(expr)
An queda por ver cundo y cmo se usa ha16(), que lo vamos a ver en el
siguiente punto.
Pg 43
MacProgramadores
Pg 44
MacProgramadores
56
10 11
Opcode rD/rS
Codificacin de la instruccin
15 16
rA
d
15 16
Extensin de signo
rA=0?
31
No
GPR(rA)
GPR(rD/rS)
31
Direcin efectiva
Store
Load
Memoria principal
lbzu rD,d(rA)
lhz rD,d(rA)
Descripcin
(Load Byte and Zero) El byte en la direccin efectiva
d(rA) se carga en el byte bajo de rD, los dems
bytes de rD quedan a 0
(Load Byte and Zero with Update) Igual a lbz slo
que la direccin efectiva se guarda en rA una vez
realizada la operacin de carga
(Load Half-word and Zero) El half-word en la direccin
efectiva d(rA)se carga en los dos bytes bajos de rD,
los dems bytes de rD quedan a 0
Pg 45
lhzu rD,d(rA)
lha rD,d(rA)
lhau rD,d(rA)
lwz rD,d(rA)
lwzu rD,d(rA)
MacProgramadores
Instruccin
stb rS,d(rA)
stbu rS,d(rA)
sth rS,d(rA)
sthu rS,d(rA)
stw rS,d(rA)
stwu rS,d(rA)
Descripcin
(STore Byte) El byte menos significativo de rS se
guarda en la posicin de memoria dada por d(rA)
(STore Byte with Update) Igual a stb, slo que
despus de guardar el dato en memoria, en rA se
guarda la direccin efectiva calculada como d(rA)
(STore Half-word) El half-word menos significativo de
rS se guarda en la posicin de memoria dada por
d(rA)
(STore Half-word with Update) Igual a sth, slo que
despus de guardar el dato en memoria, en rA se
guarda la direccin efectiva calculada como d(rA)
(STore Word) El valor de rS se guarda en la posicin
de memoria dada por d(rA)
(STore Byte with Update) Igual a stw, slo que
despus de guardar el dato en memoria, en rA se
guarda la direccin efectiva calculada como d(rA)
Pg 46
MacProgramadores
4.4.2 Ejemplo
Como ejemplo el Listado 2.5 muestra un programa que calcula la suma de
dos nmeros almacenados en memoria, y deposita el resultado en una
tercera variable de memoria.
/* Descripcin: Programa que suma dos nmeros
*
situados en memoria
* Escrito por: Fernando Lpez Hernndez
*/
.data // Segmento de datos
SD:
.lcomm C,4 ; Reserva 4 bytes sin inicializar
.text // Segmento de cdigo
SC:
.const // Seccin (__TEXT,__const)
A:
.long 3
; Variable constante con el
; primer operando valiendo 3
B:
.long 5
; Variable constante con el
; segundo operando valiendo 5
.text // Seccin (__TEXT,__text)
.globl _main
.align 2
_main:
// Cargamos la direccin base del segmento
// de cdigo en r8
addis r8,0,hi16(SC)
ori r8,r8,lo16(SC)
// Cargamos la direccin base del seg de datos en r9
addis r9,0,hi16(SD)
ori r9,r9,lo16(SD)
// Cargamos A, B en r2 y r3
lwz r2,lo16(A-SC)(r8)
lwz r3,lo16(B-SC)(r8)
// Calculamos la suma en r4
add r4,r2,r3
// Guardamos el resultado que tenemos en r4 en C
stw r4,lo16(C-SD)(r9)
blr
Listado 2.5: Programa que calcula la suma de dos nmeros almacenados en memoria
Pg 47
MacProgramadores
Pg 48
MacProgramadores
addis r3,0,hi16(A)
ori r3,r3,lo16(A)-2
DESDE 1 HASTA 10
lhzu r2,2(r3)
; Procesamos r2
FIN_DESDE
MacProgramadores
MacProgramadores
MacProgramadores
56
10 11
Opcode rD/rS
Codificacin de la instruccin
15 16
rA
20 21
rB
subopcode
15 16
31
0
31
GPR(rB)
rA=0?
No
GPR(rA)
GPR(rS/rS)
Direcin efectiva
Store
Load
Memoria principal
Las instrucciones que usan este modo de indireccionamiento usan dos GPR
(llamados rA y rB) para calcular la direccin efectiva como la suma de estos.
A rA se le llama registro base, y a rB registro ndice. En concreto se
calcula como (rA|0)+rB, es decir, rA puede ser uno de los registros de r1
a r31 (pero no r0), o bien 0, en cuyo caso para calcular la direccin efectiva
se usa slo el valor de rB.
Las Tabla 2.10 y Tabla 2.11 muestran las principales instrucciones que usan
este modo.
Instruccin
lbzx rD,rA,rB
lbzux rD,rA,rB
lhzx rD,rA,rB
Descripcin
(Load Byte and Zero indeXed) El byte en la direccin
efectiva (rA|0)+rB se carga en el byte bajo de rD,
los dems bytes de rD quedan a 0
(Load Byte and Zero with Update indeXed) Igual a
lbzx slo que la direccin efectiva se guarda en rA
una vez realizada la operacin de carga
(Load Half-word and Zero indeXed) El half-word en la
direccin efectiva (rA|0)+rB se carga en los dos
bytes bajos de rD, los dems bytes de rD quedan a 0
Pg 52
lhzux rD,rA,rB
lhax rD,rA,rB
lhaux rD,rA,rB
lwzx rD,rA,rB
lwzux rD,rA,rB
MacProgramadores
Instruccin
stbx rS,rA,rB
stbux rS,rA,rB
sthx rS,rA,rB
sthux rS,rA,rB
stwx rS,rA,rB
stwux rS,rA,rB
Descripcin
(STore Byte indeXed) El byte menos significativo de
rS se guarda en la posicin de memoria dada por
(rA|0)+rB
(STore Byte with Update indeXed) Igual a stbx, slo
que despus de guardar el dato en memoria, en rA se
guarda la direccin efectiva calculada como
(rA|0)+rB
(STore Half-word indeXed) El half-word menos
significativo de rS se guarda en la posicin de
memoria dada por (rA|0)+rB
(STore Half-word with Update indeXed) Igual a sthx,
slo que despus de guardar el dato en memoria, en
rA se guarda la direccin efectiva calculada como
(rA|0)+rB
(STore Word indeXed) El valor de rS se guarda en la
posicin de memoria dada por (rA|0)+rB
(STore Byte with Update indeXed) Igual a stwx, slo
que despus de guardar el dato en memoria, en rA se
guarda la direccin efectiva calculada como
(rA|0)+rB
Pg 53
MacProgramadores
stmw rS,d(rA)
Descripcin
(Load Multiple Word) Carga los word almacenados a
partir de d(rA) en los registros que van desde r(D)
a r(D+n) siendo n=(31-D)
(STore Multiple Word) Guarda a partir de la direccin
de memoria d(rA) los valores de los registros que
van desde r(S) a r(S+n) siendo n=(31-S)
MacProgramadores
.const
A:
.long 3456 ; 20 enteros
.long -565
.long 1767
.text
addis r2,0,ha16(A)
lmw r11,A(r2)
La instruccin carga los registros que van de r11 a r31 con los 20 nmeros
del array A.
Si el registro usado para indireccionar (r2 en el ejemplo anterior) hubiera
estado dentro del rango rD..r31 se sobrescribe con el valor ledo de
memoria.
2) Instrucciones de carga y almacenamiento de mltiples bytes
(caracteres)
Estas instrucciones, al igual que antes, nos permiten leer un bloque de
memoria, pero a diferencia de antes:
o El nmero de bytes a leer no tiene porque ser mltiplo de 4
o La direccin de memoria donde empezamos a leer no tiene porque ser
mltiplo de 4
Las cuatro instrucciones de que disponemos aparecen en la Tabla 2.13:
Instruccin
lswi rD,rA,n
stswi rS,rA,n
lswx rD,rA,rB
stswi rS,rA,rB
Descripcin
(Load String Word Indirect) Carga los n primeros
bytes a partir de la direccin de memoria dada por
(rA|0) en los registros que van desde rD en
adelante
(Store String Word Indirect) Guarda a partir de la
direccin de memoria (rA|0) los n primeros bytes
empezando a contar por el byte ms significativo de
rD en adelante
(Load String Word indeXed) Carga los n=XER[25-31]
primeros bytes a partir de la direccin de memoria
dada por (rA|0)+rB en los registros que van desde
rD en adelante
(STore String Word indeXed) Guarda a partir de la
direccin de memoria (rA|0)+rB los n=XER[25-31]
primeros bytes empezando a contar por el byte ms
significativo de rS en adelante
MacProgramadores
4.6 Mnemonics
Para simplificar algunas operaciones de programacin el lenguaje
ensamblador de PowerPC define una serie de mnemonics2 (palabras fciles
de recordar) que son instrucciones que equivalen realmente a otra instruccin
ensamblador, pero que permiten recordar una operacin cuyo nombre no
evoca al propsito de la operacin que queremos realizar.
A lo largo del estudio de los distintos grupos de instrucciones ensamblador,
vamos a acabar con una seccin dedicada a los mnemonics que existen para
operaciones comunes.
El primer mnemonic que vamos a comentar es:
mr rD,rS
equivale a
or rD,rS,rS
MacProgramadores
equivale a
equivale a
addi rD,0,valor
addis rD,0,valor
MacProgramadores
numero = 1768937;
lis r2,ha16(numero)
addi r2,r2,lo16(numero)
En la que addi suma al valor ya guardado en r2 el valor de lo16(numero)
O bien esta otra:
numero = 1768937;
lis r2,hi16(numero)
ori r2,r2,lo16(numero)
En la que usamos hi16(numero) en vez de ha16(numero), con lo que
para cargar la parte baja usamos ori, que en vez de sumar pone los bits de
la parte baja.
El ltimo mnemonic que vamos a comentar de momento, es:
la rD,d(rA)
equivale a
addi rD,rA,d
.text
; En r2 obtenemos la direccin base del segmento
lis r2,ha16(A)
; Hacemos que r3 apunte a A, r4 apunte a B
; y r5 apunte a C
la r3,A(r2)
la r4,B(r2)
la r5,C(r2)
Pg 58
MacProgramadores
Instrucciones
Instrucciones
Instrucciones
Instrucciones
CR0
0
CR1
34
CR2
78
11 12
CR3
CR4
15 16
CR5
19 20
CR6
23 24
CR7
27 28
31
Pg 59
MacProgramadores
Pg 60
MacProgramadores
Descripcin
El primer operando es menor al segundo
El primer operando es mayor al segundo
Los operandos son iguales
Summary Overflow (SO). Hubo un overflow. Este bit es una copia del
estado final del bit XER[SO]
Tabla 2.14: Significado de los bits de los campos de CR en las instrucciones de comparacin
Pg 61
Bit
0
1
2
3
MacProgramadores
Descripcin
El registro destino ha recibido un valor negativo
El registro destino ha recibido un valor positivo
El registro destino ha recibido un cero
Summary Overflow (SO). Hubo un overflow. Este bit es una copia del
estado final del bit XER[SO]
Tabla 2.15: Significado de los bits del campo de CR0 en las instrucciones con enteros
acabadas en punto (.)
Descripcin
Floating-point
Floating-point
Floating-point
Floating-point
eXception (FX)
Enabled eXception (FEX)
inValid eXception (VX)
Overflow eXception (OX)
Tabla 2.16: Significado de los bits del campo de CR1 en las instrucciones en punto flotante
acabadas en punto (.)
Pg 62
MacProgramadores
SO OV CA
0
0 0000
0000
0000
0000
0000 0
Byte Count
24 25
31
Nombre
SO
OV
CA
3-24
25-31
Byte
count
Descripcin
Summary Overflow. Este bit se activa cada vez que una
instruccin produce un overflow, y queda activo hasta que
se desactiva explcitamente usando mtspr (indicando a XER
como registro a modificar) o mcrxr
Overflow. Indica que la ltima instruccin a producido un
overflow
Carry, Indica que la ltima instruccin a producido un
acarreo
Reservado. Siempre vale 0
Este campo muestra el nmero de bytes transferidos
durante la ejecucin de una instruccin lswx (Load String
Word indeXed) o stswx (Store String Word indeXed)
MacProgramadores
ori r4,r4,0xFFFF
and r3,r3,r4
; Aplicamos la mscara
mtspr 1,r3
; Modificamos XER
mtcrxr 0
; En CR0[CA],CR0[OV],CR0[SO] copiamos XER
Pg 64
MacProgramadores
addc rD,rA,rB
addc. rD,rA,rB
addco rD,rA,rB
addco. rD,rA,rB
adde rD,rA,rB
adde. rD,rA,rB
Descripcin
(ADD
Immediate)
Calcula
la
suma
de
(rA|0)+SIMM y la pone en rD.
(ADD Immediate Shift) Calcula la suma de
(rA|0)+(SIMM||0x0000) y la pone en rD
(ADD) La suma rA+rB se deposita en rD
(ADD) Igual que add, slo que CR0 se actualiza tal
como explicamos en el apartado 5.1
(ADD Overflow) Igual que add, slo que XER[OV]
se pone a 1 si hay overflow
(ADD Overflow) Igual que addo, slo que CR0 se
actualiza tal como explicamos en el apartado 5.1
(ADD Immediate Carrying) Igual que addi slo
que XER[CA] a se pone a 1 si hay acarreo
(ADD Immediate Carrying) Igual que addic slo
que CR0 se actualiza tal como explicamos en el
apartado 5.1
(ADD Carrying) Igual que add slo que XER[CA]
se pone a 1 si hay acarreo
(ADD Carrying) Igual que addc slo que CR0 se
actualiza tal como explicamos en el apartado 5.1
(ADD Carrying with Overflow) Igual que add slo
que si hay acarreo XER[CA] se pone a 1 y
XER[OV] se pone a 1
(ADD Carrying with Overflow) Igual que addco
slo CR0 se actualiza tal como explicamos en el
apartado 5.1
(ADD Extended) La suma rA+rB+XER[CA] se
pone en rD
(Add Extended) Igual que adde, slo que CR0 se
actualiza tal como explicamos en el apartado 5.1
Pg 65
addeo rD,rA,rB
addeo. rD,rA,rB
addme rD,rA
addme. rD,rA
addmeo rD,rA
addmeo. rD,rA
addze rD,rA
addze. rD,rA
addzeo rD,rA
addzeo. rD,rA
MacProgramadores
A todos los registros que reciben como operandos estas instrucciones se les
considera nmeros con signo.
En el Listado 2.7 aparece un programa llamado sumalong.s3 que suma dos
nmeros de 64 bits. Al tener los registros de PowerPC slo 32 bits tenemos
que usar dos registros para almacenar un nmero. Imaginemos que
En C de GNU para PowerPC el tipo long ocupa 32 bits, debiendo usarse long long para
su correspondiente tipo de 64 bits
Pg 66
MacProgramadores
Pg 67
de
de
de
de
la
la
la
la
variable
variable
variable
variable
A
A
B
B
MacProgramadores
lwz r4,lo16(B)(r10)
lwz r5,lo16(B+4)(r10)
// Calculamos la suma en r6||r7
addc r7,r3,r5
addeo r6,r2,r4
// Guardamos el resultado que tenemos en r6||r7 en C
lis r10,ha16(C)
stw r6,lo16(C)(r10)
stw r7,lo16(C+4)(r10)
blr
Listado 2.7: Programa que suma dos nmeros de 64 bits
r3
r4
r5
r6
r7
r8
r9
r10
addzeo r3
addo r11,r3,r7
addzeo r4
addc r12,r4,r8
addzeo r5
addc r13,r5,r9
addc r14,r6,r10
Figura 2.5: Uso de instrucciones que suman dos nmeros de 128 bits
Pg 68
MacProgramadores
Pg 69
A
A
A
A
B
B
B
B
MacProgramadores
subfc rD,rA,rB
subfc. rD,rA,rB
subfco rD,rA,rB
subfco. rD,rA,rB
Descripcin
(SUBtract From) Calcula rB-rA y lo deposita en
rD.
(SUBtract From) Igual que subf, slo que CR0 se
actualiza tal como explicamos en el apartado 5.1
(SUBtract From with Overflow) Igual que subf,
slo que XER[OV] se pone a 1 si hay overflow
(SUBtract From with Overflow) Igual que subfo,
slo que CR0 se actualiza tal como explicamos en
el apartado 5.1
(SUBtract From Carring with Overflow) Calcula rBrA y lo deposita en rD, y si hay acarreo pone
XER[CA] a 1
(SUBtract From Carring with Overflow) Igual que
subfc, slo que CR0 se actualiza tal como
explicamos en el apartado 5.1
(SUBtract From Carrying with Overflow) Igual que
subfc, slo que XER[OV] se pone a 1 si hay
overflow
(SUBtract From Carrying with Overflow) Igual que
subfco, slo que CR0 se actualiza tal como
explicamos en el apartado 5.1
Pg 70
subfe rD,rA,rB
subfe. rD,rA,rB
subfeo rD,rA,rB
subfeo. rD,rA,rB
subfme rD,rA,rB
subfme. rD,rA,rB
subfmeo rD,rA,rB
subfmeo. rD,rA,rB
subfze rD,rA,rB
subfze. rD,rA,rB
subfzeo rD,rA,rB
subfzeo. rD,rA,rB
MacProgramadores
(SUBtract
From
Extended)
Calcula
rBrA+XER[CA] y lo deposita en rD.
(SUBtract From Extended) Igual que subfe, slo
que CR0 se actualiza tal como explicamos en el
apartado 5.1
(SUBtract From Extended with Overflow) Igual que
subfe, slo que XER[OV] se pone a 1 si hay
overflow
(SUBtract From Extended with Overflow) Igual que
subfeo, slo que CR0 se actualiza tal como
explicamos en el apartado 5.1
(SUBtract From Minus one Extended) Calcula
~rA+XER[CA]+0xFFFFFFFF y lo deposita en rD.
(SUBtract From Minus one Extended) Igual que
subfme, slo que CR0 se actualiza tal como
explicamos en el apartado 5.1
(SUBtract From Minus one Extended with
Overflow) Igual que subfme, slo que XER[OV] se
pone a 1 si hay overflow
(SUBtract From Minus one Extended with
Overflow) Igual que subfmeo, slo que CR0 se
actualiza tal como explicamos en el apartado 5.1
(SUBtract
From
Zero
Extended)
Calcula
~rA+XER[CA] y lo deposita en rD.
(SUBtract From Zero Extended) Igual que subfze,
slo que CR0 se actualiza tal como explicamos en
el apartado 5.1
(SUBtract From Zero Extended with Overflow)
Igual que subfze, slo que XER[OV] se pone a 1
si hay overflow
(SUBtract From Zero Extended with Overflow)
Igual que subfzeo, slo que CR0 se actualiza tal
como explicamos en el apartado 5.1
Al igual que en la suma, a todos los registros que reciben como operandos
estas instrucciones se les considera nmeros con signo.
La operacin rB-rA tambin se puede escribir como rB+~rA+1, con lo que
podramos implementar una resta a base de sumas.
Aunque no hay ninguna operacin para la resta con un operando inmediato,
su efecto se puede conseguir con addi, con el operador inmediato negado.
Existen mnemonics para la resta que se describen en el apartado 5.7.1.
Pg 71
MacProgramadores
Descripcin
(NEGate) Calcula el complemento a 2 de rA y lo
deposita en rD, es decir, calcula ~rA+1
(NEGate) Igual que neg, slo que CR0 se actualiza
tal como explicamos en el apartado 5.1
(NEGate with Overflow) Igual que neg, slo que
XER[OV] se pone a 1 si hay overflow
(NEGate) Igual que nego, slo que CR0 se
actualiza tal como explicamos en el apartado 5.1
Pg 72
MacProgramadores
mulhw rH,rA,rB
mullw rL,rA,rB
Figura 2.6: Clculo del producto de dos nmeros de 32 bits usando instrucciones PowerPC
Instruccin
mulli rD,rA,SIMM
mullw rD,rA,rB
mullw. rD,rA,rB
mullwo rD,rA,rB
Descripcin
(MULtiply Low Immediate) Los 32 bits bajos del
producto rA*SIMM se depositan en rD.
(MULtiply Low Word) Calcula los 32 bits bajos de
rA*rB. Esta instruccin se puede combinar con
mulhw para calcular un producto completo, de 64
bits
(MULtiply Low Word) Igual que mullw, slo que
CR0 se actualiza tal como explicamos en el
apartado 5.1
(MULtiply Low Word with Overflow) Igual que
mullw, slo que XER[OV] se pone a 1 si hay
overflow
Pg 73
mullwo. rD,rA,rB
mulhw rd,rA,rB
mulhw. rD,rA,rB
mulhwo rD,rA,rB
mulhwo. rD,rA,rB
mulhwu rD,rA,rB
mulhwu. rD,rA,rB
MacProgramadores
divw. rD,rA,rB
divwo rD,rA,rB
divwo. rD,rA,rB
divwu rD,rA,rB
Descripcin
(DIVide Word) El dividendo es rA, el divisor es rB,
y el cociente se deposita en rD. La instruccin no
nos da el resto de la operacin.
(DIVide Word) Igual que divw, slo que CR0 se
actualiza tal como explicamos en el apartado 5.1
(DIVide Word with Overflow) Igual que divw, slo
que XER[OV] se pone a 1 si hay overflow
(DIVide Word with Overflow) Igual que divwo,
slo que CR0 se actualiza tal como explicamos en
el apartado 5.1
(DIVide Word Unsigned) Calcula la divisin con
nmeros sin signo. El dividendo es rA, el divisor
es rB, y el cociente se deposita en rD. La
Pg 74
divwu. rD,rA,rB
divwuo rD,rA,rB
divwuo. rD,rA,rB
MacProgramadores
Descripcin
(CoMPare Immediate) Compara como nmeros
con signo al nmero depositado en el registro
rA con el nmero SIMM con extensin de signo.
El resultado de la comparacin se deposita en
CRFD
cmp CRFD,L,rA,rB
(CoMPare) Compara rA y rB tratndolos como
nmeros con signo y el resultado lo deposita en
CRFD
cmpli CRFD,L,rA,UIMM (Compare Logical Immediate) El nmero
depositado en el registro rA se compara con el
nmero 0x0000||UIMM, tratando a los
operandos como nmeros sin signo. El resultado
de la comparacin se deposita en CRFD
cmpl CRFD,L,rA,rB
(CoMPare Logical) Compara a los nmeros
depositados en rA y rB como nmeros sin
signo. El resultado se deposita en CRFD
Tabla 2.23: Instrucciones de comparacin de enteros
Pg 75
MacProgramadores
Las instruccin cmpi recibe como operando un nmero con signo (SIMM) de
16 bits sobre el que realiza una extensin del signo a 32 bits, mientras que la
instruccin cmpli recibe como operando un nmero sin signo (UIMM) de 16
bits, sobre el que extiende los 16 bits altos rellenndolos con ceros.
Esto permite usar las instrucciones que reciben nmeros con signo (cmpi y
cmp) para comparaciones aritmticas, y las instrucciones que reciben
nmeros sin signo (cmpli y cmpl) para comparaciones lgicas.
Todas las instrucciones de comparacin permiten omitir el operando CRFD, en
cuyo caso el resultado se deposita en CR0. Por desgracia no podemos omitir
el campo L, que en las mquinas de 32 bits siempre debe valer 0.
Por ejemplo si queremos comparar como nmeros sin signo los registros r3 y
r4 y depositar el resultado de la comparacin en el campo 3 de CR haramos:
cmp 3,0,r3,r4
Si omitimos el campo CRFD el resultado se deposita el campo CR0:
cmp 0,r3,r4
Aunque L=0 lo hemos tenido que dar.
Descripcin
(AND Immediate) Realiza un and lgico entre rA y
0x0000||UIMM y lo deposita en rD
(AND Immediate Shifted) Realiza un and lgico
entre rA y UIMM||0x0000 y el resultado lo
deposita en rD
Pg 76
and rD,rA,rB
and. rD,rA,rB
andc rD,rA,rB
andc. rD,rA,rB
nand rD,rA,rB
MacProgramadores
orc. rD,rA,rB
nor rD,rA,rB
Descripcin
(OR Immediate) Realiza un or lgico entre rA y
0x0000||UIMM y lo deposita en rD
(OR Immediate Shifted) Realiza or lgico entre rA
y UIMM||0x0000 y el resultado lo deposita en rD
(OR) Realiza un or lgico entre rA y rB y el
resultado se deposita en rD
(OR) Igual que or, slo que CR0 se actualiza tal
como explicamos en el apartado 5.1
(OR with complement) Realiza un or lgico entre
rA y ~rB (complemento a 1 de rB) y el resultado
lo deposita en rD
(OR with Complement) Igual que orc, slo que
CR0 se actualiza tal como explicamos en el
apartado 5.1
(No OR) Al resultado del or lgico entre rA y rB
se le hace el complemento a 1 y se deposita en
rD, es decir, en rD se guarda ~(rA|rB)
Instruccin
xori rD,rA,UIMM
xoris rD,rA,UIMM
Descripcin
(eXclusive OR Immediate) Realiza un xor lgico
entre rA y 0x0000||UIMM y lo deposita en rD
(eXclusive OR Immediate Shifted) Realiza xor
lgico entre rA y UIMM||0x0000 y el resultado lo
deposita en rD
Pg 77
xor rD,rA,rB
xor. rD,rA,rB
eqv rD,rA,rB
extsb rD,rS
extsb. rD,rS
extsh rD,rS
extsh. rD,rS
cntlzw rD,rS
cntlzw. rD,rS
MacProgramadores
MacProgramadores
srw rD,rS,rC
srawi rD,rS,C
srawi. rD,rS,C
sraw rD,rS,rC
sraw. rD,rS,rC
Descripcin
(Shift Left Word) Desplaza a la izquierda los bits
de rS tantas veces como diga rC (que debe ser
un nmero comprendido entre 0 y 31), el
resultado se copia en rD
(Shift Right Word) Desplaza a la derecha los bits
de rS tantas veces como diga rC (que debe ser
un nmero comprendido entre 0 y 31), el
resultado se copia en rD
(Shift Right Algebraic Word Inmediate) Desplaza a
la derecha los bits de rS tantas veces como diga C
(que debe ser un nmero comprendido entre 0 y
31), al resultado se le extiende el bit de signo y se
copia en rD
(Shift Right Algebraic Word Inmediate) Igual que
srawi, slo que CR0 se actualiza tal como
explicamos en el apartado 5.1
(Shift Right Algebraic Word) Desplaza a la derecha
los bits de rS tantas veces como diga rC (que
debe ser un nmero comprendido entre 0 y 31), al
resultado se le extiende el bit de signo y se copia
en rD
(Shift Right Algebraic Word) Igual que sraw, slo
que CR0 se actualiza tal como explicamos en el
apartado 5.1
MacProgramadores
;
;
;
;
r3=0xFFFF0000
r2=0xFFFFF000
r2=0xFFFFFFFE
r2=0xFFFFFFFF
; r3=0xFFFF0000
; r2=0x0FFFF000
; r2=0x0001FFFE
; r2=0x0000FFFF
28
Pg 80
Instruccin
rlwinm rD,rS,N,MB,ME
rlwinm. rD,rS,N,MB,ME
rlwnm rD,rS,rN,MB,ME
rlwnm. rD,rS,rN,MB,ME
rlwimi rD,rD,N,MB,ME
rlwimi. rD,rD,N,MB,ME
MacProgramadores
Descripcin
(Rotate Left Word Immediate theN and with
Mask) El contenido de rS se rota a la
izquierda el nmero de veces especificado en
N. Se genera una mscara con unos desde el
bit MB hasta el bit ME, y lo dems con ceros.
Al resultado de la rotacin se le hace un and
binario con la mscara, y el resultado se
deposita en rD
(Rotate Left Word Immediate theN and with
Mask) Igual que rlwinm, slo que CR0 se
actualiza tal como explicamos en el apartado
5.1
(Rotate Left Word theN and with Mask) El
contenido de rS se rota a la izquierda el
nmero de veces especificado en los 5 bits
bajos de rN. Se genera una mscara con
unos desde el bit MB hasta el bit ME, y lo
dems con ceros. Al resultado de la rotacin
se le hace un and binario con la mscara, y el
resultado se deposita en rD
(Rotate Left Word theN and with Mask) Igual
que rlwnm, slo que CR0 se actualiza tal
como explicamos en el apartado 5.1
(Rotate Left Word Immediate then Mask
Insert) El contenido de rS se rota a la
izquierda tantas veces como diga N, del
resultado se insertan los bits indicados por los
unos de la mscara en sus respectivas
posiciones del registro rD, dejando los
anteriores bits con el valor anterior que
tuvieran en rD
(Rotate Left Word Immediate then Mask
Insert) Igual que rlwimi, slo que CR0 se
actualiza tal como explicamos en el apartado
5.1
Pg 81
MacProgramadores
Pg 82
MacProgramadores
5.7 Mnemonics
5.7.1 Mnemonics para la resta
Como decamos en el apartado 5.3.2, aunque no hay ninguna operacin para
resta con un operando inmediato, su efecto se puede conseguir con un
mnemonic que llame a addi. En la Tabla 2.29 se detallan que mnemonics
hay para la resta inmediata.
Mnemonic
subi rD,rA,SIMM
subi. rD,rA,SIMM
subis rD,rA,SIMM
subis. rD,rA,SIMM
subic rD,rA,SIMM
subic. rD,rA,SIMM
Equivalente a
addi rD,rA,-SIMM
addi. rD,rA,-SIMM
addis rD,rA,-SIMM
addis. rD,rA,-SIMM
addic rD,rA,-SIMM
addic. rD,rA,-SIMM
Por otro lado las operaciones de resta reciben los operandos de una forma
poco natural, ya que reciben primero el sustraendo y luego el minuendo,
cuando lo normal es recibirlos al revs. Para facilitar la comprensin del
programa se han creado mnemonics que reciben los operandos en el orden
inverso como muestra la Tabla 2.30.
Mnemonics
sub rD,rA,rB
Equivale a
subf rD,rB,rA
sub. rD,rA,rB
subf. rD,rB,rA
subo rD,rA,rB
subfo rD,rB,rA
subo. rD,rA,rB
subfo. rD,rB,rA
subc
subfc rD,rB,rA
subc.
rD,rA,rB
Pg 83
Descripcin
Calcula rA-rB y lo deposita en
rD
Igual que sub pero dejando el
CR0 el resultado de la
comparacin tal como se
explic en el apartado 5.1
Igual que sub slo que activa
el bit XER[OV] si hay overflow
Igual que subo pero dejando el
CR0 el resultado de la
comparacin tal como se
explic en el apartado 5.1
Calcula rA-rB y lo deposita en
rD, y si hay acarreo pone
XER[CA] a 1
Igual que sub. pero dejando el
CR0 el resultado de la
comparacin tal como se
explic en el apartado 5.1
subco
MacProgramadores
Mnemonic
cmpwi CRF,rA,SIMM
Equivalente a
cmpi CRF,0,rA,SIMM
cmpw CRF,rA,rB
cmplwi
CRF,rA,SIMM
cmplw CRF,rA,rB
cmpi CRF,0,rA,rB
cmpli CRF,0,rA,SIMM
cmpli CRF,0,rA,rB
Pg 84
MacProgramadores
Pg 85
MacProgramadores
Operacin
EXTract and Left
Justify Word
Immediate
EXTract and Right
Justify Word
Immediate
INSert from Left
Word Immediate
INSert from Right
Word Immediate
ROTate Left Word
Immediate
ROTate Right Word
Immediate
ROT Left Word
Mnemonic
extlwi rD,rS,n,b
(n>0)
Equivalente a
rlwinm rD,rS,b,0,n-1
extrwi rD,rS,n,b
(n>0)
rlwinm rD,rS,b+n,32n,31
inslwi rD,rS,n,b
(n>0)
insrwi rD,rS,n,b
(n>0)
rotlwi rD,rS,n
rlwimi rD,rS,32b,b,(b+n)-1
rlwimi rD,rS,32b+n,b,b+n-1
rlwinm rD,rS,n,0,31
rotrwi rD,rS,n
rlwinm rD,rS,32-n,0,31
rotlw rD,rS,rN
rlwnm rD,rS,rN,0,31
rlwlnm rD,rA,n,0,31-n
rlwlnm rDmrS,32-n,n,31
clrlwi rD,rS,n
(n<32)
clrrwi rD,rS,n
(n<32)
clrlslwi rD,rS,b,n
(nb31)
rlwinm rD,rS,0,n,31
rlwinm rD,rS,0,0,31-n
rlwinm rD,rS,n,b-n,31n
equivale a
equivale a
mtspr 1,rS
mfspr rD,1
nop
MacProgramadores
equivale a
or 0,0,0
equivale a
nor rD,rS,rS
Pg 87
MacProgramadores
el valor de a
? -1 : 0
? -a : a
(-a+1) : a
11111111
11111111
00000000
00000000
11111111
11111111
00000000
00000000
11111111
11111111
00000000
00000000
11111010
11111111 srawi r4,r3,31
00000101 xor r5,r4,r3
00000110 sub r6,r5,r4
Obsrvese que si a hubiera valido 6, r4 hubiera tenido todos sus bits a cero,
con lo que las operaciones xor y subf no hubieran afectado el valor de a
r3
r4
r5
r6
r5
r7
r7
=
=
=
=
=
=
=
a
b
r4-r3
(r4>r3)?0:-1
(r4>r3)?0:(r4-r3)
(r4>r3)?r3:r4
min(r3,r4)
Pg 88
MacProgramadores
r3
r4
r5
r6
r5
r7
r7
=
=
=
=
=
=
=
a
b
r4-r3
(r4>r3)?0:-1
(r4>r3)?(r4-r3):0
(r4>r3)?r4:r3
max(r3,r4)
Pg 89
MacProgramadores
Pg 90
MacProgramadores
d
3
3
-3
-3
c
2
-2
-2
2
r
1
-1
1
-1
Obsrvese que segn esta regla para el valor del resto que hemos dado
siempre se cumple la frmula n=d*c+r.
La nica operacin de divisin que puede producir un desbordamiento es 231/-1, ya que el nmero -231 en 32 bits se representa como 0x80000000,
mientras que el positivo ms grande que podemos representar en 32 bits es
231-1=0x7FFFFFFF. Si se produce este caso excepcional y la divisin la
hacemos usando divw el resultado es 0 (ya que no puede representar el
nmero), mientras que si la hacemos usando divwo el resultado es tambin
0 y activa el overflow.
A continuacin se muestra el algoritmo que nos permite calcular el resto de
una divisin suponiendo que conozcamos el cociente.
El algoritmo del clculo del resto en una divisin con signo se limita a aplicar
la frmula: n=d*c+r => r=n-d*c, y es el siguiente:
divw rT,rN,rD
mullw rT,rT,rD
sub rT,rN,rT
;
;
;
;
;
rN Dividendo
rD Divisor
c = n/d
c*d
r = n-c*d
MacProgramadores
En las divisiones de nmero sin signo el algoritmo es similar, slo que ahora
se usa divwu en vez de divw:
divwu rT,rN,rD
mullw rT,rT,rD
sub rT,rN,rT
;
;
;
;
;
rN Dividendo
rD Divisor
c = n/d
c*d
r = n-c*d
Pg 92
MacProgramadores
Pg 93
lis rM,0x6666
ori rM,rM,0x6667
mulhw rC,rM,rN
srawi rC,rC,1
srwi rT,rN,31
add rC,rC,rT
mulli rT,rC,5
sub rT,rN,rT
;
;
;
;
;
;
;
;
MacProgramadores
lis rM,0x9249
ori rM,rM,0x2493
mulhw rC,rM,rN
add rC,rC,rN
srawi rC,rC,2
srwi rT,rN,31
add rC,rC,rT
mulli rT,rC,7
sub rT,rN,rT
;
;
;
;
;
;
;
;
;
Pg 94
MacProgramadores
;
;
;
;
;
;
;
;
;
Este programa es el mismo que el de la divisin entre +7, excepto que usa el
multiplicador de signo opuesto, resta en vez de aadir, y desplaza c en vez
de n a la derecha 31 posiciones. (En el caso de d=+7 tambin podramos
desplazar c en vez de n 31 veces a la derecha, pero habra menos
paralelismo en el cdigo).
El magic number usado como multiplicador al dividir entre -d es casi siempre
el negativo de magic number de d, es decir, -m (p.e. para d=7, tenamos que
m=92492493, con lo que para d=-7 tenemos que
m=-1*92492493
=0x6DB6DB6D). Las nicas excepciones a esta regla son d=3 y
d=715.827.883
La Tabla 2.34 muestra los magic number y desplazamientos para los nmeros
ms comunes.
d (decimal)
-5
-3
-2k
1
2k
3
5
6
7
9
10
11
12
m (hexadecimal)
9999 9999
5555 5555
7FFF FFFF
8000 0001
5555 5556
6666 6666
2AAA AAAB
9249 2493
38E3 8E39
6666 6667
2E8B A2E9
2AAA AAAB
Pg 95
desplazamiento
1
1
k-1
k-1
0
1
0
2
1
2
1
1
25
125
MacProgramadores
51EB 851F
1062 4DD3
3
3
MacProgramadores
2,1
1,0
c,8
r,8
;
;
;
;
Dividendo
Divisor
Cociente
Resto
.text
.globl _main
Pg 97
MacProgramadores
_main:
// Cargamos el dividendo y divisor en los registros
// Para ello usamos lswi (Load String Word
// Immediate) que carga 32 bytes consecutivos en
// dvdl-dvsh
lis r2,ha16(n)
addi r2,r2,lo16(n)
lswi dvdh,r2,16
// Contamos el nmero de 0 a la izquierda
// del dividendo
cntlzw ceros_dvd,dvdh
cntlzw tmp1,dvdl
cmpwi cr0,dvdh,0
bne cr0,eti1
; Si (dvdh!=0) hay ceros_dvd ceros
addi ceros_dvd,tmp1,32 ; Si (dvdh==0)
; hay ceros_dvd=32+tmp1 ceros
eti1:
// Contamos el nmero de 0 a la izquierda del
divisor
cntlzw ceros_dvs,dvsh
cntlzw tmp1,dvsl
cmpwi cr0,dvsh,0
bne cr0,eti2
; Si (dvsh!=0) hay ceros_dvs ceros
addi ceros_dvs,tmp1,32 ; Si (dvsh==0)
; hay ceros_dvs=32+tmp1 ceros
eti2:
// Determina el desplazamiento necesario para
// minimizar el nmero de iteraciones
cmpw cr0,ceros_dvs,ceros_dvs
bgt cr0,eti9
; Si (dvs>dvd) cociente = 0
li rep,64
sub rep,rep,ceros_dvd ; Repeticiones del bucle de
; desplazamiento a la
; izquierda
// Desplazamos el dvd a la izquierda
// tantas veces como ceros a la izquierda tenga
// if (ceros_dvd>=32)
cmpwi ceros_dvd,32
blt eti3
; si (ceros_dvd<32) goto eti3
// (Cuerpo if) Copiamos dvdl en dvdh
// y desplazamos convenientemente
mr dvdh,dvdl
lis dvdl,0
subi ceros_dvd,ceros_dvd,32
slw dvdh,dvdh,ceros_dvd
b eti5
eti3:// (Cuerp else) Desplazamos a la izquierda
// ceros_dvd veces a dvdh:dvdl
cmpwi ceros_dvd,0
; Si (ceros_dvd==0) goto eti5
Pg 98
beq eti5
mtctr ceros_dvd
eti4:add dvdh,dvdh,dvdh
addc dvdl,dvdl,dvdl
MacProgramadores
;
;
;
;
;
;
addze dvdh,dvdh
bdnz eti4
eti5:// Empezamos el bucle de desplazamiento
lis coch,0
lis cocl,0
lis resh,0
lis resl,0
mtctr rep
; Fijamos contador del bucle
eti6:// 1. Desplazar la combinacin res:dvd 1 bit
// a la izquierda
addc dvdl,dvdl,dvdl
adde dvdh,dvdh,dvdh
adde resl,resl,resl
adde resh,resh,resh
// 2. Restar a res el divisor dvs. Esto calcula
// la resta parcial de la divisin.
lis tmp3,0
subc tmp1,resl,dvsl
subfe tmp2,dvsh,resh
subfe tmp3,tmp3,tmp3
cmpwi tmp3,0
beq eti7 ; Si(tmp3==0) => res>=dvs
// (res<dvs) 3. Si el resultado es negativo,
// no modificamos res
// y insertamos un cero en el bit bajo de coc
addc cocl,cocl,cocl
adde coch,coch,coch
b eti8
eti7:// (res>=dvs)
//4. Si el resultado es positivo ponemos el
// resultado en res y insertamos un uno en
// el bit bajo de coc
mr resl,tmp1
mr resh,tmp2
addc cocl,cocl,cocl
adde coch,coch,coch
ori cocl,cocl,1
eti8:// 5. Si el nmero de iteraciones es menor al
// ancho de dvd, volvemos al paso 1
bdnz eti6
b eti10
eti9:// Cociente==0 (dvs>dvd)
lis coch,0
Pg 99
MacProgramadores
lis cocl,0
mr resh,dvdh
mr resl,dvdl
eti10:// Guardamos los registros en memoria
// con stswi (Store String Word Immediate)
lis r2,ha16(c)
addi r2,r2,lo16(c)
stswi coch,r2,16
// Retornamos
blr
Listado 2.12: Divisin de 64 bits en mquinas de 32 bits
Pg 100
MacProgramadores
6 Instrucciones de bifurcacin
En esta seccin vamos a comentar con qu instrucciones de bifurcacin
cuenta PowerPC.
Las instrucciones de bifurcacin nos permiten alterar el flujo normal del
programa. Para ello alteran el valor del contador de programa. En PowerPC, a
diferencia de otras arquitecturas, nunca se puede hacer referencia explcita a
este registro, es decir, este registro no se puede leer en PowerPC, y slo se
puede modificar indirectamente al ejecutar instrucciones de bifurcacin. En
otros sistemas es muy tpico llamar a este registro PC (Program Counter) o IP
(Instruction Pointer). Nosotros vamos a referirnos a el como IP, aunque este
registro no tienen un nombre explcito en PowerPC, por no poder referirnos
dirctamenta a l.
Pg 101
MacProgramadores
Salto
Salto
Salto
Salto
Salto
Salto
relativo
absoluto
condicional
condicional
condicional
condicional
relativo
absoluto
al Link Register
al Count Register
bl D
Descripcin
(Branch) Salta a la direccin calculada como la
suma de D ms el valor actual del IP. Esta
instruccin tiene AA=0 y LK=0
(Branch then Link) Igual que b, slo que en el
registro LR se almacena la direccin de la
siguiente instruccin a la instruccin de salto. Esta
instruccin tiene AA=0 y LK=1
MacProgramadores
5 6
29 30 31
18
LI
AA LK
(Codificacin de la instruccin)
0
5 6
29 30 31
Exten signo
LI
0 0
31
+
IP (Instruction Pointer)
31
Direccin de salto
5 6
29 30 31
18
LI
AA LK
(Codificacin de la instruccin)
0
5 6
Exten signo
29 30 31
LI
0 0
31
Direccin de salto
Pg 103
MacProgramadores
Descripcin
(Branch Absolute) Salta a la direccin dada en D.
Esta instruccin tiene AA=1 y LK=0
(Branch then Link Absolute) Igual que ba, slo
que en el registro LR se almacena la direccin de
la siguiente instruccin a la instruccin de salto.
Esta instruccin tiene AA=1 y LK=1
bla D
fin: blr
5 6
OpCode
10 11
BO
15 16
29 30 31
BI
AA LK
Pg 104
BI
Dec Bin
0 00000
Bit CRn
a evaluar
CR0[0]
1 00001
CR0[1]
2 00010
CR0[2]
3 00011
CR0[3]
4
5
6
7
8
12
16
20
24
28
9
13
17
21
25
29
10
14
18
22
26
30
11
15
19
23
27
31
00100
00101
00110
00111
01000
01100
10000
10100
11000
11100
01001
01101
10001
10101
11001
11101
01010
01110
10010
10110
11010
11110
01011
01111
10011
10111
11011
11111
CR1[0]
CR1[1]
CR1[2]
CR1[3]
CRn[0]
MacProgramadores
Descripcin
Negative (LT). El resultado de una instruccin con
punto (.) es negativo
Positive (GT). El resultado de una instruccin con
punto (.) es positivo
Zero (EQ). El resultado de una instruccin con
punto (.) es cero
Summary Overflow (SO). Copia del bit XER[SO]
de la anterior instruccin ejecutada
Copia de FPSCR[FX]
Copia de FPSCR[FEX]
Copia de FPSCR[VX]
Copia de FPSCR[OX]
Menor que:
Para enteros rA<SIMM o rA<UIMM o rA<rB
Para punto flotante fA<fB
CRn[1]
Mayor que:
Para enteros rA>SIMM o rA>UIMM o rA>rB
Para punto flotante fA>fB
CRn[2]
Igual:
Para enteros rA=SIMM o rA=UIMM o rA=rB
Para punto flotante fA=fB
CRn[3]
Pg 105
MacProgramadores
Descripcin
Decrementa el registro CTR y despus salta si CTR0
es FALSE
Decrementa el registro CTR y despus salta si CTR=0
es FALSE
Salta si la condicin es FALSE
Decrementa el registro CTR y despus salta si CTR0
es TRUE
Decrementa el registro CTR y despus salta si CTR=0
es TRUE
Salta si la condicin es TRUE
Decrementa el registro CTR y despus salta si CTR0
Decrementa el registro CTR y despus salta si CTR=0
Salta siempre
y la condicin
y la condicin
y la condicin
y la condicin
Pg 106
MacProgramadores
5 6
16
10 11
B0
15 16
29 30 31
BI
BD
AA LK
(Codificacin de la instruccin)
Cumple
condicin?
15 16
Extensin del signo
No
29 30 31
BD
0
31
AA LK
31
Siguiente instruccin
0
31
Direccin de salto
Pg 107
Instruccin
bc BO,BI,D
bcl BO,BI,D
MacProgramadores
Descripcin
(Branch Conditional) Si se cumplen las condiciones dadas
por BI y BO salta a la direccin calculada como la suma de
D ms el valor actual del IP. Esta instruccin tiene AA=0 y
LK=0
(Branch Conditional then Link) Igual que bc, slo que en
el registro LR se almacena la direccin de la siguiente
instruccin a la instruccin de salto. Esta instruccin tiene
AA=0 y LK=1
Por ejemplo, imaginemos que queremos hacer una operacin slo si el valor
del registro r2 es menor a 5, entonces haramos:
cmpwi r2,5
bc 12,0,fin
; Hacemos la operacin que sea
bcla BO,BI,D
Descripcin
(Branch Conditional Absolute) Si se cumplen las
condiciones dadas por BI y BO salta a la direccin dada en
D. Esta instruccin tiene AA=0 y LK=0
(Branch Conditional then Link Absolute) Igual que bca,
slo que en el registro LR se almacena la direccin de la
siguiente instruccin a la instruccin de salto. Esta
instruccin tiene AA=0 y LK=1
MacProgramadores
5 6
16
10 11
B0
15 16
29 30 31
BI
BD
AA LK
(Codificacin de la instruccin)
Cumple
condicin?
15 16
No
29 30 31
BD
AA LK
31
Siguiente instruccin
0
31
Direccin de salto
Pg 109
MacProgramadores
5 6
19
10 11
B0
15 16
BI
20 21
0000
29 30 31
528
LK
(Codificacin de la instruccin)
Cumple
condicin?
No
29
CTR (CounT Register)
30 31
31
||
Siguiente instruccin
00
31
Direccin de salto
Instruccin
bcctr BO,BI
bcctrl BO,BI
Descripcin
(Branch Conditional to CounT Register) Salta a la
direccin de memoria almacenada en el CTR. Esta
instruccin tiene LK=0
(Branch Conditional to CounT Register then Link)
Igual que bcctr slo que almacena en el LR la
direccin de la siguiente instruccin a la
instruccin de salto. Esta instruccin tiene LK=1
Pg 110
MacProgramadores
Queda por ver cmo se trata otro problema, que es el problema de que una
llamada a una subrutina llame a su vez a otra subrutina guardando esta
tambin en LR la direccin de retorno, y borrando la anterior direccin. Como
explicaremos en el apartado 8, la solucin est en guardar el valor de LR en
la pila antes de llamar a otra funcin. Las instrucciones que vamos a ver
ahora son las que nos permiten retornar de la llamada.
La Figura 2.13 muestra el funcionamiento de este tipo de instrucciones. stas
tambin tienen el bit LK con el significado habitual de guardar el valor de la
siguiente instruccin a la de salto en LR, lo cual se hace cuando este bit est
a 1. En la prctica esta opcin no se usa cuando retornamos de una subrutina
ya que en ese caso no solemos guardar la direccin de la siguiente instruccin
al retorno. Sin embargo esta opcin se puede usar si ponemos en LR la
direccin de una subrutina a la que queremos llamar.
0
5 6
19
10 11
B0
15 16
BI
20 21
29 30 31
0000
16
LK
(Codificacin de la instruccin)
Cumple
condicin?
No
29
LR (Link Register)
30 31
31
||
Siguiente instruccin
00
31
Direccin de salto
bclrl BO,BI
Descripcin
(Branch Conditional to Link Register) Si se
cumplen las condiciones dadas por BI y BO salta a
la direccin dada en el registro LR. Esta
instruccin tiene LK=0
(Branch Conditional to Link Register then Link)
Igual que bclr, slo que en el registro LR se
Pg 111
MacProgramadores
6.2 Mnemonics
Vamos a empezar con mnemonics tpicos para las operaciones de bifurcacin.
bctr
bctrl
Descripcin
(Branch to LR) Salta a la direccin de
memoria almacenada en el registro LR
(Branch to LR and Link) Igual que blr slo
que en LR se almacena la direccin de
memoria de la siguiente instruccin a la
instruccin de salto.
(Branch to CTR) Salta a la direccin de
memoria almacenada en el registro CTR
(Branch to CTR and Link) Igual que bctr
slo que en LR se almacena la direccin de
memoria de la siguiente instruccin a la
instruccin de salto.
Equivale a
bclr 20,0
bclrl 20,0
bcctr 20,0
bcctrl 20,0
Pg 112
MacProgramadores
bc
bt
bf
bc
btl
bfl
Estos mnemonics no reciben el operando BO, pero s que tienen que recibir 2
operandos:
o El operando BI con la condicin a evaluar
o La direccin de salto si se cumple la condicin
Es decir, estas instrucciones tienen la forma:
MNEMONIC BI, ETIQUETA
Por ejemplo podemos hacer:
cmpwi cr5,r3,0
bf 22,fin
Que significa que no salte si CR5 tiene el bit de igualdad activo, es decir, si la
comparacin anterior concluy que r3 vala 0. Vase el apartado 6.1.3 para
una mejor descripcin del operando BI.
Para simplificar la codificacin del operando BI se han creado una serie de
smbolos tal como describe la siguiente Tabla 2.47.
Smbolo Valor Descripcin
lt
0
Less Than
gt
1
Greater Than
eq
2
EQual
so
3
Summary Overflow
un
3
UNordered
Tabla 2.47: Smbolos para el operando BI
Pg 113
MacProgramadores
MacProgramadores
bnsl
bunl
bnul
bnsla
bunla
bnula
bnslrl
bunlrl
bnulrl
bnsctrl
bunctrl
bnuctrl
Descripcin
Less Than
Less than or Equal
EQual
Greater than or Equal
Greater Than
Not Less
Not Equal
Not Greater than
Summary Overflow
Not Summary Overflow
UNordered (para comparaciones en punto flotante)
Not Unordered (para comparaciones en punto flotante)
Obsrvese que las instrucciones que actualizan LR se escriben igual que las
que no lo actualizan, pero se las aade una l al final. La excepcin esta en
las instrucciones de tipo bcla donde la l se pone antes de la ltima a. Por
ejemplo, en vez de poner bleal se pone blela.
Todas estas instrucciones reciben como primer operando el campo de CR a
comprobar, y como segundo operando la direccin de salto. El primero de los
operandos se puede omitir, en cuyo caso se supone que es el CR0.
Es decir el formato general de estos mnemonics es:
MNEMONIC [CRF,] ETIQUETA
Para indicar el campo de CR a comprobar se puede usar su valor numrico o
bien uno de los mnemonics definidos en la tabla del apartado 5.7.2.
Por ejemplo, si queremos hacer algo slo cuando en r3 haya un nmero
menor de 0 haramos:
cmpwi cr2,r3,0
bge cr2,fin
; Hacer algo
Pg 115
MacProgramadores
Descripcin
(Move From CTR) Copia el contenido de CTR en rD
(Move to CTR) Copia el contenido de rS en CTR
(Move From LR) Copia el contendo de LR en rD
(Move To LR) Copia el contenido de rS en CTR
Descripcin
CR SET
CR CLeaR
CR MOVE
CR NOT
Equivalente a
creqv B,B,B
crxor B,B,B
cror B1,B2,B2
crnor B1,B2,B2
MacProgramadores
if:
; Hacer esto
b fin_if
else_if:
beq else
; Hacer lo otro
b fin_if
else:
; Hacer lo de ms all
fin_if:
MacProgramadores
fuera:
Tambin lo podemos implementar como un test de rango as:
lis r2,ha16(segmento) ; r2 base del segmento
lwz r3,lo16(x)(r2)
; Cargamos x en r3
subi r4,r3,10 ; r4 = r3-10
cmpli cr3,r4,5 ; Comparacin lgica (r4,5)
Pg 118
MacProgramadores
fuera:
El test de rango es especialmente til cuando, como en el ejemplo anterior,
todos los valores en un determinado rango ejecutan el mismo cdigo.
Obsrvese que cmpli comprueba tanto la condicin r4<0 como r4>5 ya
que, como estamos haciendo una comparacin lgica (sin signo), si se
cumpliera que r4<0 entonces r4 sera negativo y su primer bit sera 1, con lo
que r4 sera considerado un nmero muy grande.
Una tercera forma de hacer esta comparacin es usando una tabla de salto,
en la cual tenemos guardadas las direcciones a las que hay que saltar para
cada caso.
Por ejemplo para codificar un switch as:
switch (x)
{
case 0:
// Cdigo del caso
case 1:
// Cdigo del caso
case 2:
// Cdigo del caso
case 3:
// Cdigo del caso
case 4:
// Cdigo del caso
case 5:
// Cdigo del caso
0
1
2
3
4
5
Pg 119
MacProgramadores
tabla contiene las direcciones a las que hay que saltar en cada caso, lo cual
es especialmente til cuando todos los casos son valores consecutivos que
saltan a direcciones distintas.
Equivale a
bc
bca
bclr
Condicin de salto
bdnzl
bdnzla
bdnzlrl
Decrementa CTR y salta si CTR0
Decrementa CTR y salta si CTR0 y la bdnztl bdnztla bdnztlrl
condicin es true
Pg 120
Decrementa CTR
condicin es false
Decrementa CTR y
Decrementa CTR
condicin es true
Decrementa CTR
condicin es false
MacProgramadores
bdzl
bdztl
bdzla
bdztla
bdzlrl
bdztlrl
y salta si CTR=0 y la
bdzfl
bdzfla
bdzflrl
La Tabla 2.55 ayuda a recordar las abreviaturas usadas por estos mnemonics:
Abreviatura
t
f
d
z
nz
Descripcin
True
False
Decrement
Zero
Not Zero
Todos estos mnemonics actan sobre el registro CTR y slo reciben como
operando la direccin a la que saltar, es decir, tienen la forma:
MNEMONIC ETIQUETA
A continuacin vamos a poner ejemplos de cmo se usan estos mnemonics
para cada uno de los bucles de C.
MacProgramadores
;
;
;
;
;
;
;
r2 es el acumulador
r3 es el contador
Numero de repeticiones
Carga el CTR
r2 += r3
r3++
Hasta que CTR llege a 0
MacProgramadores
for (inicializacin;condicin;actualizacin)
{
cuerpo
}
Los cuales se detallan en la Figura 2.14:
Inicializacin
Actualizacin
Condicin
No
Fin
Cuerpo
Pg 123
.data
SD: .comm esprimo, 4
n:
.long 13
MacProgramadores
.text
.globl _main
_main:
lis r2,ha16(SD)
Pg 124
Instruccin
crand CRBD,CRBA,CRBB
cror CRBD,CRBA,CRBB
crxor CRBD,CRBA,CRBB
crnand CRBD,CRBA,CRBB
crnor CRBD,CRBA,CRBB
creqv CRBD,CRBA,CRBB
crandc CRBD,CRBA,CRBB
crorc CRBD,CRBA,CRBB
mcrf CRD,CRS
MacProgramadores
Descripcin
Al bit de la posicin CRBA se le hace un and
binario con el bit de la posicin CRBB y el
resultado se almacena en el bit CRBD
Al bit de la posicin CRBA se le hace un or
binario con el bit de la posicin CRBB y el
resultado se almacena en el bit CRBD
Al bit de la posicin CRBA se le hace un xor
binario con el bit de la posicin CRBB y el
resultado se almacena en el bit CRBD
Al bit de la posicin CRBA se le hace un nand
binario con el bit de la posicin CRBB y el
resultado se almacena en el bit CRBD
Al bit de la posicin CRBA se le hace un nor
binario con el bit de la posicin CRBB y el
resultado se almacena en el bit CRBD
Al bit de la posicin CRBA se le hace un xor
binario con el bit de la posicin CRBB y el
complemento a 1 del resultado se almacena
en el bit CRBD
Al bit de la posicin CRBA se le hace un and
binario con el bit de la posicin CRBB y el
complemento a 1 del resultado se almacena
en el bit CRBD
Al bit de la posicin CRBA se le hace un or
binario con el bit de la posicin CRBB y el
complemento a 1 del resultado se almacena
en el bit CRBD
Los 4 bits del campo CRS se copian en el
campo CRD
MacProgramadores
cmpwi cr2,rA,5
cmpwi cr3,rB,3
crand 17,9,13
bng cr4,fin
; Haz algo
fin:
Hay que tener en cuenta que crand opera a nivel de bit de CR, no a nivel de
campo de CR, con lo que tenemos que decirle que bits origen leer y en que
bit destino depositarlo.
Como los bits de CR estn ordenados como muestra la Figura 2.3, si las
comparaciones las depositamos en los campos CR2 y CR3, el bit que indica si
se cumple la condicin mayor que es el segundo de los 4 bits del campo,
luego tendremos que leer los bits 9 y 13. Para depositar el resultado en CR4
debemos depositarlo tambin en el segundo bit de CR4 que es el bit 17.
Por ltimo, bng comprueba si cr4 contiene la condicin mayor que en cuyo
caso significa que cr2 y cr3 tambin cumplan la condicin.
Pg 126
MacProgramadores
7.1 Introduccin
La arquitectura de PowerPC dispone de un procesador de nmeros en punto
flotante que cumple estrictamente con el estndar IEEE 754. El procesador
soporta directamente un subconjunto de las operaciones descritas en el IEEE
754 debindose implementar las dems operaciones por software.
Respecto a los formatos de tipos de datos, PowerPC soporta slo los tipos
simple y doble. El tipo doble extendido no lo soporta PowerPC directamente
debindose implementar el trabajo con nmeros en este formato por
software.
El procesador de PowerPC tiene como tipo de dato por defecto los
en formato doble, lo cual significa que a no ser que se lo
explcitamente todos los clculos y los resultados se obtienen sobre
tipo doble. Aun as el procesador dispone de instrucciones para
entre representaciones simple y doble, as como de operaciones
permiten trabajar directamente con datos en formatos simple.
nmeros
pidamos
datos de
convertir
que nos
MacProgramadores
34
78
11 12
15 16
Flags de
exception
invlida
Flags de
summary
exception
Flags de
exception
19 20
23 24
Flags de
habilitacin
de excepcin
Cdigos de
condicin
27 28
31
Bits de
redondeo
Pg 128
Campo Bit
0
MacProgramadores
Nombre Descripcin
FX
FEX
VX
OX
UX
ZX
XX
VXSNAN
VXISI
VXIDI
10
VXZDZ
11
VXIMZ
12
VXVC
13
FR
Bit
retenido
S
No
No
S
S
S
S
S
S
S
S
S
No
14
FI
15
FPRF
16
17
18
19
20
21
VXSOFT
22
VXSQRT
23
VXCVI
24
VE
25
OE
26
UE
27
ZE
28
29
XE
NI
MacProgramadores
No
No
No
No
No
No
S
S
S
-
30
31
RN
MacProgramadores
mtfsf FM,fD
mtfsf. FM,fD
mtcrfs CRFD,FS
mtfsfi FD,UIMM
mtfsfi. CRFD,UIMM
mtfsb0 BD
mtfsb0. BD
Descripcin
Nivel
acceso
(Move From FPSCR) El contenido de Registro
FPSCR se deposita en los bits 32-63
de fD. El contenido de los bits 0-31
de fD queda indefinido.
(Move To FPSCR Fields) Los bits 32- Registro
63 del registro fD se copian al
registro FPSCR bajo el control de la
mscara de campos FM, la cual
indica que campos se deben copiar.
FM puede tener hasta 8 bits de los
cuales los activos indican los
campos a copiar.
(Move To CR from FPSCR) El Campo
contenido del campo FS del registro
FPSCR se copia en el campo CRFD
del registro CR. Todos los bits de
excepcin copiados (excepto FEX y
VX) son borrados en FPSCR
(Move To FPSCR Field Immediate) El Campo
contenido de UIMM se deposita en el
campo FD
(Move To FPSCR Bit 0) El bit de la Bit
posicin BD del registro FPSCR es
Pg 131
mtfsb1 BD
mtfsb1. BD
MacProgramadores
Como es habitual, las instrucciones de la Tabla 2.58 que llevan punto (.)
producen una actualizacin del registro CR.
Pg 132
MacProgramadores
Redondeo?
FI <- 0
FR <- 0
FI <- 1
Fracin
incrementada?
FR <- 1
FR <- 0
7.3.2.1
Para que se activen los flags de excepcin debemos de habilitar los llamados
flags de habilitacin de excepcin, de los cuales hay uno para cada tipo
principal, tal como muestra la Tabla 2.59:
Flag
VE
OE
UE
ZE
XE
Pg 133
7.3.2.2
MacProgramadores
Pg 134
Result Flags
(Bits 15-19)
C
< >
0
0
0
=
0
?
1
MacProgramadores
Resultado para
una comparacin
Resultado para
otra operacin
No aplicable
0
0
0
0
0
1
0
0
0
1
1
0
0
1
1
0
0
0
1
0
0
0
0
0
0
0
1
0
1
1
1
1
0
0
0
1
1
0
0
0
Sin relacin de
orden
== (Igual)
> (Mayor que)
No aplicable
< (Menor que)
No aplicable
Sin relacin de
orden
== (Igual)
> (Mayor que)
+0
Nmero normalizado positivo
+
Nmero normalizado negativo
-
Quiet NaN
-0
Nmero denormalizado
positivo
Nmero denormalizado
negativo
;
;
;
;
;
;
;
;
;
beq 3,cero
b normal
infinito:
bt 11,NaN
; f0 es infinito
NaN:
; f0 es NaN
cero:
; f0 es 0
normal:
bt 11,denormal
;
;
;
;
; f0 es un nmero
MacProgramadores
denormal:
; f0 es un nmero denormalizado
En el programa pasamos los bits FPSCR[15-19] al registro CR para comprobar
su valor y decidir la clase del resultado de la suma de acuerdo a la tabla
anterior.
Bit 31
0
1
0
1
Modo redondeo
Al ms cercano
A cero
A +
A -
7.4 El registro CR
Si usamos las instrucciones con punto (.), el resultado de su ejecucin
adems de almacenarse en el registro FPSCR se almacena en el campo CR1
del registro CR. Despus podemos comprobar este campo para obtener
informacin sobre el valor obtenido.
La Tabla 2.62 muestra cules son los bits del registro FPSCR que se copian al
registro CR en caso de usar instrucciones con punto.
Bit
4
5
6
7
Descripcin
Contiene el valor del bit FX del registro FPSCR que indica que alguna
excepcin se ha producido
Contiene el valor del bit FEX del registro FPSCR que indica que
alguna excepcin para la que su flag de habilitacin de excepcin
estaba encendido se ha producido
Contiene el valor del bit VX del registro FPSCR que indica que alguna
invalid exception se ha producido
Contiene el valor del bit OX del registro FPSCR que indica que se ha
producido un desbordamiento
El valor del campo CR1 del registro CR se puede consultar tras ejecutar una
instruccin para ver si se ha producido una excepcin de la siguiente manera:
Pg 136
MacProgramadores
fadd. f0,f1,f2
bt 5,excepcion ; Si FEX est activo
; No ha habido excepcion
excepcion:
mcrfs 2,1
; Copia FPSCR[4-7] a CR2
bt 6,invalid
; Miramos los bits de CR para ver que
bt 7,overflow ; tipo de excepcin se ha producido
bt 8,underflow
bt 9,divbyzero
bt 10,inexact
invalid:
mcrfs 2,2
; Copia FPSCR[8-11] a CR2
mcrfs 3,3
; Copia FPSCR[12-15] a CR3
mcrfs 4,5
; Copia FPSCR[20-23] a CR4
; Ahora podemos saber el tipo exacto de invalid
; operation en base al flag de excepcin invalid
; operation que est activo
overflow:
; Se ha producido un overflow
underflow:
; Se ha producido un underflow
divbyzero:
; Se ha intentado dividr entre cero
inexact:
; Redondeo inexacto
Pg 137
MacProgramadores
Pg 138
MacProgramadores
lfsu fD,d(rA)
lfd fD,d(rA)
lfdu fD,d(rA)
Descripcin
(Load Floating-point Single) El word en la direccin de
memoria d(rA) se interpreta como un nmero en
punto flotante de precisin simple, y se carga en fD
convertido a punto flotante de precisin doble
(Load Floating-point Single with Update) Igual a lfs,
slo que rA se actualiza con el valor de d(rA)
despus de leer la memoria
(Load Floating-point Double) El doble-word en la
direccin de memoria d(rA) se carga en fD
(Load Floating-point Double with Update) Igual a
lfd, slo que rA se actualiza con el valor de d(rA)
despus de leer la memoria
Instruccin
sfs fD,d(rA)
sfsu fD,d(rA)
sfd fD,d(rA)
sfdu fD,d(rA)
Descripcin
(Store Floating-point Single) El contenido de fD se
convierte a precisin simple y se guarda en el word de
la direccin de memoria apuntada por d(rA)
(Store Floating-point Single with Update) Igual a sfs,
slo que rA se actualiza con el valor de d(rA)
despus de escribir la memoria
(Store Floating-point Double) El contenido de fD se
guarda en memoria, en el doble-word apuntado por
d(rA)
(Store Floating-point Double with Update) Igual a
sfd, slo que rA se actualiza con el valor de d(rA)
despus de escribir la memoria
Descripcin
(Load Floating-point Single indeXed) El word en la
direccin de memoria (rA|0)+rB se interpreta como
un nmero en punto flotante de precisin simple, y se
Pg 139
lfsux fD,rA,rB
lfdx fD,rA,rB
lfdux fD,rA,rB
MacProgramadores
Instruccin
sfsx fD,rA,rB
sfsux fD,rA,rB
sfdx fD,rA,rB
sfdux fD,rA,rB
Descripcin
(Store Floating-point Single indeXed) El contenido de
fD se convierte a precisin simple y se guarda en el
word de la direccin de memoria apuntada por
(rA|0)+rB
(Store Floating-point Single with Update indeXed)
Igual a sfsx, slo que rA se actualiza con el valor de
(rA|0)+rB despus de escribir la memoria
(Store Floating-point Double indeXed) El contenido de
fD se guarda en memoria, en el doble-word apuntado
por (rA|0)+rB
(Store Floating-point Double with Update indeXed)
Igual a sfdx, slo que rA se actualiza con el valor de
(rA|0)+rB despus de escribir la memoria
Suma
Resta
Multiplicacin
Multiplicacin-suma
Divisin
Raz cuadrada (opcional)
Redondeo a entero (opcional)
Pg 140
MacProgramadores
Las dos ltimas son operaciones opcionales, lo que significa que no todos los
micros las poseen, debemos de consultar el manual del microprocesador para
ver si la soporta.
La operacin de multiplicacin-suma se proporciona con el fin de poder
realizar operaciones de multiplicacin seguidas de una suma con un nico
redondeo, lo cual proporciona ms precisin que hacer dos redondeos.
La Tabla 2.68 describe ms concretamente las instrucciones:
Instruccin
fadd fD,fA,fB
fadd. fD,fA,fB
fadds fD,fA,fB
fadds. fD,fA,fB
fsub fD,fA,fB
fsub. fD,fA,fB
fsubs fD,fA,fB
fsubs. fD,fA,fB
fmul fD,fA,fB
fmul. fD,fA,fB
fmuls fD,fA,fB
fmuls. fD,fA,fB
fmadd fD,fA,fB,fC
fmadd. fD,fA,fB,fC
fmadds fD,fA,fB,fC
fmadds. fD,fA,fB,fC
fmsub fD,fA,fB,fC
fmsub. fD,fA,fB,fC
fmsubs fD,fA,fB,fC
fmsubs. fD,fA,fB,fC
fnmadd fD,fA,fB,fC
fnmadd. fD,fA,fB,fC
fnmadds fD,fA,fB,fC
fnmadds. fD,fA,fB,fC
fnmsub fD,fA,fB,fC
fnmsub. fD,fA,fB,fC
fnmsubs fD,fA,fB,fC
fnmsubs. fD,fA,fB,fC
fdiv fD,fA,fB
fdiv. fD,fA,fB
fdivs fD,fA,fB
fdivs. fD,fA,fB
Descripcin
(Floating Add) En fD obtenemos la
suma fA+fB
(Floating Add Single) En fD
obtenemos la suma fA+fB
(Floating Substract) En fD obtenemos
el valor de fA-fB
(Floating Sustract Single) En fD
obtenemos el valor de fA-fB
(Floating Multiply) En fD obtenemos
el producto fA*fB
(Floating Multiply Single) En fD
obtenemos el producto fA*fB
(Floating Multiply-Add) En fD
obtenemos fA*fB+fC
(Floating Multiply-Add Single) En fD
obtenemos fA*fB+fC
(Floating Multiply-Substract) En fD
obtenemos fA*fB-fC
(Floating Multiply-Subtract Single) En
fD obtenemos fA*fB-fC
(Floating Negative Multiply-Add) En
fD obtenemos -(fA*fB+fC)
(Floating Negative Multiply-Add
Single) En fD obtenemos (fA*fB+fC)
(Floating Negative Multiply-Substract)
En fD obtenemos -(fA*fB-fC)
(Floating Negative Multiply-Subtract
Single) En fD obtenemos -(fA*fBfC)
(Floating Divide) en fD obtenemos el
resultado de dividir fA/fB.
(Floating Divide Single) en fD
obtenemos el resultado de dividir
Pg 141
Precisin
Doble
Simple
Doble
Simple
Doble
Simple
Doble
Simple
Doble
Simple
Doble
Simple
Doble
Simple
Doble
Simple
fsqrt fD,fS
fsqrt. fD,fS
fsqrts fD,fS
fsqrts. fD,fS
fres fD,fS
fres. fD,fS
frsqrte fD,fS
frsqrte. fD,fS
fsel fD,fA,fB,fC
fsel. fD,fA,fB,fC
MacProgramadores
fA/fB
(Floating SQuare RooT) en fD
obtenemos la raz cuadrada de fS.
Esta operacin es opcional
(Floating SQuare RooT Single) En fD
obtenemos la raz cuadrada de fS.
Esta operacin es opcional
(Floating Reciprocal Estimate Simple)
En fD obtenemos 1/fS. Esta
operacin es opcional. No existe su
correspondiente operacin para
nmeros de precisin doble
(Floating Reciprocal SQuare Root
Estimate) En fD obtenemos
1/sqrt(fS). Esta operacin es
opcional. No existe su
correspondiente operacin para
nmeros con precisin simple
(Floating Select) El valor de fA se
compara con 0. Si fA es mayor o
igual que 0, fB se deposita en fD,
sino fC se deposita en fD. La
comparacin ignora el signo de 0 (+0
-0). Esta operacin es opcional.
Doble
Simple
Simple
Doble
Doble
Todas ellas disponen de una versin con punto (.) que actualiza el registro
CR.
Casi todas las operaciones se proporcionan tanto para precisin simple como
para precisin doble. Las instrucciones de precisin simple se diferencian
porque tienen una s al final de su nombre.
En la divisin decimal no se desperdicia el resto como pasa en la divisin
entera, es decir, si hacemos:
; f1 = 7.0
; f2 = 2.0
fdiv f0,f1,f2 ; f3 = 3.5
La operacin fsel se utiliza para conseguir el mismo efecto que el operador
?: del lenguaje C, donde asignamos un valor u otro a fD en funcin de una
condicin sin hacer saltos, los cuales como se explica en el Apndice B,
degradan ms el rendimiento del programa.
Pg 142
MacProgramadores
fctiw fD,fS
fctiw. fD,fS
fctiwz fD,fS
fctiwz. fD,fS
Descripcin
(Floating Round to Single Precision) Redondea el
dato almacenado en fS al nmero ms cercano que
pueda ser representado en formato simple, y los
guarda en fD (en formato doble)
(Floating Convert To Integer Word) El nmero
almacenado en fD lo convierte a entero de 32 bits,
usando el modo de redondeo activo, y lo deposita en
los bits fD[32-63], quedando los bits fD[0-31]
indefinidos.
(Floating Convert To Integer Word round toward
Zero) El nmero almacenado en fD lo convierte a
entero de 32 bits eliminando los decimales, y lo
deposita en los bits fD[32-63], quedando los bits
fD[0-31] indefinidos.
Pg 143
MacProgramadores
Significado
fA < fB
fA > fB
fA = fB
fA ? fB (unordered)
Adems de los bits del campo CR que especifiquemos, los bits FPSCR[16-19]
tambin se activan convenientemente.
Las instrucciones de comparacin de que dispone PowerPC se detallan en la
Tabla 2.71:
Instruccin
fcmpo CRFD,fA,fB
fcmpu CRFD,fA,fB
Descripcin
(Floating CoMPare Ordered) Compara fA con fB,
produciendo una VXVC si alguno de los operandos es
un NaN. El resultado se deposita en el campo de CR
dado por CRFD.
(Floating CoMPare Unordered) Compara fA con fB,
pudiendo ser alguno de los operandos en un NaN. El
resultado se deposita en el campo de CR dado por
CRFD.
Pg 144
MacProgramadores
7.10
Descripcin
(Floating Move Register) Copia el contenido de fS a
fD
(Floating Negate) Copia el contenido de fS a fD y
cambia el signo durante la copia
(Floating ABSolute value) Copia el contenido de fS a
fD y pone el bit de signo a 0 durante la copia
(Floating Negate ABSolute value) Copia el contenido
de fS a fD y pone el bit de signo a 1 durante la copia
Pg 145
MacProgramadores
MacProgramadores
Pg 147
MacProgramadores
Pg 148
MacProgramadores
Significado
Registro GPR
Registro GPR distinto de r0
Registro FPR
Referencia a memoria
Operando inmediato entero. Son literales cuyo valor es
conocido en tiempo de compilacin
Operando inmediato en punto flotante de doble precisin. Son
literales cuyo valor es conocido en tiempo de compilacin
Se acepta un operando de cualquier tipo: registro, direccin de
memoria o operando inmediato.
MacProgramadores
Pg 150
MacProgramadores
Pg 151
MacProgramadores
Otra cosa importante es que podemos evitar los efectos laterales que se
produciran si el programa C estuviese usando uno de los registros que
usamos desde ensamblador. Por ejemplo, esta instruccin dara problemas si
el registro r3 estuviese siendo usado por el programa C.
asm ( "lwz r3,%0":/*sin salida*/:"m" (N) );
Para evitar esto, podemos avisar al compilador de que la instruccin modifica
el registro r3, usando la llamada lista de registros modificados, que se
pone en un tercer campo separada por dos puntos:
asm ( "lwz r3,%0":/*sin salida*/:"m" (N): "r3" );
Aqu podemos proteger cuantos registros sean necesarios poniendo su
nombre entre comillas y separndolos por comas.
Tambin si nuestro programa ensamblador modifica el registro CR debemos
de indicarlo bajo el nombre "cc", por ejemplo:
asm ( "lwz r3,%0 \n"
"cmpwi r3,0 \n"
"beq fin \n"
"addi r3,r3,1 \n fin:"
: /*sin salida*/ : "m" (N) : "r3", "cc" );
Adems si nuestro programa ensamblador modifica la memoria de una forma
impredecible, debemos aadir "memory" a la lista de registros modificados.
En principio, el compilador de C puede asignar el mismo registro a un
operando de entrada y de salida, y suponer que el dato de entrada ser
Pg 152
MacProgramadores
Pg 153
MacProgramadores
9 Llamada a funciones
Vamos a ver ahora cul es el mecanismo de llamada a funciones en Mac OS
X. Esto nos va a permitir poder llamar a funciones escritas en otros lenguajes,
como p.e. C, desde ensamblador, o viceversa, poder llamar a funciones
escritas en ensamblador desde C.
Tamao
(en bytes)
1
1
Rango Valores
2
2
0 a 65.535
-32.768 a 32.767
0 a 4.294.967.295
-2.147..483.648 a 2.147.483.647
4
8
8
4
8
16
4
0 a 255
-128 a 127
Adems de estos tipos la Tabla 2.76 muestra los tipos de datos para AltiVec.
Tipo C o C++
Tamao
(en bytes)
vector
unsigned 16 (1 byte
char
cada)
vector char
16 (1 byte
Pg 154
Rango Valores
0 a 255
-128 a 127
MacProgramadores
cada)
16 (2 bytes
cada)
16 (2 bytes
cada)
16 (4 bytes
cada)
16 (4 bytes
cada)
16 (1 byte
cada)
16 (2 bytes
cada)
16 (4 bytes
cada)
16 (4 bytes
cada)
16 (3 bytes
cada)
0 a 65.535
-32.768 a 32.767
0 a 4.294.967.295
-2.147..483.648 a 2.147.483.647
0 (falso) 1-255(true)
0 (falso) 1-65.535 (true)
0 (falso) 1-4.294.967.295(true)
Ver Apndice A
formato de pixel 1/5/5
MacProgramadores
FPR
AltiVec
GPR0
Tipo
registro
Voltil
GPR1
GPR2
Dedicado
Voltil
GPR3-GPR10
Voltil
GPR11
GPR12
Voltil
Voltil
GPR13-GPR31
No voltil
FPR0
FPR1-FPR13
Voltil
Voltil
FPR14-FPR31
No voltil
v0-v2
v3-v13
Voltil
Voltil
v14-v19
v20-v31
Voltil
No voltil
vrsave
No voltil
Uso
Usado normalmente para almacenar el
LR de retorno de la funcin
Puntero a la cima de la pila
En Mac OS Classic era un registro
dedicado que se usaba como puntero a
la TOC (Table Of Content) o a la GOT
(Global Offset Table). Mac OS X usa un
esquema de direccionamiento
diferente y este registro es un registro
de propsito general como otro
cualquiera.
Estos 8 registros se usan para pasar
los parmetros de las llamadas a
funciones. Una vez recibimos los
parmetros se pueden usar para
scratch si se desea
Contiene la direccin de salto cuando
llamamos a funciones de enlace
dinmico. Si no estamos llamando a
una funcin de enlace dinmico se
usa como un registro ms
Sus valores se conservan entre
llamadas a procedimientos
Registro de scratch
Usado para paso de parmetros en
punto flotante. Una vez recibimos los
parmetros se pueden usar para
scratch si se desea
Sus valores se conservan entre
llamadas a procedimientos
Registros de scratch
Usado para el paso de parmetros de
este tipo
Registros de scratch
Sus valores se conservan entre
llamadas a procedimientos
Indica los vectores que deben ser
guardados en un cambio de contexto
Pg 156
SPR
LR
No voltil
CR
CTR
XER
FPSCR
CR0-CR1
Voltil
Voltil
Voltil
Voltil
CR2-CR4
CR5-CR7
No voltil
Voltil
MacProgramadores
rea de parmetros
rea de parmetros
Caller
rea de enlace
GPR1
Caller
Nuevo
frame
rea de enlace
Registros guardados
Variables locales
Callee
rea de parmetros
rea de enlace
GPR1
Pg 157
MacProgramadores
Cada vez que una funcin llama a otra se crea en la pila un nuevo frame, el
cual almacena toda la informacin que necesita el procedimiento para sus
autogestin.
La Figura 2.17 muestra la creacin de un frame en la pila tras llamar a un
procedimiento. Como vamos a ver, GPR1 en todo momento apunta a la cima
de la pila con la que estamos trabajando.
Pg 158
MacProgramadores
MacProgramadores
; Recoge en r0 el LR
; Guarda el LR en el rea de enlace
; del caller
mfcr r0
; Recoge en r0 el CR
stw r0,4(r1)
; Guarda el CR en el rea de enlace
; del caller
stwu r1,-tamanoFrame(r1) ; Crea su frame
Pg 160
MacProgramadores
; Eplogo
lwz r1,0(r1)
lwz r0,4(r1)
mtcrf 255,r0
lwz r0,8(r1)
mtlr r0
blr
;
;
;
;
;
;
;
;
;
;
Pg 161
MacProgramadores
funcion_b();
}
int main ()
{
funcion_a();
return 0;
}
Listado 2.13: Ejemplo de funciones
MacProgramadores
L7:
; Eplogo
lwz r1,0(r1)
lwz r0,8(r1)
;
;
;
;
;
;
;
mtlr r0
lmw r30,-8(r1)
blr
.align 2
.globl _main
_main:
; Prlogo
mflr r0
stmw r30,-8(r1) ;
;
stw r0,8(r1)
;
;
stwu r1,-80(r1) ;
;
mr r30,r1
;
; Llamada
bl _funcion_a
; Eplogo
li r3,0
;
main()
b L8
L8:
lwz r1,0(r1)
;
;
lwz r0,8(r1)
;
;
mtlr r0
lmw r30,-8(r1) ;
blr
;
Pone un 0 en el retorno de la
MacProgramadores
Pg 164
MacProgramadores
rea de parmetros
Caller
rea de enlace
GPR1
Zona
vaca
Pg 165
MacProgramadores
struct Parametros
{
int pi1;
float pf2;
double pd3;
short ps4;
double pd5;
char pc6;
short ps7;
float pf8;
short ps9;
};
+44
+40
+36
ps9
pf8
ps7
+32
pc6
+28
pd5
+20
ps4
+16
pd3
+8
+4
0
pf2
pi1
Zona vaca
Pg 166
MacProgramadores
+44
+40
+36
ps9
pf8
ps7
+32
pc6
+28
GPR8
ps4
+16
pd3
+8
+4
0
GPR10
GPR9
pd5
+20
FPR4
FPR3
GPR7
GPR6
GPR5
pf2
GPR4
pi1
GPR3
FPR2
FPR1
Zona vaca
Figura 2.20: Ejemplo de organizacin real de parmetros en la pila
Por ltimo respecto a los parmetros que sean vectores (AltiVec) estos se
pasan en los registros v2 a v13, y en el caso de los vectores, su presencia no
afecta a los registros GPR ni FPR. El caller no debe reservar espacio en el rea
de parmetros de la pila a no ser que su nmero exceda el nmero de
parmetros que podemos pasar en los registros de AltiVec.
Pg 167
MacProgramadores
Pg 168
MacProgramadores
9.6 Ejemplo
Para acabar este apartado vamos a hacer un ejemplo de como se
implementara una funcin recursiva que calcula el factorial de un nmero en
ensamblador.
Esta funcin ensamblador la vamos a poner en un fichero llamado
factorial.s que aparece en el Listado 2.16, y la vamos a llamar desde un
programa C que vamos a hacer en el fichero factorial.c que aparece en
el Listado 2.17.
.set tamanoFrame,16
.text
.align 2
.globl _factorial
_factorial:
; Prlogo
mflr r0
stw r0,8(r1)
stwu r1,-tamanoFrame(r1)
;
;
;
;
Pg 169
Recoge en r0 el LR
Guarda el LR en el rea
de enlace del caller
Crea su frame
MacProgramadores
; Cuerpo de la funcin
cmpwi r3,1
; Si (n>1)
bgt sigue
li r3,1
; Retorna 1
b epilogo
sigue:
stw r3,tamanoFrame+12(r1) ; Guarda r3 en el rea de
; parmetros del padre
; para poder hacer otra
; llamada recursiva
subi r3,r3,1
; Decrementa n
bl _factorial
; Llama a factorial
mr r4,r3
; Recoge el retorno y
; lo guarda en r4
lwz r3,tamanoFrame+12(r1) ; Recupera el parmetro
; del rea de enlace
; del padre
mulhw r5,r3,r4
; Calcula n*factorial(n-1)
cmpwi r5,0
; Si hay acarreo
bne acarreo
; devolvemos 0
mullw r3,r3,r4
; r3 = n*factorial(n-1)
b epilogo
acarreo:
li r3,0
epilogo:
; Eplogo
lwz r1,0(r1)
; Recoge el puntero a pila
; de su rea de enlace
; con lo que destruye
; el frame
lwz r0,8(r1)
; Recoge el LR del rea de
; enlace del caller
mtlr r0
; Fija la direccin de
; retorno
blr
; Retorna
Listado 2.16: Llamada a una funcin C
Pg 170
MacProgramadores
#include <stdio.h>
int factorial(int n);
int main()
{
int n=100002;
int sol = factorial(n);
printf("El factorial de %i es %i",n,sol);
return 0;
}
Listado 2.17: Funcin llamada desde ensamblador
Pg 171
Apndice A
Aritmtica binaria
Sinopsis:
En castellano muchas veces se les llama coma fija y coma flotante, ya que en castellano el
delimitador de la parte fraccionaria es la coma y no el punto
MacProgramadores
bi
0
1
0
1
0
1
0
1
ci
0
0
0
0
1
1
1
1
si
0
1
1
0
1
0
0
1
ci+1
0
0
0
1
0
1
1
1
Pg 173
MacProgramadores
an-2 bn-2
Sumador
completo
cn
sn-1
a1
Sumador
completo
cn-1
b1
ao
Sumador
completo
sn-2
cn
sn-1
bo
Sumador
completo
c1
Pg 174
MacProgramadores
bi
0
1
0
1
0
1
0
1
ci
0
0
0
0
1
1
1
1
si
0
1
1
0
1
0
0
1
ci+1
0
1
0
0
1
1
0
1
Por ejemplo para calcular 56-23, primero los pasamos a binario, y despus
aplicando la regla anterior tenemos:
0011 1000 (56)
0001 0111 (23)
0010 0001 (33)
Ya en el bit ms a la derecha vemos que hemos tenido que pedir al nivel
superior, y el acarreo de peticin se ha mantenido hasta el cuarto bit
empezando a contar por la derecha.
an-1 bn-1
an-2 bn-2
Sumador
completo
cn
sn-1
a1
Sumador
completo
cn-1
b1
ao
Sumador
completo
sn-2
Pg 175
cn
sn-1
bo
Sumador
completo
c1
MacProgramadores
(minuendo)
(sustraendo)
(diferencia)
1111
0111
0111
Complemento a 1
0111
Complemento a 2
1000
1001
10111
3. Descartar el overflow
1110 (minuendo)
+ 1001 (sustraendo en complemento a 2)
10111
0 - Suma
1 - Resta
an-1 bn-1
an-2 bn-2
a1
b1
A0
b0
xor
xor
xor
xor
Sumador
completo
Sumador
completo
Sumador
completo
Sumador
completo
cn
sn-1
cn-1
sn-2
cn
sn-1
c1
MacProgramadores
00100010
00100010
00000000
00000000
00000000
00000000
00100010
00000000
000100011100110
El multiplicador hardware ms sencillo opera sobre dos nmeros sin signo
produciendo cada vez un bit como muestra la Figura A.4. Los nmeros que
vamos a multiplicar son an-1...a1a0 y bn-1...b1b0 los cuales se colocan en
los registros A y B (con el bit menos significativo a la derecha, como es
habitual). El registro P se pone inicialmente a cero:
Pg 177
MacProgramadores
Desplazamiento
P
1 bit
n bits
B
Figura A.4: Circuito multiplicador
1 bit
n bits
B
Figura A.5: Circuito divisor
Pg 178
MacProgramadores
(65)
(15)
(0)
Pasos 1-9:
Como los 9 bits ms a la izquierda de A son ceros, P recibir 9 bits 0 y P-B
siempre ser negativo con lo que el programa se limitar a desplazar los
ceros a la izquierda obteniendo:
A= 10000010 00000000
B= 00000000 00001111
P= 00000000 00000000
(65)
(15)
(0)
Pg 179
MacProgramadores
10 paso:
Desplazamos
P:A= 00000000 00000001 00000100 00000000
B= 00000000 00001111
B>P y no hacemos nada ms.
11 paso:
Desplazamos
P:A= 00000000 00000010 00001000 00000000
B= 00000000 00001111
B>P y no hacemos nada ms.
12 paso:
Desplazamos
P:A= 00000000 00000100 00010000 00000000
B= 00000000 00001111
B>P y no hacemos nada ms.
13 paso:
Desplazamos
P:A= 00000000 00001000 00100000 00000000
B= 00000000 00001111
B>P y no hacemos nada ms.
14 paso:
Desplazamos
P:A= 00000000 00010000 01000000 00000000
B= 00000000 00001111
En este desplazamiento finalmente (P>B) con lo que calculamos P-B y lo
guardamos en P. Adems ponemos un 1 en A.
Luego acabamos teniendo:
Pg 180
MacProgramadores
Pg 181
MacProgramadores
11100101
(27)
(complemento a 1)
+
(-27)
00011011
(-27)
(complemento a 1)
+
(27)
11101111
(17)
(complemento a 1)
+
(-17)
100010001 (17)
Pg 182
MacProgramadores
100111000 (56)
Ahora el acarreo de entrada del bit ms significativo es 0, mientras que el
acarreo de salida del bit ms significativo es 1, al ser distintos indica que ha
habido un desbordamiento.
MacProgramadores
OV
CA
Descripcin
(Summary Overflow) Se activa cuando hay un overflow y queda
activo hasta que lo desactivamos explcitamente con mtxer. Es til
para saber si durante la ejecucin de una serie de instrucciones
hubo un overflow
(OVerflow) Indica si la ltima operacin aritmtica produjo
overflow
(Carry) Indica si la ltima operacin aritmtica produjo acarreo
Pg 184
MacProgramadores
Pg 185
MacProgramadores
MacProgramadores
normalizado si la mantisa tiene un slo dgito a la izquierda de la coma. P.e. 7,5*103 est normalizado, -75*102 no. En binario tambin se normalizan los
nmeros. Por ejemplo 1,0110*2-11 est normalizado, pero 1011,0*2-110 no lo
est.
Pg 187
MacProgramadores
MacProgramadores
0111 1110
1b
8b
Fraccin
0010110 00000000 00000000
23b
De los cuatro formatos definidos por el IEEE 754, slo el formato simple es
obligatorio de implementar, el formato doble es recomendado y todas las
implementaciones de IEEE 754 existentes lo implementan. Por ltimo los
formatos simple extendido y doble extendido slo los tienen algunas
implementaciones. PowerPC implementa los formatos simple, doble y doble
extendido, pero no el simple extendido.
En lenguaje C estos formatos estn representados por los tipos de datos de la
Tabla A.4:
Formato IEEE 754
Simple
Doble
Doble extendido
Tipo C
float
double
long double
El tamao de los campos para los formatos simple y doble est estandarizado
por el IEEE 754 y son los que se muestran el la Tabla A.5, pero el tamao de
los campos para los formatos simple extendido y doble extendido no estn
estandarizados por el IEEE 754, sino que el IEEE754 slo da unos tamaos
mnimos para cada campo.
Formato
simple
doble
simple
extendido
doble extendido
Signo
1
1
1
Exponente Fraccin
8
23
11
52
10
32
16
64
Tabla A.5: Tamaos de los campos de cada uno de los formatos del IEEE 754
Pg 189
MacProgramadores
1b
Fraccin
15b
112b
16 B
16b
Explicit
Signo Exponente leading
1b
15b
Fraccin
1b
63b
12 B
Signo
01
01
0
1
01
Exponente
0
0
mximo
mximo
mximo
Pg 190
Fraccin
0
cualquiera
0
0
!=0
MacProgramadores
0000 0000
1b
8b
Fraccin
0010000 00000000 00000000
23b
Pg 191
MacProgramadores
1111 1111
1111 1111
1111 1111
MacProgramadores
Los NaN pueden ser de dos tipos: quiet NaN y signaling NaN. Cuando un
signaling NaN se encuentra en una operacin aritmtica, si est activo el
tratamiento de excepciones se produce una excepcin. Cuando se encuentra
un quiet NaN no se produce la excepcin.
Los signaling NaN no tienen por qu ser producidos por operaciones
aritmticas no vlidas, nosotros mismos podemos crearlos manualmente, por
ejemplo para rellenar un rea de memoria sin inicializar, de forma que si el
programa encuentra un nmero de estos podemos saber que el programa a
accedido a un trozo de memoria sin inicializar.
Cuando realizamos una operacin aritmtica que produce un resultado no
vlido obtenemos un signaling NaN. Si usamos este valor para ejecutar otra
operacin aritmtica este produce un quiet NaN. Esto es til porque si hay un
problema de clculo, la excepcin slo se producir una vez.
Los NaN toman distintos valores en su parte fraccionaria indicando la causa
del error. La Tabla A.7 muestra los valores que puede tomar el campo de la
fraccin:
Decimal
1
2
4
8
9
17
21
33
Hexadecimal
0x01
0x02
0x04
0x08
0x09
0x11
0x15
0x21
34
0x22
36
0x24
37
0x25
38
40
0x26
0x28
42
0x2A
Significado
Raz cuadrada invalida (p.e. raz de -1)
Suma invalida (p.e. (+)-(-))
Divisin invlida (p.e. 0/0)
Multiplicacin invlida (p.e. 0*)
Resto invlido (p.e. x%0)
Intento de convertir cadena ASCII invlida
Intento de crear un NaN con cdigo cero
Parmetro
invlido
para
una
funcin
trigonomtrica (p.e. sin(), cos(), tan())
Parmetro
invlido
para
una
funcin
trigonomtrica inversa (p.e. acos(), asin(),
atan())
Parmetro invlido para una funcin logartmica
(p.e. log() o ln())
Parmetro invlido para una funcin exponencial
(p.e. exp())
Parmetro invlido para una funcin financiera
Parmetro invlido para una funcin hiperblica
inversa (p.e. acosh() o asinh())
Parmetro invlido para una funcin gamma (p.e.
gamma() o lgamma())
Pg 193
MacProgramadores
Signaling NaN
1111 1111
Quiet NaN
1111 1111
Mnimo
denormalizado
3,5*10-46
1,2*10-324
1,6*10-4966
Mnimo
normalizado
5,8*10-39
1,1*10-308
1,6*10-4932
Mximo
1,7*1038
8,9*10307
5,9*104931
Vamos a explicar cmo se calculan estos rangos. Slo vamos a ver cmo se
calcularan para el formato simple, aunque el mismo razonamiento se puede
aplicar para los dems tipos.
El nmero mximo representable en formato simple sera aquel que tiene
activos todos los bits de la fraccin y el exponente toma el valor mximo
+126, ya que +127 se usa para representar los infinitos, luego este nmero
sera:
1,1111111 11111111 11111111 * 2126 2127 = 1,7*1038
Para calcular el nmero mnimo normalizado sera aquel que tiene el 1 de la
izquierda de la coma de la mantisa, pero toda la parte fraccionaria a 0 y como
exponente -127 (-128 se usa para representar el cero y los nmeros
denormalizados), luego sera:
Pg 194
MacProgramadores
Pg 195
MacProgramadores
0 2-1 20
21
22
23
Pg 196
24
MacProgramadores
MacProgramadores
Modo de redondeo
Redondeo al ms cercano
Redondeo a 0
Redondeo a +
Redondeo a -
Tabla A.9: Modos de redondeo
Pg 198
MacProgramadores
5 Las excepciones
Cuando se produce una situacin anmala en la ejecucin de instrucciones de
punto flotante se produce una excepcin. IEEE 754 recomienda que existan
flags asociados a las excepciones, en el caso de PowerPC estos flags estn en
el registro FPSCR. Al empezar un programa su ejecucin todos los flag de
excepcin estn apagados. Cuando se produce una excepcin se activa el
flag apropiado, pero la aplicacin se contina ejecutando. Despus la
aplicacin puede consultar los flag de excepcin o bien modificarlos.
El estndar tambin recomienda que para cada tipo de excepcin haya un
flag de habilitacin de trap de excepcin, de forma que si hay una
excepcin con su flag de trap habilitado se llame al manejador de trap.
Adems recomienda el uso del flag de habilitacin de excepcin, que
cuando estn activos indican que si una excepcin se produce se encienda su
correspondiente flag de excepcin. Si estn apagados, el flag de excepcin
no se encender a pesar de que se produzca la excepcin. Los
microprocesadores que slo disponen de flags de habilitacin de excepcin no
permite que el sistema operativo pueda reaccionar ante una excepcin, sino
que es el propio programa el que, tras ejecutar una instruccin, debe de
comprobar si se ha encendido algn flag de excepcin.
El usar los flags de habilitacin de excepcin se considera mejor que el uso de
traps, ya que a la hora de ejecutar instrucciones como:
fdiv f0,f1,f2
fadd f2,f3,f4
En un sistema segmentado (ver Apndice B para una descripcin de los
sistemas segmentados) se podran intentar ejecutar las dos instrucciones
concurrentemente, donde la instruccin fdiv tarda ms que la instruccin
fadd, y si ahora se produjese una excepcin en una de ellas el gestor de
traps tendra problemas para saber cual de ellas ha producido la excepcin.
PowerPC permite tanto usar flags de habilitacin de traps como usar flags de
habilitacin de excepcin, ser el diseador del sistema operativo quien deba
tomar esta decisin.
IEEE 754 define cinco tipos de excepciones que vamos a detallar. Las
implementaciones son libres de disponer de ms flags de excepcin si lo
consideran apropiado, tal como pasa en PowerPC que dispone de una gran
cantidad de flags de excepcin, aunque bsicamente las excepciones se
pueden resumir en estas cinco.
Pg 199
MacProgramadores
Adems estos flag pueden ser flags retenidos (sticky), no serlo, o bien
existir un flag de retenido y su correspondiente de no retenido, a eleccin de
la implementacin.
Las cinco excepciones que define IEEE 754 son:
1. Invalid Operation. Ocurre si algn operando es invlido para la
operacin que estamos realizando. Esto ocurre siempre que un operando sea
un NaN. Tambin ocurre en los casos descritos en la Tabla A.10:
Operacin
Suma o resta
Multiplicacin
Divisin
Resto
Raz cuadrada
Comparacin
Invalid Operation
Suma o resta de infinitos. P.e. (+)+(-)
0*
0/0 /
x%y si y=0 x=
Con un operando negativo
Cuando los operandos son o NaN
Pg 200
MacProgramadores
6.1 Redondeo
Con el fin de poder desarrollar software que se pueda ejecutar de la forma
ms homognea posible en distintas plataformas, el estndar del IEEE 754 ha
definido una regla respecto a cmo deben de realizarse las operaciones
aritmticas entre nmeros en punto flotante:
Pg 201
MacProgramadores
2,34*102
2,56*100 +
Pg 202
MacProgramadores
Pg 203
MacProgramadores
Pg 204
MacProgramadores
2359,4010
Ahora redondeamos el nmero obteniendo la mantisa resultado m3=2359
El exponente resultado se obtiene como la suma de los exponentes de
entrada e1 e2, luego e3=2+0=2
Finalmente tenemos que el producto 67,45*102*34,98*100=2359*102
Pg 205
MacProgramadores
MacProgramadores
9 Comparaciones y conversiones
IEEE 754 define que un sistema en punto flotante debe de disponer de
operaciones que permitan comparar nmeros en punto flotante. La tricotoma
comparativa usual de los nmeros reales se extiende en el estndar para que
slo una de estas cuatro comparaciones sea cierta:
o
o
o
o
a<b
a>b
a=b
a y b no mantienen relacin de orden
Pg 207
MacProgramadores
Apndice B
La segmentacin
Sinopsis:
Este apndice est pensado para lectores que desconozcan en que consiste la
segmentacin, la cual se menciona repetidamente en distintos contextos de
los temas anteriores.
Actualmente todos los microprocesadores de alto rendimiento que se fabrican
son segmentados. A continuacin vamos a ver en que consiste la
segmentacin y las ventajas de rendimiento que introduce.
Pg 208
MacProgramadores
1 Que es la segmentacin?
La segmentacin (pipelines) es un tcnica usada por los
microprocesadores ms avanzados (la mayora de los procesadores actuales:
Pentium, SPARC, PowerPC, Alpha,...) por la cual se solapa la ejecucin de
varias instrucciones.
En las mquinas segmentadas una instruccin se divide en varias etapas o
segmentos, cada una de las cuales corresponde con un ciclo de reloj. De
esta forma la segmentacin ejecuta las instrucciones como si fuera una
cadena de montaje, donde en cada ciclo de reloj se ejecuta una etapa de la
instruccin.
Lo importante de esta divisin en etapas es que nos permite tener varias
instrucciones ejecutndose a la vez, aunque cada una de ellas en una etapa
distinta, como si se tratase de una cadena de montaje de automviles, donde
hay varios automviles fabricndose en etapas distintas.
Aunque con variaciones dependiendo del microprocesador, las principales
etapas en que se descompone una instruccin segmentada suelen ser:
MacProgramadores
que no las segmentan, en cuyo caso esa unidad funcional slo puede ser
usada por una instruccin a la vez.
De cada uno de los tres tipos de unidades funcionales que existen, un micro
suele disponer de ms de una, con el fin de que varias instrucciones puedan
estar ejecutando en distintas unidades funcionales del mismo tipo, aunque si
la unidad funcional est segmentada, esto podra no ser tan necesario.
Visto esto podramos representar la ejecucin simultnea de instrucciones en
un micro segmentado tal como muestra la Figura B.1:
Instruccin
Instruccin
Instruccin
Instruccin
Instruccin
Instruccin
i
i+1
i+2
i+3
i+4
1
FE
2
DE
FE
3
DI
DE
FE
Ciclo de reloj
4
5
6
EX
WB
DI
EX
WB
DE
DI
EX
FE
DE
DI
FE
DE
WB
EX
DI
WB
EX
WB
MacProgramadores
260
260
50 50 60 50 50 50 50 60 50 50 50 50 60 50 50
Instruccin 1
Instruccin 2
Instruccin 3
65 65 65 65 65
65 65 65 65 65
65 65 65 65 65
MacProgramadores
R=1300ns/325ns=4
Es decir se consigue un rendimiento 4 veces superior en la mquina
segmentada, y no las 5 veces tericas que veamos al principio.
2 Etapas multiciclo
No es prctico exigir que todas las etapas de una instruccin se ejecuten en
un solo ciclo de reloj, como por ejemplo en las operaciones de punto flotante.
Hacer esto significara aceptar un reloj lento.
En la prctica, una etapa de una instruccin puede duran varios ciclos de
reloj, por ejemplo las operaciones de suma y resta de entero se ejecutan en
un solo ciclo EX, mientras que la multiplicacin en coma flotante suele
consumir hasta 5 ciclos EX, y la divisin hasta 20 ciclos EX.
Luego la ejecucin de una instruccin de multiplicacin de punto flotante se
podra representar as:
FE DE DI EX EX EX EX EX WB
Obsrvese que esto hace que la unidad funcional de punto flotante
permanezca ocupada durante todos los ciclos que dura la etapa EX,
impidiendo que otra instruccin la use. Para evitarlo, se suelen aplicar dos
soluciones: Disponer de varias unidades funcionales de punto flotante, o bien,
segmentar la unidad funcional para que puedan entrar varias instrucciones de
punto flotante a tiempos distintos.
El mismo problema le encontramos en las instrucciones que acceden a
memoria, en las que cuando el dato accedido est en cach, la etapa de
lectura de memoria DI, o la de escritura en memoria WB se completan en un
solo ciclo, pero si el dato no esta en cach y hay que ir a memoria principal,
estas etapas pueden consumir ms de un ciclo.
FE DE DI DI DI EX WB
En este caso la unidad funcional de memoria tambin necesita estar duplicada
o segmentada para poder permitir a varias instrucciones trabajar en esta
unidad.
Pg 212
MacProgramadores
3 Los riesgos
Su instinto es correcto si encuentra difcil pensar que la segmentacin es tan
simple como esto, porque no lo es. En esta seccin vamos a comentar unos
problemas que surgen en la segmentacin llamados riesgos (hazards), que
impiden que se ejecute la siguiente instruccin del flujo de instrucciones
durante su ciclo de reloj designado. Los riesgos reducen el rendimiento de la
velocidad ideal lograda con la segmentacin. Hay tres tipos de riesgos:
1. Riesgos estructurales. Surgen de conflictos con los recursos
disponibles, cuando el hardware no puede soportar todas las
combinaciones posibles de instrucciones en ejecucin simultnea.
2. Riesgos por dependencia de datos. Surgen cuando una instruccin
depende de los resultados de una instruccin anterior, de forma que
una tiene que esperar al resultado de la otra.
3. Riesgos de control. Surgen de la segmentacin de los saltos y otras
instrucciones que cambian el IP.
Los riesgos en la segmentacin pueden hacer necesario detenerla. Una
detencin en una mquina segmentada requiere, con frecuencia, que
prosigan algunas instrucciones mientras que se retardan otras. Normalmente,
cuando una instruccin est detenida, todas las instrucciones posteriores a
esta instruccin tambin se detienen. Las instrucciones anteriores a la
instruccin detenida pueden continuar, pero no se cogen instrucciones nuevas
durante la detencin. Veremos algunos ejemplos de cmo operan las
detenciones en esta seccin. No se preocupe, no son tan complejas como
puede parecer!
Pg 213
MacProgramadores
Instuccin
Instruccin
Instruccin
Instruccin
Instruccin
Instruccin
i
i+1
i+2
i+3
i+4
1
FE
2
DE
FE
3
DI
DE
FE
4
EX
DI
DE
FE
Ciclo de reloj
5
6
7
WB
EX
WB
DI
EX
WB
DE
stall DI
FE
DE
10
EX
DI
WB
EX
WB
Pg 214
Instruccin
add
MacProgramadores
Ciclo de reloj
4
5
6
FE
DE
DI
EX
WB
escri
sub
FE
DE
DI
lee
EX
WB
Luego si no hacemos nada para impedirlo, sub leer un dato errneo. En este
caso, el microprocesador tiene que detener a la instruccin sub hasta que el
dato este disponible, como muestra la siguiente Figura B.5.
Instruccin
add
Ciclo de reloj
4
5
6
FE
DE
DI
EX
WB
FE
DE
stall
stall
sub
EX
WB
escri
DI
lee
Ciclo de reloj
4
5
6
FE
DE
DI
EX
WB
FE
DE
stall
DI lee
escri
EX
WB
MacProgramadores
Pg 216
MacProgramadores
1
FE
2
DE
FE
Ciclo de reloj
4
5
6
EX
WB
DI
EX
WB
stall
stall
stall
3
DI
DE
FE1
FE
DE
Pg 217
Instruccin
addi
b
subi
1
FE
2
DE
FE
3
DI
DE
FE1
MacProgramadores
Ciclo de reloj
4
5
6
EX
WB
DI
EX
WB
FE
DE
DI
EX
WB
Saltos incondicionales
Saltos condicionales, los cuales seleccionan la siguiente instruccin a
ejecutar entre 2 alternativas dependiendo de si se cumple o no una
condicin que se encuentra en uno de los campos del registro CR
Saltos multidestino, son saltos en los que, al igual que los
condicionales, evalan una condicin puesta en un campo de CR, pero
la direccin de destino del salto es tambin variable (estar en el
registro LR o CTR), con lo que puede haber muchos destinos.
Pg 218
Instruccin
lwz
cmpwi
beq
1
FE
2
3
DE DI
FE DE
FE1
MacProgramadores
Ciclo de reloj
4
5
6
7
8
EX
WB
DI
EX
WB
stall stall FE
DE DI
stall stall stall stall FE
10
11 12
EX
DE
WB
DI EX
WB
aqui:
subi r4,r4,1
alla:
addi r4,r4,1
Pg 219
Instruccin
cmpwi
lis
li
lwz
beq
1
FE
2
DE
FE
3
DI
DE
FE
4
EX
DI
DE
FE
MacProgramadores
Ciclo de reloj
5
6
7
8
9
10
WB
EX WB
DI EX WB
DE DI EX WB
FE DE DI EX WB
FE1 FE DE DI EX
11
12
WB
3.5.1 Estructura if
En las estructuras if y if-else normalmente, como muestra la Figura B.11,
siempre vamos a poder intercalar instrucciones entre la comparacin y el
salto:
Salto sin resolver
Solucin
instrucciones1
cmpw cr0,r2,0
beq alla
instrucciones2
cmpw cr0,r2,0
instrucciones1
beq alla
instrucciones2
Pg 220
MacProgramadores
trabajado las instrucciones son slo de uso interno al bucle. La Figura B.12
muestra un ejemplo de adelantamiento de instrucciones en un bucle while.
Salto sin resolver
instrucciones1
instrucciones2
b inicio
fin:
Solucin
instrucciones1
instrucciones2
beq fin
instrucciones2
b inicio
fin:
Figura B.12: Adelantar instrucciones en un bucle while
Solucin
instrucciones1
inicio:
fin:
instrucciones2
cmpw cr0,r2,0
beq inicio
instrucciones1
inicio:
fin:
Figura B.13: Adelantar instrucciones en un bucle while
Pg 221
instrucciones2
cmpw cr0,r2,0
instrucciones2
beq inicio
MacProgramadores
instrucciones1
mtctr r5
inicio:
instrucciones2
bdnz inicio
fin:
instrucciones2
add r3,r3,1
bdnz inicio
fin:
MacProgramadores
Descripcin
Decrementa el registro CTR y
es FALSE
Decrementa el registro CTR y
es FALSE
Salta si la condicin es FALSE
Decrementa el registro CTR y
es TRUE
Decrementa el registro CTR y
es TRUE
Salta si la condicin es TRUE
Decrementa el registro CTR y
Decrementa el registro CTR y
Salta siempre
z Es un bit que se reserva para el futuro, y que de momento debe ser siempre 0
y Indica si es ms probable que el salto se realice a que no se realice
Tabla B.1: Configuracin del operando BO
Pg 223
MacProgramadores
inicio:
instrucciones1
instrucciones2
cmpw cr0,r2,0
bc 13,2,inicio
fin:
El operando BO vale 13=0b01101 donde hemos activado el bit y, ya que el
salto es ms probable que se repita. El operando BI vale 2=0b00010
indicando que queremos comprobar la igualdad a 0 del registro r2 en el
campo cr0.
Otra forma de indicar en las instrucciones de salto si creemos ms probable
que se produzcan o no es aadir al nombre de la instruccin un - (ms
probable que no se realice) o un + (ms probable que si se realice). Por
ejemplo:
bucle:
cmpwi r3,100
beq+ bucle
Indica que lo ms probable es que se realice el salto.
2. Algoritmos de prediccin dinmicos. Consisten en que es el
procesador el que decide si ejecutar especulativamente el salto o no. Aunque
inicialmente el procesador puede hacer caso al bit de prediccin depositado
por el programador, en microprocesadores ms avanzados el propio
procesador puede usar mecanismos para decidir si el salto especulativo que
va a dar es el ms correcto.
Bsicamente existen dos tcnicas de prediccin dinmica:
Branch Target Address Cache (BTAC). El procesador almacena la
direccin destino de los ltimos saltos realizados en una memoria cach, de
forma que si esa instruccin de salto se vuelve a intentar ejecutar otra vez, el
procesador busca la instruccin en su cache y mira a ver que ocurri la vez
anterior para tomar ese camino. De esta forma si el salto especulativo tiene
xito se puede conseguir una prdida de 0 ciclos.
Pg 224
MacProgramadores
Direccin a la que
salto la ltima vez
Estado
Strongly Taken
Weakly taken
Weakly Not taken
Strongly Not Taken
Strongly
Not
Taken
NT
T
Weakly
Not
Taken
NT
Pg 225
T
Weakly
Taken
NT
Strongly
Taken
MacProgramadores
3.7 La serializacin
Para mantener al procesador y a la memoria en un estado consistente con el
modelo de ejecucin secuencial, en ciertas situaciones el procesador se ve
obligado a serializar la ejecucin de una instruccin entera, deteniendo la
ejecucin de todas las dems instrucciones hasta que esta acaba.
Esto ocurre por ejemplo cuando hay ms de una unidad funcional de punto
fijo donde recursos comunes no duplicados como el registro XER van a ser
actualizados. Por esta razn las instrucciones que modifican este registro
llevan un nombre especial como addc o addo, las cuales pueden ejecutar
considerablemente ms lento que la instruccin que no modifica este registro
(add). Lo mismo ocurre con las instrucciones con punto (.) como por
ejemplo add., que al escribir en le campo CR0 puede necesitar ejecutar
secuencialmente.
Para evitar detenciones de este tipo debido a un conflicto en el campo CR0,
es recomendable que los saltos cercanos utilicen otros campos (CR1,...CR7)
para evaluar sus condiciones.
Pg 226
MacProgramadores
4 Ms all de la segmentacin
Se denomina procesadores supersegmentados a los procesadores donde la
segmentacin es ms profunda (pueden llegar a tener 10 etapas, en lugar de
las 5 antes descritas), y en las que todas las unidades funcionales se
encuentran segmentadas.
Este trmino no debe de ser confundido con el de procesador superescalar,
que es un procesador capaz de emitir varias instrucciones en el mismo ciclo
de reloj, normalmente de 2 a 4 instrucciones sin embargo si las instrucciones
del flujo de instrucciones son dependientes, o no cumplen ciertos criterios,
slo se emitir la primera instruccin de la secuencia. La mayora de los
PowerPC actuales son superescalares.
Actualmente estn surgiendo mquinas, como por ejemplo Itanium de Intel a
las que se llama VLIW (Very Long Instruction Word) que se caracterizan
porque una instruccin est formada por la unin de varias instrucciones (3
en concreto en el caso de Itanium) las cuales se agrupan en lo que llaman un
bundle, y las 3 se emiten a la vez. Lo importante de agrupar las
instrucciones en bundles es que el compilador puede colocar en cada bundle
instrucciones que no tengan dependencias entre s con el fin de facilitar su
ejecucin simultnea sin detenciones. Esta solucin consigue mejor
rendimiento que las mquinas superescalares tradicionales, a cambio de
aumentar la complejidad de la programacin, ya que el programador tiene
que pensar en grupos de instrucciones (bundles) ms que en instrucciones
secuenciales.
Por ltimo estn las llamadas mquinas vectoriales, que usan a la vez
ambas tcnicas. Habitualmente son supersegmentadas, y tienen potentes
operaciones vectoriales que se pueden considerar equivalentes a emitir
mltiples operaciones independientes.
Pg 227
MacProgramadores
Referencias
[DEVTOOLS] Herramientas de desarrollo de Apple
http://developer.apple.com/tools/index.html
[MICROIBM] Microprocesadores de IBM
http://www-1.ibm.com/servers/eserver/
pseries/hardware/workstations/ (Workstations de 32 bits)
http://commerce.www.ibm.com/content/home/
shop_ShopIBM/en_US/eServer/pSeries/pSeries.html
(Servidores de 64 bits de alto rendimiento)
[MICROMOTOROLA] Microprocesadores de Motorola
http://www.motorola.com/SPS/PowerPC/teksupport
/teklibrary/
[UNDERFLOW] Underflow and the Reliability of Numerical Software, James
Demmel, y Combatting the effect of Underflow and Overflow in
determining Real Roots of Polynomials de S. Linnainmaa.
[WARREN] Changing Division by a constant to Multiplication in Twos
Complement Arithmetic. Warren, Henry S., Jr., IBM Research Report:
RC 18601 [1992].
Pg 228