功能 09h 中断 21h dx = 文本偏移量,ds = 文本段
如何在 C++ 中获取段和偏移量?
这个答案有几个先决条件:
在这种情况下,它是:
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 位应用程序。最常见的两个是small
和large
(编译器可能会称它们为其他名称):
还有其他的段布局(一个数据,许多代码;一个代码和许多数据等),您需要查阅编译器文档以查看可用的内容。
当然,你最大的问题是得到一个 16 位的编译器。
为什么不直接使用cout
or printf
?
如果您处于实模式,它们是指向数据的 FAR 指针的高 16 位和低 16 位(分别)。
如今,使用实模式指针并让您直接调用软件中断的环境确实很少见。在任何现代操作系统上,您都将使用生成sysenter
指令而不是int
.
#include <dos.h>
FP_SEG(&var);
returns segment of var
FP_OFF(&var);
returns offset of var