Memory 如何将针对小内存模型的DOS程序集转换为大内存模型?

Memory 如何将针对小内存模型的DOS程序集转换为大内存模型?,memory,assembly,dos,Memory,Assembly,Dos,我对汇编语言有点陌生,想了解它在旧系统上是如何工作的。我知道大内存模型使用远指针,而小内存模型使用近指针,并且大内存模型中的返回地址是4字节而不是2字节,因此第一个参数从[bp+4]更改为[bp+6]。然而,在将图形库从一个小模型调整为一个大模型的过程中,还有一些我似乎不理解的微妙的事情。使用C中的大内存模型运行此代码应该可以清除屏幕,但它会挂起系统(它是用TASM组装的): 它挂在grph_256cls末尾的ret处。事实上,即使我从函数一开始就立即ret,它也会立即挂起。在这两种模式下对程序

我对汇编语言有点陌生,想了解它在旧系统上是如何工作的。我知道大内存模型使用远指针,而小内存模型使用近指针,并且大内存模型中的返回地址是4字节而不是2字节,因此第一个参数从
[bp+4]
更改为
[bp+6]
。然而,在将图形库从一个小模型调整为一个大模型的过程中,还有一些我似乎不理解的微妙的事情。使用C中的大内存模型运行此代码应该可以清除屏幕,但它会挂起系统(它是用TASM组装的):

它挂在
grph_256cls
末尾的
ret
处。事实上,即使我从函数一开始就立即
ret
,它也会立即挂起。在这两种模式下对程序集进行编码时,是否有一个全面的差异列表,以便我更容易理解发生了什么


编辑:澄清一下,这是原始来源。这不是生成的输出;它旨在组装并链接到一个库中

我将
grph_256cls
更改为带有
PROC FAR
的程序,现在可以正常工作:

grph_cls256 PROC FAR
  ...
grph_cls256 ENDP

这个问题与C如何根据内存模型调用函数有关。在大内存模型中,所有函数调用都是
far
。在尝试调用它时,我没有在
grph_256cls
子例程上标记这个假设,因此没有将正确的值推送到堆栈上/从堆栈上弹出的代码被组装起来。

注意,在大型代码模型中,函数调用在堆栈上推送一个四字节的返回地址。在代码< >颜色> <代码>和<代码> gpp>代码>中,参数最初是<代码> [BP+4 ] 和<代码> [BP+6 ] < /代码>,在栈上推送两个字节的返回地址,所以我在每个字节中增加了两个字节。您需要显示完整的代码,以及构建和运行它所采取的所有步骤,这样我们就可以重现这个问题。如有必要,将调用此函数的C代码减少到再现问题所需的最小值。请确保您帖子中的代码与您使用的代码完全相同。只是猜测一下:TASM可能需要在大型模型中使用显式的
retf
。我将它们全部替换为
retf
s,这没有什么区别。然而,我发现如果我完全跳过
grph_cls256
,就不会发生崩溃。这与C的期望无关,因为调用
grph_256cls
@RossRidge的不是C代码,但它确实如此。TASM是根据C的期望自动调整的。@Joshua不,不是。这就是问题所在,如果是的话,它会一直这样做。@RossRidge:PROC vs PROC FAR是如何改变你的记忆模型的。在他改变这一点之前,他的改变是在两种非工作状态之间振荡的,这两种非工作状态源于混合记忆模型。@Joshua不,这不是他所做的改变。
grph_cls256 PROC FAR
  ...
grph_cls256 ENDP