Tag: 程序集

有关在组装中推送ebp和pop ebp指令的说明

我在程序集中使用堆栈,但我没有想到推ebp和pop ebp。 .intel_syntax noprefix .include "console.i" .text askl: .asciz "Enter length: " askb: .asciz "Enter breadth: " ans: .asciz "Perimeter = " _entry: push ebp # establishing stack-frame mov ebp, esp sub esp, 12 Prompt askl GetInt [ebp-4] # length Prompt askb GetInt [ebp-8] # breadth mov eax, [ebp-4] # eax = l add eax, […]

为什么生成AND指令?

对于这样的代码: int res = 0; for (int i = 0; i < 32; i++) { res += 1 << i; } 此代码生成(发布模式,没有附加debugging器,64位): xor edx,edx mov r8d,1 _loop: lea ecx,[r8-1] and ecx,1Fh ; why? mov eax,1 shl eax,cl add edx,eax mov ecx,r8d and ecx,1Fh ; why? mov eax,1 shl eax,cl add edx,eax lea ecx,[r8+1] and ecx,1Fh […]

Java程序包是否等同于.Net程序集?

我是一个为Android开发Java开发的.Net开发人员,想知道是否正确地考虑.NET程序包这样的Java程序包。

如何在GAC中列出所有注册的程序集?

如何列出GAC中的所有程序集? 我是否需要一个可以轻松查看的工具?

编译为C ++与C时,GCC代码生成的巨大差异

我一直在玩x86-64程序集,尝试了解更多可用的各种SIMD扩展(MMX,SSE,AVX)。 为了看看不同的C或C ++构造如何通过GCC转换为机器代码,我一直在使用Compiler Explorer ,它是一个非常出色的工具。 在我的一个“游戏会话”中,我想看看GCC如何优化整数数组的简单运行时初始化。 在这种情况下,我试图将0到2047的数字写入2048个无符号整数的数组中。 代码如下所示: unsigned int buffer[2048]; void setup() { for (unsigned int i = 0; i < 2048; ++i) { buffer[i] = i; } } 如果我启用优化和AVX-512指令-O3 -mavx512f -mtune=intel GCC 6.3生成一些真正聪明的代码:) setup(): mov eax, OFFSET FLAT:buffer mov edx, OFFSET FLAT:buffer+8192 vmovdqa64 zmm0, ZMMWORD PTR .LC0[rip] vmovdqa64 zmm1, ZMMWORD PTR .LC1[rip] .L2: […]

GetEntryAssembly为Web应用程序

Assembly.GetEntryAssembly()不适用于Web应用程序。 但是…我真的需要这样的东西。 我使用一些在web和非web应用程序中使用的深度嵌套代码。 我目前的解决scheme是浏览StackTracefind第一个被调用的程序集。 /// <summary> /// Version of 'GetEntryAssembly' that works with web applications /// </summary> /// <returns>The entry assembly, or the first called assembly in a web application</returns> public static Assembly GetEntyAssembly() { // get the entry assembly var result = Assembly.GetEntryAssembly(); // if none (ex: web application) if (result == null) { […]

VA(虚拟地址)&RVA(相对虚拟地址)

