{"id":16478908,"url":"https://github.com/francoriba/cripto_pricing","last_synced_at":"2025-07-08T15:05:00.058Z","repository":{"id":156546588,"uuid":"625020879","full_name":"francoriba/cripto_pricing","owner":"francoriba","description":"Currency converter using REST API and interfacing python, c and assembly scripts and functions @FCEFyN, UNC, Computational Systems","archived":false,"fork":false,"pushed_at":"2023-04-20T13:40:11.000Z","size":1460,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-28T19:09:14.647Z","etag":null,"topics":["assembly","c","calling-conventions","coverter","criptocurrency","layers","rest-api","x86-32","x86-64"],"latest_commit_sha":null,"homepage":"","language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/francoriba.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-04-07T21:17:30.000Z","updated_at":"2024-10-18T03:47:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"a4e92da8-099c-4d97-bfd6-a9456e68edf4","html_url":"https://github.com/francoriba/cripto_pricing","commit_stats":null,"previous_names":["francoriba/cripto_pricing"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/francoriba/cripto_pricing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/francoriba%2Fcripto_pricing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/francoriba%2Fcripto_pricing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/francoriba%2Fcripto_pricing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/francoriba%2Fcripto_pricing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/francoriba","download_url":"https://codeload.github.com/francoriba/cripto_pricing/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/francoriba%2Fcripto_pricing/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264292912,"owners_count":23586060,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assembly","c","calling-conventions","coverter","criptocurrency","layers","rest-api","x86-32","x86-64"],"created_at":"2024-10-11T12:50:31.686Z","updated_at":"2025-07-08T15:05:00.036Z","avatar_url":"https://github.com/francoriba.png","language":"Assembly","readme":"# Cripto pricing calculator\nRepositorio para el laboratorio n°2 de la asignatura \"Sistemas de Computación\" de la FCEFyN , Universidad Naconal de Córdoba, Argentina. \u003cbr\u003e\nGrupo de trabajo: Internautas  \u003cbr\u003e\nAbril, 2023 \u003cbr\u003e\nIntegrantes: \n * Careggio, Camila\n * Casanueva, María Constanza\n * Riba, Franco \u003cbr\u003e\n \n Profesores:\n * Jorge, Javier Alejandro \n * Solinas, Miguel\n\n## Como ejecutar el script de Python\nPara poder ejecutar el script \"api.py\" es necesario previamente crear la libreria \"currencyconverterlib.so\", puede hacer esto manualmente mediante los comandos comentados en el archivo \"mul32.asm\" o bien haciendo uso del Makefile mediante el comando \"make\" (que creará además el archivo ejecutable apto para ser debugeado mediante gdb y los archivos objeto asociados). Con el comando \"make clean\" puede eliminar los archivos de salida del Makefile. \n\n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/mapa%20conceptual.png)\n\n1. Ejecución de ``make`` y si todo sale bien, nos avisa que ya se hizo el build  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/execution.png)  \n2. Ejecutamos el script de python y vemos que nos va a pedir ingresar una crypto y una moneda. Si ingresamos valores válidos, realizará la conversión:  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/execution2.png)  \n3. El programa nos pregunta si queremos realizar otra conversión. Si decimos que no, finalizará, sino vuelve al paso 2.  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/execution3.png)  \n4. En el caso de que se haya ingresado un valor incorrecto, se le avisa al usuario y se vuelve a pedir el valor  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/execution4.png)  \n\n## Funcionamiento \nEste proyecto se divide en 3 capas. La primer capa utiliza un lenguaje de alto nivel como los es **python** para interactuar con una [API REST](https://www.coinapi.io/) con la que, mediante un esquema HTTP request-response, se obtiene la información correspondiente a:\u003cbr\u003e\n* Cotización en USD de alguna criptomoneda (BTC, ETH o LTC)\u003cbr\u003e\n* Cotización en relacion a USD de alguna moneda fiduciaria (USD, ARS, EUR) \u003cbr\u003e   \n\nEsta capa interactúa con la capa inferior proporcionandole la información (parametros) tomada de la API REST, esto se logra con ayuda de la libreria ```ctypes``` de Python que permite utlizar las funciones disponibles en una **shared library de c**. Además esta capa implementa las funcionalidades requeridas para que el usuario pueda interactuar con el programa.\u003cbr\u003e\n\nLa siguiente capa consiste de un **programa de lenguaje c** donde se implementa la función:\u003cbr\u003e\n\n```float convert(float crypto_usd, float rate)```\u003cbr\u003e\n\nEsta invoca a la subrutina ```mult```, que conforma la capa más baja y se encuentra escrita en **lenguaje ensamblador**, en este caso compatible con arquitecturas x86. El interfaceo de estas dos capas se hace posible gracias a la **call convention de c**. La subrutina se encarga de realizar la multiplicación de los valores en el stack frame que fueron traidos como parametros desde las capas superiores y permite obtener el precio de una criptomoneda expresado en unidades de alguna de las monedas fiduciarias. \n\n```\nsegment .text\n    global  mul1\n    global  mul2\n\n;declaramos macros para la dirección de los bytes mas altos de los dos parametros\n%define p1 [ebp+12] \n%define p2 [ebp+8]\n\n;probamos realizar la operación de multiplicación de dos formas distintas, mul2 nos permite comprender mejor lo que sucede a la hora de dubuggear con gdb\n\nmul1: \n    enter 0, 0 ;no se reserva espacio para variables locales\n    fld     dword p1 ;ST0 = p1\n    fld     dword p2 ;ST1 = p2\n    fmulp   st1, st0 ;multiplicamos la cotización de la mondea fiduciaria por el valor de la cripto\n    leave ;liberamos la pila\n    ret ;retornamos a la función de c\n\nmul2:\n        enter           4,0 ; varibales locales definidas solo para inspección del stack frame\n        \n        mov             dword [ebp-4], 0\n        mov             eax, p1\n        mov             ebx, p2\n        imul            ebx, eax\n        mov             [ebp-4], ebx\n        mov             eax, ebx\n        dump_stack      1, 1, 3\n\n        leave        \n        ret\n```\n\u003cbr\u003e\n\n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/stack_x86.png)\n\nEl ```stackframe``` contiene dos parametros del tipo float (ocupando 4Bytes c/u) que ocupan las posiciones ```EBP+12``` (precio en USD de alguna criptomoneda) y ```EBP+8``` (precio de un USD expresado en unidades de alguna moneda fiduciaria). \n\u003cbr\u003e\n\n## Dump del Stack\nA continuación se muestra el área de memoria donde se encuentra alojado el stack haciendo uso de la función dump_stack que ya se encontraba implementada en los ejemplos propuestos por Paul Carter:\u003cbr\u003e\n\n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/dump_stack.png)\n\u003cbr\u003e\n\nPara verificar usamos la calculadora online que utiliza el Estándar IEEE 754 para convertir un valor de punto flotante a su equivalente decimal. \n\n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/rate.png)\n\u003cbr\u003e\nComparando ambas imágenes podemos ver como la posición del stack referenciada por [EBP+12] = FFF9E834 efectivamente contiene el valor 43C1899A que se corresponde con el primer parámetro pusheado (rate de conversión).\n\n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/price.png)\n\u003cbr\u003e\nDel mismo modo podemos ver como la posición del stack referenciada por [EBP+8] = FFF9E830  efectivamente contiene el valor 46ED3833  que se corresponde con el segundo parámetro pusheado (precio de la cripto en USD).\n\nTambién podemos observar que la posición de la pila referenciada por [EBP + 4] = FFF9E82C contiene el valor 5658E293 que se corresponde con la dirección de retorno de la función mul1 (es decir el respaldo del valor que tenía el registro IP antes de el llamado a la función mul1).\n\n## GDB \n\nPara poder inspeccionar la pila usando gdb comenzamos por generar el archivo ejecutable mediante el Makefile, este considera para los comandos el flag -g para poder usar gdb.   \n\n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/gdb1.png)  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/gdb2.png)  \nA continuación colocamos un break en la función main que contiene el llamado a la función “convert”. Posteriormente a partir de allí comenzamos a inspeccionar los cambios ocurridos a medida que avanzamos en la ejecución mediante el comando “step”  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/gdb3.png)  \nUtilizamos el gdb dashboard para visualizar en cada paso el stack. Vemos que antes de ingresar a la función de assembler, es decir, todavía en el main del código de C, el stack contiene los siguientes registros con sus valores en “Registers”. El ebp tiene un valor de 0xffffcf38 y el esp, 0xffffcf30. Cuando se retorne de la función de assembler, deberían volver a tener estos mismos valores.  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/gdb4.png)  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/gdb5.png)  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/gdb6.png)  \nCuando termina de ejecutarse la función de assembler, se retorna al main y el stack es el siguiente. Vemos que efectivamente se restauran los valores de esp y ebp que tenían antes de ingresar a la función. También vemos que el resultado de la multiplicación de los parámetros ha sido correctamente asignado a la variable conversión.   \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/gdb7.png)  \nPor último tambien notamos como el eip cambia su base de `main` a `convert`, la cual es el nombre de la función en la que se encuentra el programa en este momento. A esta base, le suma un dsplazamiento con cada `stepi` puesto que el programa avanza y por lo tanto, también avanza la próxima instrucción a ejecutarse. Lo vemos claramente en la dirección de memoria: `0x56556234: convert`, `0x56556235: convert + 1` y así sucesivamente.  \n![](https://github.com/francoriba/lab2_cripto_pricing/blob/master/img/stackframe.png)  \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrancoriba%2Fcripto_pricing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffrancoriba%2Fcripto_pricing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffrancoriba%2Fcripto_pricing/lists"}