elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?  (Leído 6,651 veces)
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« en: 20 Febrero 2021, 19:41 pm »

Perdonen la trivialidad... pero un programa en C, por ejemplo, el siguiente:

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    printf ("Im the output.");
  6.    getchar ();
  7.  
  8.    return 0;
  9. }

y creo que imposiblemente mas exactamente el mismo programa, pero en ensamblador:

Código
  1. .686
  2. .model FLAT
  3.  
  4. includelib \masm32\lib\msvcrt.lib
  5.  
  6. printf proto C, :dword
  7. getchar proto C
  8. exit proto C, :dword
  9.  
  10.    .data?
  11.    dd ?
  12.  
  13.    .data
  14.      __0 db "Im the output.", 0
  15.  
  16.  .code
  17.  
  18. start:
  19.  
  20.    call main
  21.    invoke exit, 0
  22.  
  23. main proc
  24.    invoke printf, offset __0
  25.    invoke getchar
  26.  
  27.    ret
  28.  
  29. main endp
  30. end start

Producen una salida con una diferencia de ciento veintinueve mil seiscientos cuarenta y dos (129 642) bytes ¡Eso seria un 85.40% mayor, para el mismo algoritmo! ¡Que locura!

¿Por que existe esta diferencia tan abismal?
¿Es la diferencia siempre de este tamaño en terminos porcentuales, o la diferencia existe hasta cierto punto?

Saludos.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« Respuesta #1 en: 20 Febrero 2021, 19:49 pm »

El primero tiene la RTL de C completa enlazada estaticamente dentro del ejecutable y el segundo la enlaza dinamicamente (esta es la RTL de C del VC++ en una DLL: msvcrt.dll).

Asi rapidamente vas a notar una diferencia grande: cl /O1 /MD hello.cpp


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« Respuesta #2 en: 20 Febrero 2021, 21:13 pm »

El primero tiene la RTL de C completa enlazada estaticamente dentro del ejecutable

Eso no me lo imagine...

Gracias por tu respuesta.
Saludos.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« Respuesta #3 en: 20 Febrero 2021, 21:26 pm »

De nadas  ::)

https://foro.elhacker.net/programacion_cc/eliminar_basura_de_los_exes_compilados_en_c-t299411.0.html
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« Respuesta #4 en: 20 Febrero 2021, 21:55 pm »


Citar
Código
  1.   #define _WIN32_WINNT 0x0403
  2.   #define WIN32_LEAN_AND_MEAN
  3.   #pragma optimize("gsy", on)
  4.   #pragma comment(linker,"/RELEASE")
  5.   #pragma comment(linker, "/IGNORE:4108")
  6.   #pragma comment(linker, "/FIXED")
  7.   #pragma comment(linker, "/STUB:stub.exe")
  8.   #pragma comment(linker, "/MERGE:.rdata=.data")
  9.   //#pragma comment(linker, "/MERGE:.reloc=.data")
  10.   #pragma comment(linker, "/MERGE:.text=.data")
  11.   #pragma comment(linker, "/NODEFAULTLIB")
  12.   #pragma comment(linker, "/ENTRY:DllMain")
  13.   #pragma comment(linker, "/FILEALIGN:16")
  14.   #pragma comment(linker, "/ALIGN:16")
  15.   #pragma pack(1)

¿Me explicarias que exactamente esta pasando aqui con el linker? ¿Que es "gsy"?



¿Por que en el primer programa la libreria se supone estatica y en el segundo dinamica? ¿Cada vez que declaro ID proto C, ... el ensamblador añade un GetProcAddress o algo asi?
« Última modificación: 20 Febrero 2021, 22:03 pm por marax » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« Respuesta #5 en: 20 Febrero 2021, 22:11 pm »

Ese pragma es para el compilador:
https://docs.microsoft.com/en-us/cpp/preprocessor/optimize?view=msvc-160

Por el tamaño pero depende de la configuracion del proyecto y lo que termine por pasar en linea de comandos:
https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-160

Si probaras la que te deje verias la diferencia usando el mismo codigo fuente:
cl /O1 /MD hello.cpp



No, pero tu ejecutable tiene por cada uno de los PROTO un funcion importada. Compara los 2 ejecutables con https://www.dependencywalker.com/

PD. GetProcAddress seria enlace dinamico en tiempo de ejecucion y la otra en tiempo de carga (esta en el PE el enlace en si mismo):
https://docs.microsoft.com/en-us/windows/win32/dlls/using-run-time-dynamic-linking
« Última modificación: 20 Febrero 2021, 22:16 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« Respuesta #6 en: 20 Febrero 2021, 22:33 pm »



Asi se ha quedado...

A ver si entendi. En el caso del programa en C, el compilador incluye toda la libreria estatica MSVCRT en el ejecutable, en cambio, en el programa en ASM, el programa usa el codigo de la DLL MSVCRT.DLL, ¿No?

A lo demas tendre que dedicarle un poco de tiempo.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ¿Por que tanta diferencia de tamaño entre un programa compilado en un HLL y ASM?
« Respuesta #7 en: 20 Febrero 2021, 22:50 pm »



 ;D

A todo el mundo le funciona ...



Si, al enlazar una libreria estatica (.LIB de codigo) el primer programa contiene todo el codigo de la RTL en su ejecutable, el segundo simplemente enlaza dinamicamente la DLL (con un .LIB de importacion).

En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines