Red de conocimiento informático - Conocimiento sistemático - Funciones de la biblioteca de ensamblaje

Funciones de la biblioteca de ensamblaje

Funciones de la biblioteca en tiempo de ejecución de C

Las funciones de la biblioteca en tiempo de ejecución de C se refieren a algunas funciones básicas admitidas por el propio lenguaje C, que generalmente se implementan directamente en ensamblador.

Funciones API

Las funciones API son funciones proporcionadas por el sistema operativo para implementar funciones específicas para facilitar a los usuarios el diseño de aplicaciones. Las funciones API también se implementan a través de funciones del lenguaje C.

Diferencia

La diferencia entre los dos es que la función API es para el sistema operativo, mientras que la función de tiempo de ejecución del lenguaje C es para el lenguaje C mismo.

1. La biblioteca en tiempo de ejecución es una biblioteca en tiempo de ejecución de C, que es un concepto en el mundo del lenguaje C en lugar de C++.

Obtienes este nombre porque tu programa C necesita las funciones de estas bibliotecas en tiempo de ejecución.

2. El lenguaje C es el llamado lenguaje de "núcleo pequeño", que es muy pequeño (pocas palabras clave, control de flujo del programa, tipos de datos, etc.

Por lo tanto; Después de que Dennis Ritchie y Brian Kernighan desarrollaran el núcleo del lenguaje C, reescribieron más del 90% de los sistemas UNIX en el propio C.

Funciones y separe las partes más utilizadas en archivos de encabezado y bibliotecas correspondientes, como la biblioteca de tiempo de ejecución de C.

Formado.

3. Posteriormente, a medida que el lenguaje C se hizo popular, los fabricantes/individuos/grupos de compiladores de C siguieron la antigua tradición y se comunicaron en diferentes plataformas.

Pero la mayoría de las implementaciones dependen de varias plataformas. Debido a que varios compiladores de C tienen mucho apoyo y comprensión de C.

Diferencias y matices, así existe ANSI C; ANSI C (subjetivamente) especifica en detalle el significado específico de cada elemento del lenguaje C.

Estableció la forma estándar de la biblioteca estándar. Entonces, cuando c se ejecuta.

Esta biblioteca la proporciona el fabricante del compilador. En cuanto a los archivos de encabezado y funciones de biblioteca proporcionados por otros fabricantes/individuos/grupos, deberían denominarse bibliotecas de tiempo de ejecución C de terceros.

(Biblioteca de tiempo de ejecución de C de terceros).

4. La biblioteca de tiempo de ejecución de C contiene código de inicialización y código de manejo de errores (como el procesamiento de división por cero). El programa que usted escribió

puede ejecutarlo sin una biblioteca matemática, pero no puede manejar operaciones matemáticas complejas. Pero si no hay una biblioteca de tiempo de ejecución de C, main().

No se llamará y no se responderá a exit(). Porque la biblioteca de tiempo de ejecución de C contiene los programas C más básicos y comúnmente utilizados.

Función.

5. En el mundo de C++, existe otro concepto: la biblioteca estándar de C++, incluida la biblioteca de tiempo de ejecución de C mencionada anteriormente.

También existe STL. Las razones para incluir la biblioteca en tiempo de ejecución de C son obvias. C++ es un superconjunto de C, no hay razón para iniciar el tiempo de ejecución de C++ nuevamente.

Biblioteca. Las bibliotecas estándar de C++ agregadas por VC a C++ incluyen principalmente: LIBCP. LIB, LIBCPMT. LIB y MSVCPRT. Movimiento de liberación

6. En el entorno de Windows, la biblioteca de tiempo de ejecución C proporcionada por VC se puede dividir en una biblioteca de tiempo de ejecución dinámica y una biblioteca de tiempo de ejecución estática.

Biblioteca de tiempo de ejecución dinámica

La biblioteca de tiempo de ejecución dinámica incluye principalmente:

Archivo de biblioteca DLL: msvcrt.dll (o versión de depuración de MSVCRTD.DLL)

p>

El archivo de biblioteca de importación correspondiente: MSVCRT. LIB (o MSVCRTD. Biblioteca de versión de depuración)

Biblioteca de tiempo de ejecución estática

Los archivos principales correspondientes a la biblioteca de tiempo de ejecución estática (versión de lanzamiento) incluyen:

LIBC. Biblioteca estática de un solo subproceso, versión comercial

LIBCMT. Biblioteca estática multiproceso, versión comercial

Msvcrt.dll proporciona miles de funciones C, e incluso funciones de bajo nivel como printf están en msvcrt.dll. De hecho, cuando su programa se está ejecutando, gran parte del tiempo se ejecuta en estas bibliotecas. Cuando se compila su programa (versión de lanzamiento), VC vinculará automáticamente el archivo de biblioteca de tiempo de ejecución correspondiente (libc.lib, libcmt.lib o biblioteca de importación msvcrt.lib) de acuerdo con sus opciones de compilación (un solo subproceso, múltiples subprocesos o DLL). .

2. El papel de la biblioteca en tiempo de ejecución de C

Además de proporcionarnos las llamadas a funciones de biblioteca necesarias (como memcpy, printf, malloc, etc.), el tiempo de ejecución de C La biblioteca proporciona otra función más importante. La característica importante es agregar una función de inicio a la aplicación.

La función principal de la función de inicio de la biblioteca en tiempo de ejecución de C es inicializar el programa, asignar valores iniciales a las variables globales y cargar la función de entrada del programa de usuario.

El punto de entrada para los programas de consola que no utilizan conjuntos de caracteres anchos es mainCRTStartup(void). Tomemos esta función como ejemplo para analizar qué tipo de programa de entrada nos agrega la biblioteca en tiempo de ejecución. Esta función está definida en crt0.c. El siguiente código ha sido organizado y simplificado por el autor:

void mainCRTStartup(void)

{

int mainret.

/*Obtenga la información completa de la versión de WIN32*/

_ OS ver = GetVersion();

_ winminor =(_ OS ver & gt; & gt8)& amp0x 00 ff;

_ winmajor = _ osver & amp0x 00 ff;

_ winver = (_ win major & lt; & lt8)+_ winminor

_ versión del sistema operativo =(_ versión del sistema operativo & gt; & gt16); 0x00FFFF

_ ioinit() /*Inicializar lowio */

/* Obtener información de línea de comando*/

_ ACM dln =(char *)GetCommandLineA();

/*Obtener información del entorno*/

_ aenvptr =( char *)_ _ crtgetenvenmentstringsa();

_ setargv(); /*Establecer parámetros de línea de comando*/

_ setenvp() /*Establecer parámetros de entorno*/

_ cinit();/* Inicialización de datos C: inicialización de variable global, ¡aquí mismo! */

_ _ initenv = _ environ

mainret = main( __argc, __argv, _ environ /* Llamar a la función principal */

Salir); ( mainret);

}

Como se puede ver en el código anterior, se ha realizado algún trabajo de inicialización antes de llamar a la función principal o WinMain del programa de usuario en tiempo de ejecución. Una vez completada la inicialización, llame a la función principal o WinMain que escribimos. Sólo de esta manera nuestra biblioteca y aplicaciones en tiempo de ejecución en lenguaje C funcionarán correctamente.

Además de crt0.c, la biblioteca de tiempo de ejecución de C también contiene tres archivos: wcrt0.c, wincrt0.c y wwincrt0.c, que proporcionan funciones de inicialización. Wcrt0.c es la versión con juego de caracteres amplio de crt0.c. wincrt0.c contiene la función de entrada para aplicaciones de Windows wwincrt0.c es la versión con juego de caracteres amplio de wincrt0.c.

De forma predeterminada, no Instale el código fuente de la biblioteca de tiempo de ejecución de Visual C++. Si desea ver su código fuente, debe reinstalar Visual C++ y marcar la opción para instalar el código fuente del tiempo de ejecución al reinstalar.

Veamos un programa de consola que no utiliza correctamente la biblioteca de tiempo de ejecución de C:

#includes

#includes

int main ()

{

Archivo CFile;

CString str("Te amo");

Probar

{

Archivo.

Open("file.dat ", CFile::modo escribir | CFile::modo crear

}

Catch (CFileException, e)

{

#ifdef _DEBUG

afxDump<<"El archivo no se puede abrir"<<e->m_cause<<"\n";

#endif

}

End_capture

Archivo. Write(str, str. GetLength());

Archivo. close();

}

Error de enlace durante "Reconstruir todo":

nafxcwd.lib(thrdcore.obj): error LNK2001: símbolo externo no resuelto __endthreadex

nafxcwd.lib(thrdcore.obj): error LNK2001: símbolo externo no resuelto __beginthreadex

main.exe: error fatal LNK1120: 2 errores externos no resueltos

An Se produjo un error al ejecutar cl.exe.

El motivo del error es que Visual C++ utiliza una biblioteca de enlaces estáticos de un solo subproceso para programas de consola de forma predeterminada, y la clase CFile en MFC oculta varios subprocesos. Solo necesitamos hacer clic en Proyecto-> en Visual C++6.0. Configuración -> Menú y opciones de C/C++, simplemente modifique las opciones de compilación en las opciones del proyecto.

La relación entre el tiempo de ejecución de c y la biblioteca estándar de c

La biblioteca estándar de c, como su nombre indica, es un estándar y está formulada por una organización de estándares. Es un estándar desarrollado por el Instituto Nacional Estadounidense de Estándares (ANSI) para estandarizar la biblioteca del lenguaje C. Al principio, las bibliotecas en lenguaje C utilizadas por cada universidad y empresa eran diferentes y era muy difícil trasplantarlas entre sí. Es en este contexto que se ha desarrollado esta norma.

El tiempo de ejecución de c está relacionado con la plataforma, es decir, con el sistema operativo. Lo proporcionan diferentes bibliotecas de tiempo de ejecución de C para diferentes sistemas operativos y diferentes plataformas de desarrollo. Sin embargo, parte de la implementación de C-runtime se basa en la biblioteca estándar C, es decir, C-runtime es una biblioteca desarrollada por varias herramientas de desarrollo de varios sistemas operativos según sus propias plataformas. Hasta cierto punto, se puede decir que C-runtime es una biblioteca de extensión de la biblioteca estándar C, pero agrega muchas funciones de interfaz de biblioteca independientes o relacionadas con la plataforma que no se encuentran en la biblioteca estándar C. Por ejemplo, la función strcpy de la biblioteca estándar de C es responsable de copiar cadenas, pero debido a la falta de control sobre el tamaño del área del buffer de cadena de destino, es muy probable que cause un desbordamiento del buffer (una gran cantidad de ataques de desbordamiento del buffer). son causados ​​por esta vulnerabilidad); por el contrario, Windows proporciona Hay funciones de copia de cadenas seguras que implementan la misma funcionalidad, lo que reduce la posibilidad de ataques de búfer, strcpy_s, y estas funciones se proporcionan como una biblioteca de tiempo de ejecución de C. Por supuesto, la biblioteca de tiempo de ejecución de C puede ser diferente para diferentes sistemas operativos, pero el soporte para la biblioteca estándar de C es completamente consistente. Es decir, las funciones que utilizan la misma biblioteca estándar de C inevitablemente funcionarán en diferentes sistemas operativos. .

La biblioteca estándar de C proporciona:

lEntrada y salida estándar (stdio.h).

lOperación de archivo (stdio.h).

lOperaciones de caracteres (ctype.h).

lOperaciones de cadena (cadena.h).

l Funciones matemáticas (math.h).

l Gestión de recursos (stdlib.h).

Conversión de formato (stdlib.h).

lHora/fecha (hora.h).

L afirmar (assert.h).

Varios tipos de constantes l (limit.h y float.h).

El programa que escribes puede ejecutarse sin una biblioteca matemática, pero no puede manejar operaciones matemáticas complejas.

Sin embargo, sin la biblioteca de tiempo de ejecución de C, no se llamará a main() y exit() no responderá. Porque la biblioteca de tiempo de ejecución de C contiene las funciones más básicas y utilizadas de los programas C.

La siguiente es la relación entre el tiempo de ejecución de C y la biblioteca estándar de C:

La biblioteca de tiempo de ejecución de C incluye aproximadamente las siguientes funciones:

l Inicio y salida : incluida la función de entrada y otras funciones de las que depende la función de entrada.

lFunción estándar: Implementación de funciones propiedad de la biblioteca estándar del lenguaje C especificada por el estándar del lenguaje C. (biblioteca estándar c)

L E/S: para la encapsulación e implementación de funciones de E/S, consulte la sección de inicialización de E/S en la sección anterior.

L montón: para la encapsulación e implementación del montón, consulte la sección de inicialización del montón en la sección anterior.

Implementación del lenguaje: la implementación de algunas funciones especiales en el lenguaje.

lDepuración: Código que implementa la función de depuración.

La diferencia entre la API del sistema operativo y el CRT en tiempo de ejecución de C y la biblioteca estándar de C

En primer lugar, el lenguaje C apareció antes que Windows, y el tiempo de configuración estándar real del lenguaje C fue anterior a Windows (aparece el concepto API) cuando se desarrolló el sistema. Por lo tanto, es completamente posible utilizar el lenguaje C al desarrollar sistemas Windows. En la actualidad, las declaraciones más comunes se implementan en C y ensamblador. Entonces, siempre que utilice C, es posible utilizar la biblioteca estándar de C.

Suponemos que existen dos situaciones. Primero, la implementación de la API de Windows incluye la implementación funcional de algunas funciones de la biblioteca estándar de C, lo que determina que esta parte de la API del sistema operativo se implementa llamando a la biblioteca estándar, por lo que es necesario agregar la DLL de la biblioteca estándar de C para su lanzamiento.

En segundo lugar, el desarrollo del kernel de Microsoft (incluida la API) utiliza una biblioteca de enlaces estáticos en lenguaje C que está estrictamente relacionada con la plataforma, por lo que se puede desarrollar y distribuir sin proporcionar una Dll. Además, esta biblioteca C debe implementarse en forma ensambladora, lo que significa que todas las funciones C en esta biblioteca (al menos una gran proporción) son códigos ensambladores que cubren la sintaxis C.

Si fueras Microsoft, ¿cuál elegirías? Quizás ambos, quizás lo segundo.

En términos generales, lo que llamamos tiempo de ejecución de C se refiere al tiempo de ejecución de C de qué plataforma y plataforma de desarrollo.

La implementación de CRT se basa en la API de Windows, y el desarrollo de la API de Windows también se basa en el lenguaje C, pero no está necesariamente basado en CRT (o biblioteca estándar C).

Además, aunque CRT se implementa en función de la API del sistema operativo, esto no significa que todo CRT encapsule la API del sistema operativo. Por ejemplo, algunos controles de permisos de usuario y creación de subprocesos del sistema operativo no pertenecen a la biblioteca de tiempo de ejecución de C. Debemos llamar directamente a la API del sistema operativo u otras bibliotecas para realizar estas operaciones.

En resumen, la biblioteca estándar de C es la biblioteca básica del lenguaje C y se puede utilizar en cualquier plataforma. Además de agregar la biblioteca estándar C a su alcance, CRT también ha ampliado la biblioteca de interfaz relacionada con la plataforma, que puede llamar a las API del sistema operativo de diferentes plataformas según las diferentes plataformas.

Como se muestra en la siguiente figura, los programas escritos en la biblioteca estándar C son adecuados para plataformas Windows y Linux. Sin embargo, las aplicaciones escritas utilizando otras funciones de biblioteca relacionadas con la plataforma de CRT no pueden ejecutarse entre plataformas.