2010-04-11 9 views

Répondre

0
#include <dos.h> 

FP_SEG(&var); 

retours segment var

FP_OFF(&var); 

retours var offset de

1

Si vous êtes en mode réel, il s'agit des 16 bits supérieurs et inférieurs (respectivement) d'un pointeur FAR sur les données.

Les environnements qui utilisent des pointeurs en mode réel et vous permettent d'appeler directement les interruptions logicielles sont vraiment rares ces jours-ci. Sur tout système d'exploitation moderne, vous utiliseriez un wrapper en mode utilisateur qui génère une instruction sysenter au lieu de int.

+0

raison de downvote? –

3

Il y a quelques conditions préalables à cette réponse:

  1. Vous utilisez un compilateur qui génèrent code 16 bits depuis DOS appelle seulement en mode 16 bits et
  2. Votre compilateur obtient le concept de segments.

Dans ce cas, il est:

char string [] = "Hello World$"; 
call_int21h_9 (&string); 

où call_int21h_9 est quelque chose comme:

call_int21h_9 (FAR char *string) 
// the FAR above is important and very compiler dependent, it tells the compiler 
// that the pointer is a 32bit pointer (16 bit segment and 16 bit offset) 
{ 
    mov ah,9 
    lds dx,string ; this loads the DS:DX segment:offset from the value on the stack 
    int 21h 
} 

Suite à cela, il existe plusieurs façons de compiler une application 16 bits en fonction de la façon dont les segments sont mis en place et utilisés. Les deux plus courantes sont small et large (le compilateur peut les appeler quelque chose d'autre):

  • Petit: Tous les segments sont la même valeur et le total des données de code + est < 64k
  • Grand: Tout le code et les données existent dans de nombreux segments et le code + données < 1MEG

Il existe d'autres dispositions de segments (une donnée, beaucoup de code, un code et beaucoup de données, etc.) et vous aurez besoin de consulter la documentation du compilateur pour voir ce qui est disponible

Bien sûr, votre plus gros problème est d'obtenir un compilateur qui fait 16 bits.

Pourquoi ne pas simplement utiliser cout ou printf?

+0

cuz, je devrais convertir ce code de pascal en C++ Utilise dos; var r: registres; text: string [128]; begin text: = 'Bonjour $'; r.ah: = 09 $; r.dx: = ofs (texte) +1; r.ds: = seg (texte); intr (21 $, r); fin. –

+6

Avez-vous besoin de convertir cela en Cmodern_ C++ ou Cequale-obsolète en C++? – MSalters

+0

C++ également obsolète –