汇编程序8086中的内存使用情况

时间:2014-12-05 22:44:33

标签: memory assembly x86-16

我为我的课程在汇编程序8086中创建了一个程序,一切正常。 但除了制作工作程序之外,我们还必须尽可能地使用低内存。你可以在这方面给我一些提示吗?我应该写什么,我应该避免什么?

该程序应首先在屏幕上打印字母A,然后在每个新行中打印两个字母表中的下一个字母的字母,在Z处停止并在按下任何键结束程序之后。为了停止直到按下键,我使用: mov啊,00h int 16h 是不是这样做的好方法?

2 个答案:

答案 0 :(得分:1)

您想要的大部分内容都可以在零内存中完成(仅计算数据,而不是代码本身)。一般来说:

  • 在内存中使用寄存器而不是变量
  • 不要使用push / pop
  • 不使用子程序

但要与操作系统交互,您需要进行BIOS调用和/或OS系统调用;这些需要一些内存(通常是少量的堆栈空间)。在您的情况下,您必须:

  • 将字符输出到屏幕
  • 等待按键
  • 退回操作系统

但是,如果您认真考虑在最小内存中执行此操作,那么您可以使用一些黑客。

将字符输出到屏幕

在PC上,在传统文本模式下,您可以将字符直接写入视频RAM(地址B800:0000以及更远)。这需要零内存。

等待按键

最便宜的方法是等待更改BIOS键盘缓冲区头(更改地址041A hex的16位内容)。这需要零内存。 另见:http://support.microsoft.com/kb/60140

退回操作系统

尝试一个简单的ret;不推荐它,但可能只适用于某些版本的MS-DOS。一个更丑陋的逃脱是跳转到F000:FFF0,这将重启机器。这保证在零内存中工作。

答案 1 :(得分:0)

使用以下说明:

INC (Register*) instead of ADD (Register*), 1
DEC (Register*) instead of SUB (Register*), 1
XOR (Register)(same register) instead of MOV (Register), 0  (Doesn't work with variables)
SHR (Register*), 1  instead of  DIV (Register*), 2
SHR (Register*), 2  instead of  DIV (Register*), 4
..
SHL (Register*), 1  instead of  MUL (Register*), 2
..

*Register or variable

这些优化使程序更快,尺寸更大