8086程序中的.model small是什么意思?

What is meaning of .model small in 8086 programs?

我是8086汇编语言的初学者。能看懂程序中使用的逻辑,自己写小程序。但我只想知道这是做什么的:

.model small
.stack 300h

.model small 的解释是什么?

我正在使用 masm

使用 .model tiny 你得到一个程序,其中 CSDSSS 都指向相同的 64KB 内存。堆栈位于这个 64KB 段的最高区域。

使用 .model small 你会得到一个程序,其中 CS 指向它自己的一个段,然后是 DSSS 指向的段。堆栈位于 SS 段的最高区域。

指令 .stack 300h 告诉 MASM 堆栈的大小,因此 MASM 可以在程序的其余部分(数据、bss、堆)与堆栈发生冲突时向您发出警告。

在这两个模型中,所有对数据项的访问都是使用近指针完成的。

由于 8086 是 16 位架构,它很难访问超过 64 KB 的内存。

使用指针最有效的方法是使用专用的 16 位寄存器(如 bx)。但是,当您的程序想要访问超过 64 KB 时,它还必须使用段寄存器(如 es)。为了允许两种寻址方式,发明了 memory models

因此,指令.model small 告诉汇编程序您打算使用小内存模型——一个代码段、一个数据段和一个堆栈段——并且段寄存器的值永远不会改变。

具有以下作用:

  1. 您可以将指令 retn(来自 near 子程序的 return)写成 ret。因为汇编程序知道你所有的代码都在同一个段中,所以你所有的子例程都将是 near(即具有 16 位地址),并且所有 ret 指令表示 retn

    听起来很愚蠢和微不足道?继续阅读。

  2. 如果您的代码分散在多个源文件中,您将有 call 条指令调用汇编程序一无所知的子例程。当你使用小内存模型时,它至少知道每个子程序都有一个 16 位地址,并且可以使用 near 调用操作码。

    您可以在不声明内存模型的情况下编写代码,但是您必须 call near 而不仅仅是 call

  3. 如果您所有的源文件都声明了.model small,链接器将获取所有代码段并尝试将它们全部放入 64 KB(数据段也是如此)。如果东西太大,这可能会失败。

小型汇编程序通常不关心内存模型 - 64 KB 代码足以编写复杂程序,除非您使用大型外部库。在这种情况下,.model small 可能意味着“我不关心内存模型的东西,只使用默认值”。