c语言 汇编

C语言不是可以直接操作硬件吗 那为什么还要编译成汇编啊 求解惑
2025-03-12 15:13:44
推荐回答(4个)
回答1:

无论什么语言(包括C语言)最终都要被编译成2进制的机器码,但不是汇编。
你所谓的汇编只不过是在人阅读机器码的时候的一种显示方式,否则你总不能分析Exe文件的时候显示一串串的2进制或16进制的数字吧,那样太复杂了。
之所以要用汇编语言的方式来表示机器码是因为汇编与机器码之间可以互相对应。如果你有好的反编译器甚至可以把Exe文件反成C语言,到时候你可能会问:
“XX语言不是可以直接操作硬件吗 那为什么还要编译成C语言啊 ”

反正操作硬件与你用什么语言是没有直接联系的,只不过是方便不方便的问题。
并且在Windows里直接操作硬件是被禁止的,因为你的程序是运行在操作系统里的一个附属程序(暂且这么说吧),它每次对硬件的访问都会被操作系统甄别,如果不允许的话要么访问失败,要么出非法指令之类的错误。

在VC程序里嵌入汇编指令(也就是明确的机器码)的方式是:
__asm
{
pushad
....
....
....
popad
}

回答2:

C语言能直接操作硬件?能直接操作的只有电而已,这个电在软件上控制就是用二进制代码,然而二进制代码是看不明白的,所以发明了汇编来记忆。C只是汇编上更高一成,是高级语言,他要进行操作,要向低级语言翻译,最后被翻译成二进制,放到内存中执行~

回答3:

C语言可移植性好,易于读懂,但效率相对较低。当时序要求非常严格时,需要利用汇编语言来实现。再者,实际上是先有了汇编语言,后来才出现C的。

回答4:

如何将一个用户源文件变为一个可在内存中执行的程序:
首先是要编译,由编译程序将用户源代码编译成若干个目标模块;其次是链接,由链接程序将编译后形成的一组目标模块,以及它们所需要的库函数链接在一起,形成一个完整的装入模块;最后是装入,由装入程序将装入模块装入内存。
这是我的《操作系统》课本的话。
我的观点是:源程序不是编译成汇编,而是目标模块(由二进制组成)。C语言是不能直接操作硬件的。