你能用C语言表达什么?

时间:2014-04-09 17:21:33

标签: c assembly operating-system

我正在阅读现代操作系统第3版的西班牙语版本,有一个关于流程实现的部分说

  

“...保存寄存器和建立堆栈指针等操作   即使在像C这样的高级语言中也不能表达它们   在装配中用一个小例程制作......“

有人可以详细说明这个,并举例说明C语言不足以表达某些内容吗?感谢。

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

2 个答案:

答案 0 :(得分:3)

这个问题没有意义。在C中,你只能谈论C定义的事物,并且没有"寄存器"或" stack"在C.如果您正在谈论某些具体的硬件,您可以询问C编译器使用哪些硬件操作来实现C代码"但这是一个不同的,更具体的问题

答案 1 :(得分:1)

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

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

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

这些只是两个不同的例子,说明即使在现代系统中也需要汇编程序的地方和原因。我甚至没有涉及切换地址空间和它需要的刷新TLB ......