在c ++中使用9h 21h中断函数

时间:2010-04-11 17:17:09

标签: c++ dos interrupt

功能09h中断21h dx =文本的偏移量,ds =文本的段

如何在c ++中获得段和偏移?

3 个答案:

答案 0 :(得分:3)

这个答案有几个先决条件:

  1. 您正在使用生成16位代码的编译器,因为DOS调用仅在16位模式和
  2. 下工作
  3. 您的编译器会获得段的概念。
  4. 在哪种情况下:

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

    其中call_int21h_9类似于:

    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
    }
    

    除此之外,还有几种方法可以根据段的设置和使用方式编译16位应用程序。最常见的两个是smalllarge(编译器可能会将其称为其他内容):

    • 小:所有段都是相同的值,数据+代码的总和是< 64K
    • 大:所有代码和数据都存在于许多段和代码+数据中。 1MEG

    还有其他段的布局(一个数据,许多代码;一个代码和许多数据等),您需要查阅编译器文档以查看可用的内容。

    当然,你最大的问题是获得一个16位的编译器。

    为什么不使用coutprintf

答案 1 :(得分:1)

如果你处于实模式,它们是指向数据的FAR指针的上部和下部16位(分别)。

使用实模式指针并让您直接调用软件中断的环境现在非常罕见。在任何现代操作系统上,您将使用用户模式包装器生成sysenter指令而不是int

答案 2 :(得分:0)

#include <dos.h>

FP_SEG(&var);

返回var

的段
FP_OFF(&var);

返回var

的偏移量