这是一个来自破碎的刺操作系统开发系列的段落。有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字节。就这样 它不在记忆中,它会执行 超过我们文件的结尾!结束 结果?崩溃。
答案 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规范,指令可以是可变长度的。
我不确定这个答案是否完全正确,但它看起来似乎合理,所需的内存将代表所有汇编指令的总大小(以字节为单位),以及应用程序加载的任何数据