Sak*_*ick 5 assembly masm x86-16
我是8086汇编语言的初学者.我可以理解程序中使用的逻辑并自己编写小程序.但我只是想知道这是做什么的:
.model small
.stack 300h
Run Code Online (Sandbox Code Playgroud)
.model的解释是什么?
我在用masm.
随着.model tiny你得到一个程序,其中CS,DS并且SS都指向相同的64KB内存.堆栈位于此64KB段的最高区域.
随着.model small你获得一个程序,其中CS指向它自己的一个段,然后是指向DS和SS指向的段.堆栈放置在SS段的最高区域.
该指令.stack 300h告诉MASM堆栈的大小,因此MASM可以在程序的其余部分(数据,bss,堆)与堆栈冲突时发出警告.
在这两个模型中,所有对数据项的访问都是使用近指针完成的.
由于8086是16位架构,它在访问超过64KB的内存时存在困难。
使用指针最有效的方法是使用专用的 16 位寄存器(如bx)。但是,当您的程序想要访问超过 64 KB 时,它还必须使用段寄存器(如es)。为了允许两种寻址方式,发明了存储器模型。
因此,该指令.model small告诉汇编器您打算使用小型内存模型 - 一个代码段、一个数据段和一个堆栈段 - 并且段寄存器的值永远不会改变。
它具有以下功效:
您可以将指令retn(从near子程序返回)编写为ret. 因为汇编器知道你的所有代码都在同一个段中,所以你的所有子例程都将是near(即有一个 16 位地址),并且所有ret指令都意味着retn.
听起来很愚蠢而且微不足道?请继续阅读。
如果您的代码分散在多个源文件中,您将获得call调用汇编程序一无所知的子例程的指令。当你使用小内存模型时,它至少知道每个子程序都有一个16位地址,并且可以使用近调用操作码。
您可以在不声明内存模型的情况下编写代码,但是您必须这样做,call near而不仅仅是call.
如果所有源文件都声明了.model small,链接器将获取所有代码段并尝试将它们全部装入 64 KB(数据段相同)。如果东西太大,这可能会失败。
小型汇编程序通常不关心内存模型 - 64 KB 代码足以编写复杂的程序,除非您使用大型外部库。在这种情况下,.model small可能意味着“我不关心内存模型的东西,只需使用默认值”。