8086程序中.model小的含义是什么?

时间:2017-11-12 18:58:12

标签: assembly masm x86-16

我是8086汇编语言的初学者。我可以理解程序中使用的逻辑并自己编写小程序。但我只是想知道这是做什么的:

.model small
.stack 300h

.model small的解释是什么?

我正在使用masm

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:3)

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

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

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

它具有以下效果:

  1. 您可以将retn指令(从near子程序返回)写为ret。因为汇编程序知道您的所有代码都在同一个段中,所以您的所有子程序都是near(即具有16位地址),并且所有ret指令都表示retn。< / p>

    听起来愚蠢无足轻重?请继续阅读。

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

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

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

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