Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何使用超过64kb的数据在16位保护模式下编程?_Assembly_Abi_Protected Mode_80286 - Fatal编程技术网

Assembly 如何使用超过64kb的数据在16位保护模式下编程?

Assembly 如何使用超过64kb的数据在16位保护模式下编程?,assembly,abi,protected-mode,80286,Assembly,Abi,Protected Mode,80286,我想为16位保护模式编写一些代码,特别是一个带有一些程序的简单操作系统。我知道这听起来很傻,而且可能是,但我对理解如何在这些约束条件下编写程序感兴趣 我想知道在16位保护模式下工作的各种操作系统(例如OS/2和Win 3.1)中采用了哪些约定。他们用了什么ABI?远指针是如何传递的?不同的代码模型是否有多个ABI 为了澄清这一点,我知道什么是远指针,以及它们是如何在API级别上使用的。我想知道的是这在汇编级别上是如何工作的。远端指针的段是否在堆栈上传递?有什么特殊约定吗?大多数16位保护模式AP

我想为16位保护模式编写一些代码,特别是一个带有一些程序的简单操作系统。我知道这听起来很傻,而且可能是,但我对理解如何在这些约束条件下编写程序感兴趣

我想知道在16位保护模式下工作的各种操作系统(例如OS/2和Win 3.1)中采用了哪些约定。他们用了什么ABI?远指针是如何传递的?不同的代码模型是否有多个ABI


为了澄清这一点,我知道什么是远指针,以及它们是如何在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时,它将是一个typedef
RECT 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时,它将是一个typedef
RECT 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时,它将是一个typedef
RECT 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   */