在操作系统的开发中,下列VC特性经常用到。
1.内嵌汇编代码
在开发操作系统时,经常在C或C++语言中嵌入汇编代码直接操作硬件,比如,进程或线程的切换、端口输入、各类CPU相关的硬件系统表(比如GDT、IDT等)的建立等,都需要使用内嵌的汇编代码来完成。因此,一个编译环境如果不支持内嵌汇编代码,则不适合OS的开发。
Microsoft Visual C++实现了对内嵌汇编代码的支持,在C源代码中,可以使用__asm关键字来嵌入汇编代码,比如:
在每个汇编语句的前面,都需要增加关键字__asm。
在汇编语句比较多的情况下,可以使用一个汇编语言块的格式把这些汇编语句组织起来:
一般情况下,内嵌的汇编代码一般用于操作底层的硬件,以及用于CPU硬件表格的初始化等工作。同时为了代码的可移植性,尽量不要使用内嵌汇编语句。
2.__declspec(naked)函数修饰
缺省情况下,Microsoft Visual C++编译器对函数进行编译的时候,会根据实际需要插入一些辅助的汇编代码,比如下面这个C语言函数。(www.xing528.com)
编译器编译成汇编代码后,可能会是下面的样子。
其中,黑色标记部分代码是编译器自动插入的。插入这样的代码后,堆栈框架就发生了变化,而且有的时候变得难以预料。而在OS的开发中,有时候则要求函数在被调用的时候,堆栈框架保持明确的结构,比如线程切换函数。这个时候,就需要通过一种特定的机制,来告诉编译器不要生成额外的代码,而__declspec(naked)可以达到这个目的。
当使用__declspec(naked)对上述函数修饰后,编译器将不增加任何代码,这样所有的控制都需要由程序设计者使用汇编语言完成。
有的时候,使用__declspec(naked)修饰函数是必须的,在OS的开发中,下列情况需要这种修饰。
(1)系统调用涉及线程切换时。
(2)中断处理函数。
(3)在操作硬件系统表格,如IA32的GDT/LDT/IDT时。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。