我有一个关于如何build立我的视觉工作室build立多目标的困境。 背景:带有一个安装项目的p#调用第三方32位DLL,SQL compact v3.5 SP1的c#.NET 2.0版本。 目前,平台目标设置为x86,因此可以在Windows x64上运行。 第三方公司刚刚发布了他们的DLL的64位版本,我想build立一个专用的64位程序。 这提出了一些问题,我还没有得到答案。 我想要有完全相同的代码库。 我必须build立对32位DLL或64位DLL的引用。 (第三方和SQL Server Compact) 这可以解决与2套新的configuration(Debug64和Release64)? 我必须创build2个独立的安装项目(标准视觉工作室项目,没有维克斯或任何其他实用工具),或者可以在同一个.msi内解决? 任何想法和/或build议将受到欢迎。
我想确定本机程序集是否从托pipe代码应用程序( C# )编译为x64或x86。 我认为它必须在PE头的某个地方,因为OS加载器需要知道这个信息,但我找不到它。 当然,我更喜欢用托pipe代码来做,但如果有必要,我可以使用本机C ++。
AMD有一个ABI规范,描述了在x86-64上使用的调用约定。 除了拥有自己的x86-64调用约定的Windows,所有的操作系统都遵循它。 为什么? 有没有人知道这种差异的技术,历史或政治原因,还是纯粹是NIH综合征的问题? 我知道不同的操作系统可能对更高级别的东西有不同的需求,但是这并不能解释为什么例如Windows上的寄存器parameter passing顺序是rcx – rdx – r8 – r9 – rest on stack人都使用rdi – rsi – rdx – rcx – r8 – r9 – rest on stack 。 PS我知道这些调用约定是如何不同的,我知道在哪里可以find细节。 我想知道的是为什么 。 编辑:如何,见例如维基百科条目和从那里的链接。
我一直在阅读关于div和mul汇编操作,我决定通过在C: 文件分割 #include <stdlib.h> #include <stdio.h> int main() { size_t i = 9; size_t j = i / 5; printf("%zu\n",j); return 0; } 然后生成汇编语言代码: gcc -S division.c -O0 -masm=intel 但看着生成的division.s文件,它不包含任何div操作! 相反,它做了一些与位移和魔术数字的黑魔法。 这是一个计算i/5的代码片段: mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX movabs rdx, -3689348814741910323 ; Move some magic number to RDX (?) mul […]
今天我了解了x64程序集(资料来源: http : //x86asm.net/articles/x86-64-tour-of-intel-manuals/ ) 也许最令人惊讶的事实是,诸如MOV EAX,EBX之类的指令自动将RAX寄存器的高32位清零。 英特尔文档(3.4.1.1通用基本体系结构中的64位模式的通用寄存器)在同一来源中引用告诉我们: 64位操作数在目标通用寄存器中生成一个64位结果。 32位操作数产生一个32位结果,在目标通用寄存器中零扩展为一个64位结果。 8位和16位操作数生成8位或16位结果。 目标通用寄存器的高56位或48位(分别)不会被操作修改。 如果8位或16位操作的结果是用于64位地址计算的,则明确地将寄存器扩展为完整的64位。 在x86-32汇编中,16位指令如 mov ax, bx 不要performance出这种eax的上位字“零”的“奇怪”的行为。 因此:这种行为被引入的原因是什么? 乍一看这似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖)。
以下链接解释了UNIX(BSD flavor)和Linux的x86-32系统调用约定: http://www.int80h.org/bsdasm/#system-calls http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html 但是,UNIX和Linux上的x86-64系统调用约定是什么?
对我来说,这只是一个时髦的MOV。 它的目的是什么?我什么时候可以使用它?
我有一个.NET程序集的任意列表。 我需要以编程方式检查每个DLL是否为x86构建(而不是x64或任何CPU)。 这可能吗?