Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么可以';你不能用C语言表达吗?_C_Assembly_Operating System - Fatal编程技术网

什么可以';你不能用C语言表达吗?

什么可以';你不能用C语言表达吗?,c,assembly,operating-system,C,Assembly,Operating System,我正在阅读西班牙版的《现代操作系统》第三版,其中有一节是关于流程实现的 “…保存寄存器和建立堆栈指针等操作 即使在像C这样的高级语言中也不能表示,相反,它们 在组装过程中使用一个小程序制作……” 有人能详细说明一下,给我举个例子,说明C语言不足以表达什么吗?谢谢 编辑:我想知道为什么你不能(根据书)使用C语言来编写ISR。这个问题没有意义。在C中,你只能谈论C定义的东西,而C中没有“寄存器”或“堆栈”这样的东西。如果你谈论的是某个具体的硬件,你可以问“C编译器使用哪些硬件操作来实现C代码”,但这

我正在阅读西班牙版的《现代操作系统》第三版,其中有一节是关于流程实现的

“…保存寄存器和建立堆栈指针等操作 即使在像C这样的高级语言中也不能表示,相反,它们 在组装过程中使用一个小程序制作……”

有人能详细说明一下,给我举个例子,说明C语言不足以表达什么吗?谢谢


编辑:我想知道为什么你不能(根据书)使用C语言来编写ISR。

这个问题没有意义。在C中,你只能谈论C定义的东西,而C中没有“寄存器”或“堆栈”这样的东西。如果你谈论的是某个具体的硬件,你可以问“C编译器使用哪些硬件操作来实现C代码”,但这是一个不同且更具体的问题。

这个问题没有意义。在C中,你只能谈论C定义的东西,C中没有“寄存器”或“堆栈”之类的东西。如果你谈论的是某个具体的硬件,你可以问“C编译器使用哪些硬件操作来实现C代码”,但这是一个不同的、更具体的问题。

像C这样的高级语言将程序定义为在抽象机器上工作。这个抽象机器没有不同虚拟地址空间、硬件中断或进程切换的概念。相反,它依赖于要设置的堆栈之类的东西

以堆栈为例:一旦堆栈设置正确,抽象机器就可以对其进行操作,但抽象机器中没有办法说:“从现在开始,将这一内存位用作堆栈,并在这个位置启动堆栈指针。”因此,在程序的最开始,需要一小段汇编代码来设置寄存器,该寄存器用作指向合理初始值的堆栈指针。运行该代码段后,它可以移交给以正常方式使用堆栈的代码

在汇编程序中需要注意的另一件事是中断处理:计算机的硬件可以向CPU发出需要注意的信号。CPU对此的响应是放弃当前执行(这可能发生在任意两条机器指令之间!),并将执行转移到中断处理程序。当这个中断处理程序被输入时,当前正在运行的进程在CPU寄存器中的所有数据仍然存在,没有其他地方。更糟糕的是,中断处理程序通常不知道程序实际上打算用它做什么。因此,中断处理程序必须先保存所有这些状态,然后才能执行任何其他操作。如果中断处理程序未能执行此操作,则无法恢复中断的进程。这需要对所有寄存器进行显式访问,并且需要一种保证不会进入任何未保存状态的语言,所以这必须在汇编程序中完成。保存状态后,可以将控制传递给用C编写的例程


这只是两个不同的例子,说明了即使在现代系统中,在何处以及为什么需要汇编程序。我甚至没有提到交换地址空间和刷新TLB,它需要…

像C这样的高级语言定义一个在抽象机器上工作的程序。这个抽象机器没有不同虚拟地址空间、硬件中断或进程切换的概念。相反,它依赖于要设置的堆栈之类的东西

以堆栈为例:一旦堆栈设置正确,抽象机器就可以对其进行操作,但抽象机器中没有办法说:“从现在开始,将这一内存位用作堆栈,并在这个位置启动堆栈指针。”因此,在程序的最开始,需要一小段汇编代码来设置寄存器,该寄存器用作指向合理初始值的堆栈指针。运行该代码段后,它可以移交给以正常方式使用堆栈的代码

在汇编程序中需要注意的另一件事是中断处理:计算机的硬件可以向CPU发出需要注意的信号。CPU对此的响应是放弃当前执行(这可能发生在任意两条机器指令之间!),并将执行转移到中断处理程序。当这个中断处理程序被输入时,当前正在运行的进程在CPU寄存器中的所有数据仍然存在,没有其他地方。更糟糕的是,中断处理程序通常不知道程序实际上打算用它做什么。因此,中断处理程序必须先保存所有这些状态,然后才能执行任何其他操作。如果中断处理程序未能执行此操作,则无法恢复中断的进程。这需要对所有寄存器进行显式访问,并且需要一种保证不会进入任何未保存状态的语言,所以这必须在汇编程序中完成。保存状态后,可以将控制传递给用C编写的例程


这只是两个不同的例子,说明了即使在现代系统中,在何处以及为什么需要汇编程序。我甚至没有提到交换地址空间和它需要的刷新TLB…

保存寄存器和建立堆栈指针
是C语言不足以表达某些内容的一个例子。具体地说,C语言与大多数高级语言一样,使用“隐藏”的堆栈和CPU寄存器,对用户隐藏,因此不能直接访问它们。@DoxyLover的类比很好。你坐在汽车的驾驶座上。如何调整气门正时?汽车的用户界面通常不会让您从驾驶员座椅上控制气门正时;即使在装有VTEC的汽车上,也没有直接的方法可以做到这一点。见鬼,如果你在RX7或特斯拉,可能一开始就没有阀门。气门正时是“发动机罩下”fe