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