- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设这是我的程序 simpleCsharp.exe:
namespace simpleCsharp
{
public class Program
{
public static int Main(string[] args)
{
uint x = 0xFEFEFE;
uint y = 0xEEEEEE;
uint z;
uint[] list = { 0, 1, 2, 4, 8 };
uint[] array = { 0xA, 0xB, 0xC, 0xD };
z = x + y + list[2] + array[1];
z = z - (y << 1);
return 0;
}
}
}
如果我在调试的反汇编窗口中查看简单 C# 程序的反汇编,native code输出至少有一定意义。例如,以下是 Debug 对 Main 的反汇编,并启用了优化:
uint x = 0xFEFEFE;
00000000 push ebp
00000001 mov ebp,esp
00000003 sub esp,28h
00000006 xor eax,eax
00000008 mov dword ptr [ebp-14h],eax
0000000b mov dword ptr [ebp-18h],eax
0000000e mov dword ptr [ebp-4],ecx
00000011 cmp dword ptr ds:[037D14ACh],0
00000018 je 0000001F
0000001a call 763B370F
0000001f xor edx,edx
00000021 mov dword ptr [ebp-0Ch],edx
00000024 xor edx,edx
00000026 mov dword ptr [ebp-1Ch],edx
00000029 xor edx,edx
0000002b mov dword ptr [ebp-20h],edx
0000002e xor edx,edx
00000030 mov dword ptr [ebp-8],edx
00000033 xor edx,edx
00000035 mov dword ptr [ebp-10h],edx
00000038 mov dword ptr [ebp-8],0FEFEFEh
uint y = 0xEEEEEE;
0000003f mov dword ptr [ebp-0Ch],0EEEEEEh
uint z;
uint[] list = { 0, 1, 2, 4, 8 };
00000046 mov edx,5
0000004b mov ecx,79882916h
00000050 call FD95FD70
00000055 mov dword ptr [ebp-24h],eax
00000058 lea ecx,[ebp-14h]
0000005b mov edx,37D25E0h
00000060 call 761A4716
00000065 lea eax,[ebp-14h]
00000068 push dword ptr [eax]
0000006a mov ecx,dword ptr [ebp-24h]
0000006d call 761A47F3
00000072 mov eax,dword ptr [ebp-24h]
00000075 mov dword ptr [ebp-1Ch],eax
uint[] array = { 0xA, 0xB, 0xC, 0xD };
00000078 mov edx,4
0000007d mov ecx,79882916h
00000082 call FD95FD70
00000087 mov dword ptr [ebp-28h],eax
0000008a lea ecx,[ebp-18h]
0000008d mov edx,37D25ECh
00000092 call 761A4716
00000097 lea eax,[ebp-18h]
0000009a push dword ptr [eax]
0000009c mov ecx,dword ptr [ebp-28h]
0000009f call 761A47F3
000000a4 mov eax,dword ptr [ebp-28h]
000000a7 mov dword ptr [ebp-20h],eax
z = x + y + list[2] + array[1];
000000aa mov eax,dword ptr [ebp-8]
000000ad add eax,dword ptr [ebp-0Ch]
000000b0 mov edx,dword ptr [ebp-1Ch]
000000b3 cmp dword ptr [edx+4],2
000000b7 ja 000000BE
000000b9 call 763B6900
000000be add eax,dword ptr [edx+10h]
000000c1 mov edx,dword ptr [ebp-20h]
000000c4 cmp dword ptr [edx+4],1
000000c8 ja 000000CF
000000ca call 763B6900
000000cf add eax,dword ptr [edx+0Ch]
000000d2 mov dword ptr [ebp-10h],eax
z = z - (y << 1);
000000d5 mov eax,dword ptr [ebp-0Ch]
000000d8 add eax,eax
000000da sub dword ptr [ebp-10h],eax
return 0;
000000dd xor eax,eax
000000df mov esp,ebp
000000e1 pop ebp
000000e2 ret
但是,如果我在同一个 C# 程序集上运行 DUMPBIN(调试信息 =“无”,因此它不只显示字节),即
dumpbin "simpleCsharp.exe" /disasm /out:"simpleCsharp_dump.txt"
生成文件中的 native 代码输出甚至与我在调试的反汇编中看到的内容不太相似。我在 dumpbin 的文件中甚至没有看到来自调试反汇编的任何指令或值。因此(上面)的两行 native 代码无处可寻。无论我在 Visual Studio (2010) 生成的程序集上运行 dumpbin 还是使用 ngen.exe ,都会出现这种情况。 生成原生镜像,并对原生镜像文件simpleCsharp.ni.exe运行dumpbin。
优化在“调试”中开启,并且build设置为“发布”,我运行“调试”的程序集与我提供给 ngen 的程序集之间的唯一区别是“调试信息”=“无”。
dumpbin simpleCsharp.ni.exe /disasm
以下是我在 native 镜像文件上运行 dumpbin 时对 simpleCsharp 程序的反汇编:
https://docs.google.com/leaf?id=0B9u9yFU99BOcYjNmNGRmNTItZjQ0NC00YmI0LWEyZTQtNjdkNDdhYTc2MmNm&hl=en
我至少希望看到数字 FEFEFE 或 EEEEEE 显示在 dumpbin 的输出中的某个位置,并且它确实显示在调试反汇编中。
有人可以解释一下为什么我在 native 镜像文件的 dumpbin 输出中看不到同一个程序的 一行 行 Debug 反汇编代码吗?如果是因为优化,您介意提供一些细节吗?
谢谢
最佳答案
您忘记了即时编译器。程序集不包含机器代码,它是在运行时由程序集中的 IL 的抖动生成的。您可以使用 ildasm.exe 或 Reflector 等工具查看程序集中的 IL。 Dumpbin.exe 支持很差,它可以转储 CLR header ,仅此而已。
请注意,ngen-ed 图像包含通过抖动优化的机器代码。该优化器极大地改变了机器代码。调试器中的优化默认处于关闭状态。要查看它,您必须调试发布版本并更改调试器选项。工具+选项、调试、常规,取消选中“抑制模块加载时的 JIT 优化”选项。另请注意,生成的代码可能在某些地方完全不同,因为它是预编译的而不是即时编译的。抖动可以做得更好,因为它具有预先无法获得的知识。
关于.net - C# : why is DUMPBIN native code so different from Debug's Disassembly? 的反汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5539204/
code
正常吗?
我刚刚开始使用 YARD 来记录我的 Rails 应用程序。我没有指定任何特定的标记处理程序,但我希望 `code` 会转换为 code,但这似乎没有发生。这是正常行为吗?我是否必须添加一些额外的选项
什么是Code-Server 首先程序员朋友们肯定都用过来自微软的VS Code 这款轻量而又高级的编辑器,拥有丰富的插件库,支持各种语言编译运行。而本文介绍的Code-Server就是coder 公
我是一名高中生,今年开始学习汇编。 我目前正在制作 Pacman 克隆作为我的最终项目。 我遇到的唯一问题是我的代码很大,*.exe 文件几乎有 64KB。 所以我的问题是,如果我转向模型介质,我需要
锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 挑战 按字符计数绘制 Code 39 条码的 ASCII 表示的最短代码。 维基百科关于代码 3
我正在开发 VS 代码的扩展(使用 javascript)。现在我需要安装 VS Code 的路径。 windows有一种方法: var child = require('child_process'
[Windows 10] 我在自定义目录中安装了“Microsoft VS Code(用户设置)”,每当我尝试更新它时,都会显示: 然后这个 Log Info Dec 23 11:42:40.673
我正在尝试更新我的 VS 代码,但收到一条错误消息:由于防病毒软件和/或进程失控,更新可能会失败。 附加了一个来 self 的用户的日志文件,但我不确定要检查什么。我对计算机和编程还是个新手。 最佳答
几天前我安装了 Kali Linux。我正在尝试使用 Code-OSS 而不是 VSCode,因为最新版本的 Kali 没有安装普通版本所需的库。 如果我尝试使用 code-oss . 或 code
我正在从 Atom 迁移到 VS Code,因为这似乎是当今所有酷 child 都在使用的东西。 在 atom 中,我能够如图所示突出显示当前行号(装订线中的蓝色突出显示)。 有没有办法在 VS Co
我试图找到一个明确的 G 代码语法规范,而不是单个 G 代码的含义,我无处不在的规范,我的意思是详细的语法规范,目的是编写解析器。 我编写解析器没有问题,我只是在寻找语法规范,例如。我知道您不必总是为
我想在 VS Code (Windows) 中使用 Fira Code,并且已经按照 instructions 中的说明配置了字体。 。不知何故,字体看起来很模糊。我该如何解决这个问题? "edito
这个问题已经有答案了: How can I navigate back to the last cursor position in Visual Studio Code? (16 个回答) 已关闭
如何选择当前单词,即插入符号所在的位置。 注意:我正在寻找 Visual Studio Code(VS Code)(文本编辑器)的快捷方式,而不是 Visual Studio IDE。 最佳答案 在
我需要在 VS Code 中安装 flutter 但在安装扩展中,我有这个错误 Unable to install 'Dart-Code.flutter'; there is no available
memberData
有什么区别
{@code memberData} 和有什么区别?和 memberData在 JavaDoc 中 最佳答案 有两个主要区别: {@code ...}更简洁:更易于阅读(和输入)。 {@code ..
我有这样一个字符串: Here is my code sample, its not too great: [CODE] [/CODE] I hope you enjoy. 现在我想用 highli
在 VS Code 中,我有一个少于 50 个文件的 Vue 项目,但是在运行开发服务器时 VS Code 抛出 Error: ENOSPC: System limit for number of f
Source Code Pro 如何在 VSC 中使用 ExtraLight ~? 似乎以下不起作用...... 我确定我有字体。 Source Code Pro ExtraLight 最佳答案 编辑
我对 Visual Studio Code 很陌生。我正在尝试调试一个已经存在的应用程序,我已经通过 Git 克隆了它。我的文件都没有被修改。我已经下载了微软扩展“C# for Visual Stud
Visual Code VS Visual Studio Code Insider 我还是不明白这两者有什么区别,难道其中一个是新功能的试用版吗? 最佳答案 Visual Studio Code In
我是一名优秀的程序员,十分优秀!