0

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

如何在 C++ 中获取段和偏移量?

4

3 回答 3

3

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

  1. 您正在使用生成 16 位代码的编译器,因为 DOS 调用仅在 16 位模式下工作,并且
  2. 你的编译器得到了段的概念。

在这种情况下,它是:

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 位的编译器。

为什么不直接使用coutor printf

于 2010-04-11T17:52:37.827 回答
1

如果您处于实模式,它们是指向数据的 FAR 指针的高 16 位和低 16 位(分别)。

如今,使用实模式指针并让您直接调用软件中断的环境确实很少见。在任何现代操作系统上,您都将使用生成sysenter指令而不是int.

于 2010-04-11T17:41:05.873 回答
0
#include <dos.h>

FP_SEG(&var);

returns segment of var

FP_OFF(&var);

returns offset of var

于 2010-04-19T08:07:45.200 回答