2010-05-05 21 views
20

Me preguntaba por qué en algunos códigos fuente hay estas macros como FAR y PASCAL. ¿Qué significan y hacen? Gracias¿Qué es FAR PASCAL?

+10

Invocan a una máquina del tiempo, y luego Bill Gates, de 30 años, aparece y exige su 640k de regreso. –

Respuesta

19
  • PASCAL: Está relacionado con un calling convention. Los parámetros se insertan en la pila en orden de izquierda a derecha (opuesto a cdecl), y el destinatario es responsable de equilibrar la pila antes del retorno.

    Esta convención de llamadas era común en las siguientes API de 16 bits: OS/2 1.xy Microsoft Windows 3.x. Existe cierta disputa sobre si fue utilizado por Borland Delphi 1.x

  • FAR: En una computadora de arquitectura segmentada, un far pointer es un puntero que incluye un selector de segmento, lo que permite apuntar a direcciones fuera del segmento actual .

Para completar, FAR y Pascal son macros prepreocessor que, cuando se compila para sistemas de 16 bits, se expanden para las palabras clave que eran necesarios para declarar la convención de llamada y el tamaño del puntero. En los sistemas de 32 bits, generalmente se expanden a nada (a menos que tenga una extraña convención de llamadas predeterminadas). Las macros son retenidos por compatibilidad hacia atrás {sombrero/consejo: comentario de Adrian McCarthy}

+0

Estoy bastante seguro de que la convención de llamadas predeterminada de Delphi siempre ha sido * register *. Solo usó * pascal * para funciones de la API de Windows y otras DLL. –

+3

Para completar, 'FAR' y' PASCAL' son macros prepreocesador que, cuando se compilan para sistemas de 16 bits, se expanden a las palabras clave que fueron necesarias para declarar la convención de llamadas y el tamaño del puntero. En los sistemas de 32 bits, generalmente se expanden a nada (a menos que tenga una extraña convención de llamadas predeterminadas). Las macros se conservan por compatibilidad con versiones anteriores. –

3

FAR es un holdover de la era de 16 bits, cuando teníamos punteros de cerca (16 bits) y de lejos (32 bits).

PASCAL es una convención de llamadas. Creo que es equivalente a stdcall hoy en día.

9

A juzgar por la memoria aquí,

FAR es una caída de vuelta a los días de 16 bits cuando se fue segmentada memoria del montón. Los datos CERCANOS fueron de tamaño y velocidad más limitados, se permitió que FAR fuera más grande pero más costoso.

Por lo que yo sé, en una tierra de 32 bits es una macro que colapsa a nada.

PASCAL es una convención de llamadas que también se utiliza mucho en días de 16 bits. Desde entonces ha sido reemplazado por stdcall.

Ambos quedan en compatibilidad hacia atrás.

1

Es probable que algunos redundante/obsoleta codificación sobrantes de la era de 16 bits.

FAR se usó en aplicaciones de 16 bits para indicar que la dirección requería más de 16 bits.

PASCAL (altion) es un tipo de conversión, le permite al compilador saber cómo se organiza la pila (usando las convenciones de llamadas PASCAL) para que el compilador pueda pasar los parámetros adecuados hacia y desde la función.

HTH

2

se trata de una convención de llamada de edad ...

FAR se hereda de una época en que los registros del procesador, donde demasiado pequeño para contener la dirección completa de un destino de salto. entonces, los procesadores tenían 2 tipos de salto dependiendo de cuán "lejos" estaba el destino del contador del programa actual.

PASCAL describe el orden de los argumentos en la pila, indica que la función utiliza el orden descrito por el lenguaje de programación Pascal, que era diferente de C. (versión muy antigua de sistemas operativos como MacOS y Windows donde se desarrolló con Pascal) .

6

FAR es obsoleto; se usó en código de 16 bits para indicar punteros que podrían abarcar todo el espacio de direcciones, en lugar de solo un desplazamiento de 16 bits para el segmento actual.

PASCAL es una convención de llamadas. Como lo describe Wikipedia:

Los parámetros son empujados en la pila en orden de izquierda a derecha (enfrente de cdecl), y el destinatario de la llamada es responsable de equilibrar la pila antes de vuelta.

Esta convención de llamadas era común en las siguientes API de 16 bits: OS/2 1.x, Microsoft Windows 3.x y Borland Delphi versión 1.x.

+0

Mark, soy nuevo en C++ y me han pedido que convierta un antiguo código C/C++ a C++ 11. El tipo de datos 'corto FAR *' se adoptó en gran medida y no se resolverá en VS2013 - ¿Debería reemplazarlos? En caso afirmativo, ¿con qué? – MoonKnight

+0

@Killercam debería poder simplemente dejar 'FAR' y' NEAR' donde sea que los encuentre. Aunque estoy sorprendido de que no estén '' definidos'd como macros vacías por los encabezados de Microsoft, son los reyes de la compatibilidad con versiones anteriores. –

1

Específicamente PASCAL dice que los argumentos de la función son pasados ​​en orden de izquierda a derecha, lo que reduce el tamaño del código (porque la persona que llama sabe lo grande que la pila es por lo que puede limpiarlo)

C stdcall pasa argumentos de derecha a izquierda, esto significa que puede tener una cantidad variable de argumentos, pero se necesita más código para borrar.

Cuestiones relacionadas