30天自制操作系统(pdf+epub+mobi+txt+azw3)

1.jpg

第三个数字的存放地址:[ESP + 12]

第四个数字的存放地址:[ESP + 16]

(以下略)

我们想取得用参数指定的数字0x1234或0x56的内容,就用MOV指令读入寄存器。因为CPU已经是32位模式,所以我们积极使用32位寄存器。16位寄存器也不是不能用,但如果用了的话,不只机器语言的字节数会增加,而且执行速度也会变慢,没什么好处。

在指定内存地址的地方,如果使用16位寄存器指定[CX]或[SP]之类的就会出错,但使用32位寄存器,连[ECX]、[ESP]等都OK,基本上没有不能使用的寄存器。真方便。另外,在指定地址时,不光可以指定寄存器,还可以使用往寄存器加一个常数,或者减一个常数的方式。另外说一下,在16位模式下,也能使用这种方式指定,但那时候没有什么地方用得上,所以没有使用。

如果与C语言联合使用的话,有的寄存器能自由使用,有的寄存器不能自由使用,能自由使用的只有EAX、ECX、EDX这3个。至于其他寄存器,只能使用其值,而不能改变其值。因为这些寄存器在C语言编译后生成的机器语言中,用于记忆非常重要的值。因此这次我们只用EAX和ECX。

这次还给naskfunc.nas增加了一行,那就是INSTRSET指令。它是用来告诉nask“这个程序是给486用的哦”,nask见了这一行之后就知道“哦,那见了EAX这个词,就解释成寄存器名”。如果什么都不指定,它就会认为那是为8086这种非常古老的、而且只有16位寄存器的CPU而写的程序,见了EAX这个词,会误解成标签(Label),或是常数。8086那时候写的程序中,曾偶尔使用EAX来做标签,当时也没想到这个单词后来会成为寄存器名而不能再随便使用。

上面虽然写着486用,但并不是说会出现仅能在486中执行的机器语言,这只是单纯的词语解释的问题。所以486用的模式下,如果只使用16位寄存器,也能成为在8086中亦可执行的机器语言。“纸娃娃操作系统”也支持386,所以虽然这里指定的是486,但并不是386中就不能用。可能会有人问,这里的386,486都是什么意思啊?我们来简单介绍一下电脑的CPU(英特尔系列)家谱。

8086→80186→286→386→486→Pentium→PentiumPro→PentiumII→PentiumIII→Pentium4→…

从上面的家谱来看,386已经是非常古老的CPU了。到286为止CPU是16位,而386以后CPU是32位。


声明:

推书365展示内容收集于网络,仅用于免费的知识分享交流和学习!版权归出版方所有。

如有侵权,请联系本站进行删除,感谢您的理解与包容!

如果您喜欢本站推荐书籍等资源,请支持购买正版,谢谢合作!