Assembly 如何使用超过64kb的数据在16位保护模式下编程?
我想为16位保护模式编写一些代码,特别是一个带有一些程序的简单操作系统。我知道这听起来很傻,而且可能是,但我对理解如何在这些约束条件下编写程序感兴趣 我想知道在16位保护模式下工作的各种操作系统(例如OS/2和Win 3.1)中采用了哪些约定。他们用了什么ABI?远指针是如何传递的?不同的代码模型是否有多个ABIAssembly 如何使用超过64kb的数据在16位保护模式下编程?,assembly,abi,protected-mode,80286,Assembly,Abi,Protected Mode,80286,我想为16位保护模式编写一些代码,特别是一个带有一些程序的简单操作系统。我知道这听起来很傻,而且可能是,但我对理解如何在这些约束条件下编写程序感兴趣 我想知道在16位保护模式下工作的各种操作系统(例如OS/2和Win 3.1)中采用了哪些约定。他们用了什么ABI?远指针是如何传递的?不同的代码模型是否有多个ABI 为了澄清这一点,我知道什么是远指针,以及它们是如何在API级别上使用的。我想知道的是这在汇编级别上是如何工作的。远端指针的段是否在堆栈上传递?有什么特殊约定吗?大多数16位保护模式AP
为了澄清这一点,我知道什么是远指针,以及它们是如何在API级别上使用的。我想知道的是这在汇编级别上是如何工作的。远端指针的段是否在堆栈上传递?有什么特殊约定吗?大多数16位保护模式API都将远指针作为参数。远指针是32位值,包含16位偏移量(低位字)和16位选择器(高位字,选择器指段)。通过将其像任何其他参数一样放在堆栈上,按值传递。一般来说,这些指针只能引用最大为65536字节的内存区域,但不同的远指针可以引用不同的内存区域,从而允许使用超过64K的内存 例如,在16位Windows API(Win16)中,函数具有以下文档化的接口: 符号
FAR
是一个宏,在使用16位Windows API时扩展为FAR
关键字。今天,这个API函数被记录为使用LPRECT
参数,这意味着被读取为“指向RECT的长(远)指针”。符号LPRECT
在32位和64位Windows API中定义为RECT*
的类型定义。如果仍然支持16位API,则在使用16位API时,它将是一个typedefRECT far*
对于不同的内存模型(小型、中型、小型、大型)没有单独的API,因为在指针(以及函数本身)上使用了
far
关键字,所以可以从所有内存模型访问API。编译器会发现它使用了一个远指针,并根据需要升级任何近(16位)指针。大多数16位保护模式API都使用远指针作为参数。远指针是32位值,包含16位偏移量(低位字)和16位选择器(高位字,选择器指段)。通过将其像任何其他参数一样放在堆栈上,按值传递。一般来说,这些指针只能引用最大为65536字节的内存区域,但不同的远指针可以引用不同的内存区域,从而允许使用超过64K的内存
例如,在16位Windows API(Win16)中,函数具有以下文档化的接口:
符号FAR
是一个宏,在使用16位Windows API时扩展为FAR
关键字。今天,这个API函数被记录为使用LPRECT
参数,这意味着被读取为“指向RECT的长(远)指针”。符号LPRECT
在32位和64位Windows API中定义为RECT*
的类型定义。如果仍然支持16位API,则在使用16位API时,它将是一个typedefRECT far*
对于不同的内存模型(小型、中型、小型、大型)没有单独的API,因为在指针(以及函数本身)上使用了
far
关键字,所以可以从所有内存模型访问API。编译器会发现它使用了一个远指针,并根据需要升级任何近(16位)指针。大多数16位保护模式API都使用远指针作为参数。远指针是32位值,包含16位偏移量(低位字)和16位选择器(高位字,选择器指段)。通过将其像任何其他参数一样放在堆栈上,按值传递。一般来说,这些指针只能引用最大为65536字节的内存区域,但不同的远指针可以引用不同的内存区域,从而允许使用超过64K的内存
例如,在16位Windows API(Win16)中,函数具有以下文档化的接口:
符号FAR
是一个宏,在使用16位Windows API时扩展为FAR
关键字。今天,这个API函数被记录为使用LPRECT
参数,这意味着被读取为“指向RECT的长(远)指针”。符号LPRECT
在32位和64位Windows API中定义为RECT*
的类型定义。如果仍然支持16位API,则在使用16位API时,它将是一个typedefRECT far*
对于不同的内存模型(小型、中型、小型、大型)没有单独的API,因为在指针(以及函数本身)上使用了
far
关键字,所以可以从所有内存模型访问API。编译器会发现它使用了一个远指针,并根据需要升级任何近(16位)指针。大多数16位保护模式API都使用远指针作为参数。远指针是32位值,包含16位偏移量(低位字)和16位选择器(高位字,选择器指段)。通过将其像任何其他参数一样放在堆栈上,按值传递。一般来说,这些指针只能引用最大为65536字节的内存区域,但不同的远指针可以引用不同的内存区域,从而允许使用超过64K的内存
例如,在16位Windows API(Win16)中,函数具有以下文档化的接口:
符号FAR
是一个宏,在使用16位Windows API时扩展为FAR
关键字。今天,这个API函数被记录为使用LPRECT
参数,这意味着被读取为“指向RECT的长(远)指针”。
void GetClientRect(hwnd, lprc)
HWND hwnd; /* handle of window */
RECT FAR* lprc; /* address of structure for rectangle */