如何计算汇编代码所需的内存?

时间:2010-11-04 04:24:27

标签: assembly operating-system x86

这是一个来自破碎的刺操作系统开发系列的段落。有3行代码。加载到第二行需要512个字节,到第三行需要514个字节。我们怎么算这个呢?如果可能,请给我一个链接,我可以详细阅读。提前谢谢。

  

在汇编语言中,我们可以   轻松超越512字节标记。   所以,代码看起来很好,   但只有一部分会在   记忆。例如,coinider:

mov ax, 4ch
inc bx ; 512 byte
mov [var], bx ; 514 byte
  

在汇编语言中,执行   从文件的顶部开始   向下。但请记住,   在内存中加载文件时,我们是   装载部门。每一个   扇区是512字节,所以它只会   将512个字节的文件复制到   存储器中。

     

如果执行了上面的代码,那么只有第一个扇区   在内存中加载,它只会   复制到512字节(inc bx   指令)。所以,虽然最后一个mov   指令仍在磁盘上,不是   在记忆中!。             那么处理器在inc bx之后会做什么呢?它会很难   继续到514字节。就这样   它不在记忆中,它会执行   超过我们文件的结尾!结束   结果?崩溃。

3 个答案:

答案 0 :(得分:5)

这个例子令人困惑。前两个指令只占用几个字节。作者假设inc bx落在第512个字节上。通常,您必须汇编代码以了解x86的大小,因为操作码具有不同的长度(从1到大约7个字节[*])。您可以在代码前后放置一个标签,然后减去它们以了解其大小。

在其他架构中(例如PowerPC),每条指令的大小都相同,你可以只计算它们并乘以4并且非常接近。

[*]我希望用冗长的x86前缀指令多次回复...

答案 1 :(得分:3)

这篇文章是关于bootloader的。当您编写boot sector的代码(其大小为512字节)时,您必须小心使用最多512个字节(510,确切地说,因为最后2个字节用作签名)。

编辑:这3个指令有3个,1个和3个(或2个)字节。当这段代码已经以大偏移量开始时,他正在解释这个案例。

计算代码大小的常用方法是在代码块周围的两个标签之间取差异。

答案 2 :(得分:0)

用汇编语言编写的代码转换为CPU解释的处理器指令。根据Itel x86规范,指令可以是可变长度的。

我不确定这个答案是否完全正确,但它看起来似乎合理,所需的内存将代表所有汇编指令的总大小(以字节为单位),以及应用程序加载的任何数据