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

Sak*_*ick 5 assembly masm x86-16

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

.model small
.stack 300h
Run Code Online (Sandbox Code Playgroud)

.model的解释是什么?

我在用masm.

Sep*_*and 7

随着.model tiny你得到一个程序,其中CS,DS并且SS都指向相同的64KB内存.堆栈位于此64KB段的最高区域.

随着.model small你获得一个程序,其中CS指向它自己的一个段,然后是指向DSSS指向的段.堆栈放置在SS段的最高区域.

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

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

  • @AayushNeupane 他们在默认情况下这样做。`.modelsmall` 指令带有*模型选项*。其中之一是您可以选择“NEARSTACK”或“FARSTACK”。默认选择“NEARSTACK”将堆栈段与数据一起分组为单个物理段(DGROUP)。**假设 SS 等于 DS**。您必须明确做出的另一个选择“FARSTACK”不会将堆栈与 DGROUP 分组;因此 SS 不等于 DS。 (2认同)

ana*_*lyg 5

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

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

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

它具有以下功效:

  1. 您可以将指令retn(从near子程序返回)编写为ret. 因为汇编器知道你的所有代码都在同一个段中,所以你的所有子例程都将是near(即有一个 16 位地址),并且所有ret指令都意味着retn.

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

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

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

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

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

  • 不确定您是否将“小”与“微小”混淆了。Small 可以有一个独立于 DS 的 CS。所以它可以寻址64kb的代码和64kb的数据(它们可以是同一个段,但不是必须的)。`tiny` 将所有内容限制为 64kb,并且当控制权转移到 COM 程序时,默认情况下 CS=DS=ES=SS = PSP 段。 (2认同)