input到链接器的文件称为对象文件 。 链接器产生一个Image文件 ,这个文件又被加载器用作input。 从“ 微软可移植可执行文件和通用目标文件格式规范 ” RVA(相对虚拟地址) 。 在一个图像文件中,将一个项目的地址加载到内存中,并从中减去图像文件的基地址。 一个项目的RVA几乎总是不同于它在磁盘上文件的位置(文件指针)。 在目标文件中,RVA没有意义,因为内存位置未分配。 在这种情况下,RVA将是一个部分(稍后在此表中描述)中的地址,在链接期间稍后将对其应用重定位。 为了简单起见,编译器应该将每个部分中的第一个RVA设置为零。 VA(虚拟地址) 。 与RVA相同,不同之处在于不会减去映像文件的基址。 该地址称为“VA”,因为Windows为每个进程创build独立于物理内存的独特VA空间。 几乎所有的目的,一个VA应该被视为一个地址。 VA并不像RVA那样可预测,因为加载器可能不会将图像加载到其首选位置。 即使阅读了这个,我仍然不明白。 我有很多问题。 任何人都可以用实际的方式来解释它吗? 请遵守所述的Object File和Image File术语。 我所知道的地址就是这样 无论是在对象文件还是在图像文件中,我们都不知道确切的内存位置, 生成目标文件时,汇编程序计算相对于.data & .text (用于函数名称)部分的地址。 以多个目标文件作为input的链接器生成一个图像文件。 在生成时,首先合并每个目标文件的所有部分,并在合并时重新计算相对于每个部分的地址偏移量。 而且,没有什么东西像全球抵消。 如果我所知道的东西有问题,请纠正我。 编辑: 看完弗朗西斯的回答后,我很清楚什么是Physical Address,VA&RVA以及它们之间的关系。 链接器在重定位期间必须计算所有variables和方法的RVA。 那么, (一个方法/variables的RVA的值)==(它从文件开始的偏移量) ? 一定是真的 但令人惊讶的是,它不是。 为什么这样? 我通过在c:\WINDOWS\system32\kernel32.dll上使用PEView检查了这一点,发现: RVA和FileOffset是相同的,直到部分的开始( .text是在这个DLL的第一部分)。 从.text开始.data , .rsrc到最后一节( .reloc )的最后一个字节RVA和FileOffset是不同的。 也是第一段第一个字节的RVA总是显示为0x1000 […]

LEA或ADD指令?

当我手写汇编,我通常select的forms lea eax, [eax+4] 在forms上 add eax, 4 我听说lea是一个“0时钟”指令(如NOP),而“add”则不是。 但是,当我看编译器生成的Assembly时,我经常会看到后面的表单而不是第一个。 我足够聪明地信任编译器,那么谁能说明哪一个更好? 哪一个更快? 为什么编译器select后者的forms?

面向更高框架版本的Visual Studio 2010:参考程序集

当A针对.NET 3.5并且B针对.NET 2.0时,Visual Studio 2008确实允许您从程序集B引用程序集A Visual Studio 2010不再允许这个。 完整的问题在MSDN上描述: 您可以创build引用项目或程序集的目标不同版本的.NET Framework的应用程序。 例如,如果您创build了一个以.NET Framework 4 Client Profile为目标的应用程序,则该项目可以引用以.NET Framework 2.0版为目标的程序集。 但是,如果创build一个面向早期版本的.NET Framework的项目, 则不能将该项目中的引用设置为以.NET Framework 4 Client Profile或.NET Framework 4为目标的项目或程序集 。 为了消除错误,请确保应用程序定位的configuration文件与您的应用程序引用的项目或程序集定位的configuration文件兼容。 有没有什么办法可以让VS2010在这方面的行为像VS2008(即允许引用程序集针对更高的框架版本)? 我知道VS 2010行为背后的原因以及我需要注意的部署注意事项,不需要重复说明。 确切的错误是: 警告MSB3268:主要引用“xxx.dll”无法parsing,因为它有框架程序集“System.Core,版本= 3.5.0.0,文化=中立,PublicKeyToken = b77a5c561934e089”间接依赖项无法parsing目前的目标框架。 ” .NETFramework,版本= V2.0" 。 要解决此问题,请删除引用“xxx.dll”或将应用程序redirect到包含“System.Core,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”的框架版本。

如何加载reflection操作的.NET程序集,随后卸载它?

我正在编写一个工具来报告有关在我的客户端系统中部署的跨环境和区域的.NET应用程序的信息。 我想阅读这些程序集中的程序集属性的值。 这可以使用Assembly.ReflectionOnlyLoad来实现,但是即使这种方法也能保持程序集的加载。 这里的问题是我不能加载两个具有相同名称的程序集,所以自然不能比较在不同系统中部署的相同应用程序。 在这一点上,我假设解决scheme将涉及使用临时AppDomain的。 有人可以详细说明如何将程序集加载到另一个AppDomain ,从中读取属性,然后卸载AppDomain ? 这需要为文件系统上的程序集以及URL地址上的程序集起作用。