interrompt 21h dx = décalage du texte, ds = segment du texteen utilisant 9 fonction d'interruption de 21h à 09h C++
Comment obtenir le segment et le décalage en C++?
interrompt 21h dx = décalage du texte, ds = segment du texteen utilisant 9 fonction d'interruption de 21h à 09h C++
Comment obtenir le segment et le décalage en C++?
#include <dos.h>
FP_SEG(&var);
retours segment var
FP_OFF(&var);
retours var offset de
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
.
Il y a quelques conditions préalables à cette réponse:
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):
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
?
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. –
Avez-vous besoin de convertir cela en Cmodern_ C++ ou Cequale-obsolète en C++? – MSalters
C++ également obsolète –
raison de downvote? –