我在我的C#代码中使用了一个特定的命令,该代码运行良好.但是,据说在"非托管"代码中行为不端.
什么是托管代码或非托管代码?
例如,在查看GlowCode分析器网站时,它说:
"GlowCode 6.2和x64配置文件本机,托管和混合C++,C#,.NET代码"
他们的意思是什么?
汇编,机器代码,字节码和操作码之间的实际关系是什么?
我看过最大约装配和机器代码的SO问题,比如这个,但他们太高水平和不显示的实际汇编代码示例被改造成机器代码.结果,我仍然不明白它是如何在更深层次上运作的.
这个问题的理想答案将显示一些汇编代码的具体示例,例如下面的代码段,以及每个汇编指令如何映射到机器代码,字节码和/或操作码.像这样的答案对未来的人们学习集会非常有帮助,因为在过去的几天挖掘中我没有找到任何明确的总结.
我要找的主要内容是:
注意:我没有计算机科学背景,所以我在过去的几年里一直在慢慢走低水平,现在已经到了想要了解装配和机器代码的程度.
装配与机器代码之间的关系
我目前的理解是"汇编程序"(如NASM)接收汇编代码并从中创建机器代码.
所以当你编译一些这样的程序集时example.asm:
global main
section .text
main:
call write
write:
mov rax, 0x2000004
mov rdi, 1
mov rsi, message
mov rdx, length
syscall
section .data
message: db 'Hello, world!', 0xa
length: equ $ - message
Run Code Online (Sandbox Code Playgroud)
(用它编译nasm -f macho64 -o example.o example.asm).它输出这个example.o目标文件:
cffa edfe 0700 0001 0300 0000 0100 0000
0200 0000 0001 0000 0000 0000 0000 …Run Code Online (Sandbox Code Playgroud) 我无法理解托管C++如何工作和编译.
在.NET Framework中,您可以使用C#/ VB/F#/ ..等开发代码.并且所有这些语言都将编译为与Java字节码类似的相同公共中间语言(CIL).从理论上讲,CIL可以安装在任何平台上(Mono使其实用).在Windows上,CLR将CIL编译为本机代码Just-In-Time(JIT),一切运行顺利,好用.
现在,Managed C++如何编译?它是否编译为CIL代码并等待CLR使用JIT运行它?我认为不是,因为托管C++可以使用标准C++代码(不编译为CIL).此外,它如何使用.NET程序集(CIL)?
我将不胜感激任何帮助.谢谢
编辑:
我看到了这个答案.它指出,在C++/CLI中,托管代码被编译为MSIL,您可以选择将非托管代码编译为本机代码或MSIL.因此,我现在明白如何调用.NET程序集.
无论如何,如果将非托管代码编译为本机代码,我仍然不明白如何在同一程序集中使用托管代码运行C++非托管代码.有任何想法吗?