nar*_*tra 1 x86 assembly operating-system
这是一个来自破碎的刺操作系统开发系列的段落.有3行代码.加载到第二行需要512个字节,到第三行需要514个字节.我们怎么算这个呢?如果可能请给我一个链接,我可以详细阅读.提前致谢.
在汇编语言中,我们可以很容易地超越512字节标记.所以,代码看起来很好,但只有一部分会在内存中.例如,coinider这个:
mov ax, 4ch
inc bx ; 512 byte
mov [var], bx ; 514 byte
Run Code Online (Sandbox Code Playgroud)
在汇编语言中,执行从文件顶部向下开始.但是,请记住,在内存中加载文件时,我们正在加载扇区.这些扇区中的每一个都是512字节,因此它只会将512字节的文件复制到内存中.
如果上面的代码被执行,并且只有第一个扇区被加载到内存中,它将只复制到512字节(inc bx指令).所以,虽然最后一条mov指令仍在磁盘上,但它不在内存中!那么处理器在inc bx之后会做什么呢?它将继续到514字节.由于这不在内存中,它将执行超过我们文件的结尾!最终的结果?崩溃.
这个例子令人困惑.前两个指令只占用几个字节.作者假设它inc bx落在第512个字节上.通常,您必须汇编代码以了解x86的大小,因为操作码具有不同的长度(从1到大约7个字节[*]).您可以在代码之前和之后放置标签,然后减去它们以了解它的大小.
在其他体系结构(例如PowerPC)中,每条指令的大小都相同,您可以只计算它们并乘以4并且非常接近.
[*]我希望用冗长的x86前缀指令互相打几个回复......