martes, 7 de abril de 2015

Fechas de Parcial

Fechas de Parcial

Introduccion y Evolucion de las Computadoras
Buses y Memoria Cache
Memoria Interna y Memoria Externa
Entradas y salidas
Soporte del Sistema Operativo
Unidad Aritmetica y Instrucciones x86
Direccionamiento
Practico  Calculadora de punto flotante.

Diapositivas Stallings
http:/www.drpaulcarter.com/pcasm/
1 Parcial 27 de abril
Notas 1 Parcial 

Direcciones


2 Parcial 15 de junio

Conceptos
ARP
IP
TCP
DHCP
NAT
Ruteo
DNS

domingo, 5 de abril de 2015

Medición perfomance de código

Medición perfomance de código

Para medir el tiempo que tarda la CPU en ejecutar un programa existe la instrucción de marca de Tiempo.

RDTSC

Este instrucción lee un registro de timer tics del procesador y nos devuelve el valor en el registro "RAX" tomando la marca de tiempo al comienzo del programa y restándosela a la marca de tiempo del final del programa obtenemos los tics de reloj que tardo en ejecutarse la subrutina.

La instrucción RDTSCP lee marcas de tiempo y devuelve el identificador de la CPU.
Contador Marca de tiempo
La instrucción RDTSCP carga los 64 bits  en el registro "RAX."
ejemplo
  rdtsc ; lee marca de tiempo
  mov time, eax ; muevo  contador a una variable
  fdiv ; division de punto flotante
rdtsc ; lee marca de tiempo
  sub eax, time ; Calcula la diferencia

Contador Marca de tiempo e Identificador de CPU
La instrucción RDTSCP carga los 64 bits  en el EAX y el idetificado e IA64_TSC_AUX MSR
en el registro RCX
Realiza dos lecturas del RDTSCP las resta y las imprime e imprime el cpu id
Se asembla mediante:

nasm -o print.o -f elf64 -g -F stabs print.asm
gcc -o print print.o

taskset 0x1 ./print ;Se ejecutara en el procesador 0
dbritos@HP:~/asm$ taskset 0x1 ./print
72
0

taskset 0x4 ./print ;Se ejecutara en el procesador 3

Con el comando taskset elijo en que procesador se va a correr la aplicación.

segment .text
EXTERN printf
GLOBAL main
main:
 RDTSCP
 mov rcx,1000000
miloop: mov rbx,rax
;Poner codigo a medir aqui
 RDTSCP
 push rcx
 sub rax,rbx
 mov rsi, rax
 mov rdi, fmt
 mov rax, 0
 call printf
 pop rsi
 mov rdi, fmt
 mov rax, 0
 call printf
 mov rax, 60 ; sys_exit
 mov rdi, 0 ; return 0 (success)
 syscall

segment .data
fmt: db "%d", 10,0


Bibliografia


http://www.intel.com.ar/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf

miércoles, 1 de abril de 2015

LLamadas a rutinas de asembler desde c++

LLamadas a rutinas de asembler desde c++


A continuacion presentamos un pequeño programa en asembler que es llamado desde C++.

El programa en asembler carga una constante en el registro "RAX", lo llamamos "c.asm".




global GetValueFromASM

segment .data

segment .text
GetValueFromASM:
        mov rax, 8679869
        ret

El programa en "C++" que llama a la funcion "GetValueFromASM"  a este programa la guardamos en el archivo "main.pp".

#include <iostream>
using namespace std;
extern "C" int GetValueFromASM();

int main()
{
cout<<"ASM said " <<GetValueFromASM()<<endl;
return 0;
}
Para facilitar la compilacion realizamos un archivo "makefile" con el siguiente código.


runme: main.cpp c.o
 g++ main.cpp c.o -o runme

c.o: c.asm
 nasm -f elf64 c.asm -o c.o

lo ejecutamos y obtenemos lo siguiente:


dbritos@HP:~/asm$ make
nasm -f elf64 c.asm -o c.o
g++ main.cpp c.o -o runme
dbritos@HP:~/asm$ ./runme
ASM said 8679869
dbritos@HP:~/asm$ 


Pasando variables al asembler.



En la arquitectura "x64" las seis primeras variables enteras "C++" las pasa a través  de registros.
1    RDI
2    RSI
3    RDX
4    RCX
5    R8
6    R9

El asembler le retorna al "C++" las variables a través del registro "RAX"


El programa en "C++" que llama al programa "c" que dentro del programa a la función se le asigna el nombre de "AddInts()" a este programa la guardamos en el archivo "main.pp".


#include <iostream>
using namespace std;
extern "C" int AddInts(int a, int b, int c, int d);
int main()
{
int a,b,c,d;
cout<<"Escriba un numero:";
cin>>a;
cout<<"Escriba el segundo numero:";
cin>>b;
cout<<"Escriba el tercer numero:";
cin>>c;
cout<<"Escriba el cuarto numero:";
cin>>d;
cout<<"La suma de enteros es:"<<AddInts(a,b,c,d)<<endl;
return 0;
}
El programa en asembler que suma las cuatro variables y devuelve la suma en el registro "RAX", lo llamamos "addints.asm".


global AddInts
segment .data
segment .text

AddInts:
        mov eax,edi
        add eax,esi
        add eax,ecx
        add eax,edx
        ret

Para facilitar la compilación realizamos un archivo "makefile" con el siguiente código.

runme: main.cpp addints.o
        g++ main.cpp addints.o -o runme

addints.o: addints.asm
        nasm -f elf64 addints.asm -o addints.o

Lo ejecutamos y obtenemos los siguientes resultados:

/nasm/sumaabcd$ make
g++ main.cpp addints.o -o runme

/nasm/sumaabcd$ ./runme
Escriba un numero:1
Escriba el segundo numero:2
Escriba el tercer numero:3
Escriba el cuarto numero:4
La suma de enteros es:10

Bibliografia


 http://vikaskumar.org/amd64/