Arquitectura Del Set de Instrucciones
Arquitectura Del Set de Instrucciones
Arquitectura Del Set de Instrucciones
Lenguaje
de compilación ensamblado Código
Assembler
alto nivel de máquina
Little-Endian Big-Endian
¿Qué lo determina?
Memoria
Datos de 32 bits direccionables por byte
Espacio de direcciones: 232
Big-endian
Mapa de memoria especificado por
Set de instrucciones
Es un subconjunto de SPARC
Todas las instrucciones ocupan 32 bits
32 registros de 32 bits
Program Status Register (PSR) guarda los flags de ALU
Sólo dos instrucciones acceden a memoria principal
(1) leer memoria a registro (2) escribir desde registro a memoria.
El sistema ARC
Mapa de memoria
Direcciones: 32 bits Datos: 32 bits
Dispositivos de entrada/salida
mapeados en memoria
El sistema ARC
Mapa de memoria
y con 3 Gb?
Algunas de las instrucciones ARC
Registros Accesibles al Programador
Sintaxis
int main()
{
long x = 15;
long y = 9;
long z = 0;
z=x+y;
return(0);
}
Queremos escribirlo en Assembler
¿Dónde se guardan físicamente las variables?
¿Como definimos el tipo de variable?
¿Dónde se guarda físicamente el programa?
¿Qué instrucciones utilizar?
Programa ARC que
suma dos números en memoria
int main(void)
{
long x = 15;
long y = 9;
long z = 0;
z=x+y;
return(0);
}
Programa ARC que
suma dos números en memoria
Assembler RAM
Dir. 2048
int main(void) Dir. 2052
{ c2002814h
long x = 15;
long y = 9; c4002818h
long z = 0; 86804002h
c420281ch
z=x+y;
81c3e004h
return(0); 0000000fh
} 5
0
Programa C que suma los elementos
de un array
int main ()
{
int i;
SumaParcial=0;
for ( i = 0; i < 6; i++ )
{
SumaParcial=SumaParcial+ a[ i ] ;
}
return(0);
}
Programa que suma los elementos de un array
long arrayA[5] ;
.begin
long SumaParcial; .org 2048 ! El programa empieza en la direcc. 2048
int main () main: andcc %r3, %r0, %r3 ! Pone a 0 el %r3
{ ld [length], %r1 ! %r1 = length
int i;
SumaParcial=0; for: andcc %r1, %r1, %r0 ! Chequea elementos restantes
for ( i = 0; i < 6; i++ ) be done ! Si no hay mas elementos termina
{
SumaParcial=SumaParcial+ a[ i ] ; addcc %r1, -4, %r1 ! Actualiza índice al array
}
ld %r1,[arrayA],%r5
return(0);
} addcc %r3, %r5, %r3 ! Suma un nuevo elemento a r3
ba for ! Vuelve al for
done: jmpl %r15 + 4, %r0 ! Vuelve al proceso invocante
length: 20 ! 5 numeross (20 bytes)
arrayA: .dwb 5 ! Contenido de ArrayA
Versión 2 .end
Programa que suma los elementos de un array
long arrayA[5] ;
.begin
long SumaParcial; length .equ 20
int main () .org 2048 ! El programa empieza en la direcc. 2048
{ main: andcc %r3, %r0, %r3 ! Pone a 0 el %r3
int i;
SumaParcial=0; add %r0, length, %r1 ! %r1 = length
for ( i = 0; i < 6; i++ ) for: andcc %r1, %r1, %r0 ! Chequea elementos restantes
{
SumaParcial=SumaParcial+ a[ i ] ; be done ! Si no hay mas elementos termina
}
addcc %r1, -4, %r1 ! Actualiza índice al array
return(0);
} ld %r1,[arrayA],%r5
addcc %r3, %r5, %r3 ! Suma un nuevo elemento a r3
ba for ! Vuelve al for
done: jmpl %r15 + 4, %r0 ! Vuelve al proceso invocante
arrayA: .dwb 5 ! Reserva espacio para ArrayA
Versión 3 .end
long arrayA[5] ;
! %r2 - Guarda la dirección de arrayA
long SumaParcial; .begin
int main () length .equ 20
{ .org 2048 ! El programa empieza en la direcc. 2048
int i;
SumaParcial=0; main: andcc %r3, %r0, %r3 ! Pone a 0 el %r3
for ( i = 0; i < 6; i++ ) add %r0, length, %r1 ! %r1 = length
{
SumaParcial=SumaParcial+ a[ i ] ; add %r0, arrayA, %r2 !! %r2 = `puntero a arrayA
}
for: andcc %r1, %r1, %r0 ! Chequea elementos restantes
return(0);
} be done ! Si no hay mas elementos termina
addcc %r1, -4, %r1 ! Actualiza índice al array
ld %r1, %r2, %r5
addcc %r3, %r5, %r3 ! Suma un nuevo elemento a r3
ba for ! Vuelve al for
done: jmpl %r15 + 4, %r0 ! Vuelve al proceso invocante
arrayA: .dwb 5 ! Reserva espacio para ArrayA
.end
Versión 4
long arrayA[5] ;
! %r2 - Guarda la dirección de arrayA
long SumaParcial; .begin
int main () length .equ 20
{ .org 2048 ! El programa empieza en la direcc. 2048
int i;
SumaParcial=0; main: andcc %r3, %r0, %r3 ! Pone a 0 el %r3
for ( i = 0; i < 6; i++ ) add %r0, length, %r1 ! %r1 = length
{
SumaParcial=SumaParcial+ a[ i ] ; sethi arrayA, %r2 !
}
srl %r2, 10.%r2 ! %r2 = `puntero a arrayA
return(0);
} for: andcc %r1, %r1, %r0 ! Chequea elementos restantes
be done ! Si no hay mas elementos termina
addcc %r1, -4, %r1 ! Actualiza índice al array
ld %r1, %r2, %r5
addcc %r3, %r5, %r3 ! Suma un nuevo elemento a r3
ba for ! Vuelve al for
done: jmpl %r15 + 4, %r0 ! Vuelve al proceso invocante
arrayA: .dwb 5 ! Reserva espacio para ArrayA
Versión 5 .end
Subrutinas vs Branch
! Subrutina sbr_add
! suma el contenido de %r1 al de r2 y
! devuelve el resultado en %r3
sbr_add: addcc %r1, %r2, %r3
jmpl %r15 + 4, %r0
x: 15
y: 9
z: 0
.end
LLAMADO A SUBRUTINAS
Parámetros por stack
! Programa que suma dos numeros
.begin
.org 2048
.
.
.
ld [x], %r1
ld [y], %r2
addcc %r14, -4, %r14
st %r1, %r14
addcc %r14, -4, %r14
st %r2, %r14 (Pasar parámetros por registro) VS. (Pasar parámetros por stack)
call sbr_add
ld %r14,%r3 Qué líneas de código agregaría para que no se cuelgue?
addcc %r14, 4, %r14
st %r3, [z]
.
.
.
jmpl %r15+4,%r0
! Subrutina Sbr_add
! Le llegan dos numeros por stack
! devuelve su suma por stack
sbr_add: ld %r14, %r8
addcc %r14, 4, %r14
ld %r14, %r8
addcc %r8, %r9, %r10
st %r10, %r14
jmpl %r15 + 4, %r0
x: 15
y: 9
z: 0
.end
LLAMADO A SUBRUTINAS
Parámetros por área reservada en memoria
! Programa que suma dos numeros
.begin
.org 2048
.
. Copia operandos al área
.
st %r1, [x]
st %r2, [x+4] Pasa puntero al área
addcc %r0, x , %r5
call sbr_add
st [x+8], %r3
.
.
.
jmpl %r15+4,%r0
! Subrutina Sbr_add
! Por %r5 le llega el puntero al area
! de memoria donde estan los arg. de entr y de salida
sbr_add: ld %r5, %r8
ld %r5 + 4, %r19
addcc %r8, %r9, %r10
st %r10, %r5 + 8
jmpl %r15 + 4, %r0
x: .dwb 3
.end
LLAMADO A SUBRUTINAS
Parámetros por área reservada en memoria
! Programa que suma dos numeros Forma alternativa del programa anterior
.begin
.org 2048
.
. Copia operandos al área
.
st %r1, [x]
st %r2, [x+4] Pasa puntero al área
sethi x , %r5
srl %r5,10, %r5
call sbr_add
st [x+8], %r3
.
.
.
jmpl %r15+4,%r0
! Subrutina Sbr_add
! Por %r5 le llega el puntero al area
! de memoria donde estan los arg. de entr y de salida
sbr_add: ld %r5, %r8
ld %r5 + 4, %r9
addcc %r8, %r9, %r10
st %r10, %r5 + 8
jmpl %r15 + 4, %r0
x: .dwb 3
.end
LLAMADO A SUBRUTINAS
Problema:
Rutinas anidadas sobreescriben %r15
Argumentos
! Programa sin macros
.begin ! Programa con macros
.org 2048 .begin
. .org 2048
. .
. .
ld [x], %r1 .
ld [y], %r2 ld [x], %r1
addcc %r14, -4, %r14 ld [y], %r2
st %r1, %r14 push %r1
addcc %r14, -4, %r14 push %r2
st %r2, %r14 call sbr_add
call sbr_add pop %r3
ld %r14,%r3 st %r3, [z]
addcc %r14, 4, %r14 .
st %r3, [z] .
. .
.
.
Macros
! Programa: suma dos numeros SUBRUTINA ! Programa: suma dos numeros MACRO
begin .begin
.org 2048 .macro mcr_add Reg1, Reg2, Reg3
. addcc Reg1, Reg2, Reg3
. .endmacro
.
ld [x], %r1 .org 2048 .
ld [y], %r2 .
call sbr_add .
st %r3, [z] ld [x], %r1
. ld [y], %r2
. mcr_add %r1, %r2, %r3
. st %r3, [z]
jmpl %r15+4,%r0 .
.
! Subrutina Sbr_add .
! suma el contenido de %r1 al de r2 y jmpl %r15+4,%r0
! devuelve el resultado en %r3
sbr_add: addcc %r1, %r2, %r3 x: 15
jmpl %r15 + 4, %r0 y: 9
z: 0
x: 15 .end
y: 9
z: 0
.end
Macros vs Subrutinas
Macro Subrutina
Se accede en tiempo de ensamblado Se accedida por un CALL en tiempo de
(expansión de macros) convirtiéndola en ejecución y termina con un JMPL en
su código equivalente.. tiempo de ejecución
Comparar:
• Uso de memoria
• Velocidad de ejecución
Localización de variables
Registros
“Segmento de datos” (RAM)
Stack (RAM)
Comparar
• Velocidad de acceso
• Alcance
• Vida
CÓDIGO DE MÁQUINA
Formato de instrucciones
Estos 5 formatos no están relacionados con los 5 tipos de instrucción en transparencia anterior!
CÓDIGO DE MÁQUINA
Cinco formatos de instrucción
CÓDIGO DE MÁQUINA
Formatos de instrucción
PC=PC + (4 × sign_ext(disp22)
CÓDIGO DE MÁQUINA
Formatos de instrucción
Modo
Inmediato Constante incluida en la instrucción
Indirecto Direcc de memoria dónde esta el puntero al dato (poco usado, lento)
Características
Tamaño de las instrucciones (=espacio ocupado por el código de máquina)