Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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_Cpu Architecture - Fatal编程技术网

C 装配时是否严格要求;“最低”;操作系统的一部分?

C 装配时是否严格要求;“最低”;操作系统的一部分?,c,assembly,operating-system,cpu-architecture,C,Assembly,Operating System,Cpu Architecture,我是一个中级(抽象)程序员,几个月前我开始考虑是否应该减少或增加抽象(我选择减少) 现在,我想我已经做了关于我需要什么的大部分“研究”,但仍然有一些问题 现在,虽然我“实际上什么都没做”,但我只是在强化我的C技能(买了“K&R C编程语言”),我想(在感觉舒服之后)开始学习操作系统(比如minix),只是为了学习,但我脑子里有一个想法,我真的不知道我是否应该在意 理论上(我认为,不确定),高级语言不能直接引用硬件(如寄存器、内存位置等),因此基本语言的“完美语言”应该是汇编语言 我已经学习汇编(

我是一个中级(抽象)程序员,几个月前我开始考虑是否应该减少或增加抽象(我选择减少)

现在,我想我已经做了关于我需要什么的大部分“研究”,但仍然有一些问题

现在,虽然我“实际上什么都没做”,但我只是在强化我的C技能(买了“K&R C编程语言”),我想(在感觉舒服之后)开始学习操作系统(比如minix),只是为了学习,但我脑子里有一个想法,我真的不知道我是否应该在意

理论上(我认为,不确定),高级语言不能直接引用硬件(如寄存器、内存位置等),因此基本语言的“完美语言”应该是汇编语言

我已经学习汇编(前一段时间)只是为了看看它是怎样的(我在书的中间停了下来,因为这本书使用了过时的调试器(汇编语言一步一步地为Linux!)),但是从我读到的,我不太喜欢这种语言。 因此,问题很简单:一个操作系统(引导加载程序/内核)可以在不涉及一行程序集的情况下编程,并且仍然有效吗

即使可以,它也不会是“跨架构”的,不是吗?(i386/arm/mips等)


感谢您的支持

您已经用“高级语言无法直接引用硬件”回答了您的问题

不管你是否想要,如果你想做一个操作系统,在某个时候你必须处理程序集/机器代码


中断和异常处理程序中必须包含一些汇编代码。因此需要调度程序(如果不是直接的,也可以是间接的)。以及系统调用机制。和引导加载程序。

无需组装即可完成大量工作。Linux或NetBSD不必为其运行的多个目标完全重写或修补。大多数代码都是可移植的,然后有抽象层,在抽象层下面有一个特定于目标的层。即使在特定于目标的层中,大多数代码也不是asm。我想消除这样一个错误想法,即为了为设备驱动程序(例如,您需要asm)编程寄存器或内存,您不需要将asm用于这些事情。您可以将asm用于处理器的指令,这些指令无法使用高级语言生成。或者2)高级语言生成的代码太慢。 例如,在ARM中,要启用或禁用中断,必须使用特定的指令访问处理器状态寄存器,因此需要asm。但是对中断控制器的编程都是用高级语言完成的。第二点的一个例子是,您经常发现在C库中,memcpy和其他类似的大量使用的库函数都是手工编码的asm,因为它的速度非常快


虽然您当然可以在ASM中编写和执行任何您想要的操作,但您通常会发现高级语言用于“直接访问硬件(如寄存器、内存位置等)”。你应该继续加强你的C技能,不仅仅是在K&R书中,还应该浏览各种C标准,你可能会发现有多少“实现定义”的项目,比如位字段,如何提升可变大小,仅仅因为你10年前写的一个程序使用某个特定品牌的编译器(msvc、gcc等)继续编译和工作,并不意味着代码是干净的、可移植的,并且可以继续工作。不幸的是,gcc教会了用户许多非常糟糕的编程习惯,当用户发现他们十年左右都不懂该语言,不得不重做如何使用该语言解决问题时,他们会感到震惊。

我在过去阅读网站和书籍时学到的是: a) 许多程序员不喜欢汇编语言,原因我们都知道。 b)OS的主要编程语言似乎是C和C++ C)汇编语言可以用于在C或C++中分析源代码(实际上不重要)

后加速代码 因此,在某些情况下,中级语言和低级语言的结合是不可避免的。例如,为等待用户输入而加速代码是没有用的。
如果为特定范围的计算机(AMD、INTEL、ARM、DIGITAL-ALPHA等)构建最短、最快的代码很重要,那么您应该使用assembler。我的意见是……

仅使用C,在x86上如何首先改变?打个电话怎么样?我不知道。当我读了Jeff Duntemann的书时,我已经研究了内存模型,但我真的不知道如何应用它们。这种操作超出了C语言规范/stdlib的范围。因此,这样说吧——处理器总是在某种硬件定义模式下从某个硬件定义的地址获取其第一条指令来启动。数据/堆栈段寄存器、堆栈指针等可能指向非法/不存在的内存,需要使用有效值初始化。没有外围芯片工作-没有内存管理,没有中断,没有定时器,除了启动代码什么都没有。“实际上,这将是汇编程序。”谢谢你的回答。事实上,这样做很有道理;)因此,当互联网上有人问某些语言是否适合制作操作系统(C++、VB、JAVA、C#等)时,他们也必须使用汇编来制作较低的级别?@Claudiop Yes。一切都需要“引导”。从技术上讲,它不必是汇编(因为人们可以通过其他方式假设生成机器指令),但这是迄今为止“最简单的”/“可接受的路线…”汇编/机器代码这是“异或”或“和”?若汇编是“丑陋的”,我真的无法想象机器代码…不,机器代码是美丽的。它包括