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