功能09h中断21h dx =文本的偏移量,ds =文本的段
如何在c ++中获得段和偏移?
答案 0 :(得分:3)
这个答案有几个先决条件:
在哪种情况下:
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
或printf
?
答案 1 :(得分:1)
如果你处于实模式,它们是指向数据的FAR指针的上部和下部16位(分别)。
使用实模式指针并让您直接调用软件中断的环境现在非常罕见。在任何现代操作系统上,您将使用用户模式包装器生成sysenter
指令而不是int
。
答案 2 :(得分:0)
#include <dos.h>
FP_SEG(&var);
返回var
的段FP_OFF(&var);
返回var
的偏移量