浮点运算和x86及x64环境
我们在VisualStudio过程上下文(X86上下文)和VisualStudio上下文(X64上下文)中运行了一些代码.我注意到以下代码在上下文中提供了不同的结果(x86中的100000000000和x64中的99999997952) float val = 1000f; val = val * val; return (ulong)(val * 100000.0f); 我们需要以可靠的方式从浮点价值中获得ulong 的方式,无论上下文和ulong的价值如何,它都是出于哈希目的.我在x64和x86上下文中测试了此代码,并且确实获得了相同的结果,它看起来可靠: float operandFloat = (float)obj; byte[] bytes = BitConverter.GetBytes(operandFloat); Debug.Assert(bytes.Length == 4); uint @uint = BitConverter.ToUInt32(bytes
0 2024-04-16
编程技术问答社区
检测cpu架构的正确方法?
我正在尝试检测正确的CPU体系结构,以安装X86 MSI或X64 MSI文件. 如果我是对的,那么对于MSI,我需要OS CPU架构 我不确定自己的方式是否正确,因为我无法测试它. 你怎么看? private static string GetOSArchitecture() { string arch = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); string archWOW = System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"); if(archWOW != null && archWOW != "" && archWOW.Contains("64")) return "x64"; if(arc
0 2024-04-16
编程技术问答社区
即使条件评估为假,If 语句似乎也在评估。
昨晚的工作很晚,我们试图弄清楚为什么某些事情失败了.验证检查在不应该的情况下失败. 我们最终在此代码中添加了打印语句(从反射器拆卸以检查代码实际上是我们写的): public static string Redacted(string name, DateTime lastModified) { long ticks = lastModified.Ticks; if ((ticks != (ticks - (ticks % 10000L))) && (lastModified != DateTime.MaxValue)) { Log.Debug(string.Format("Last Modified Date = '{0}'. Ticks = '{1}'. TicksCalc = '{2}'", lastModified.ToString("dd/MM/yyyy hh:mm:ss.fff
0 2024-04-15
编程技术问答社区
任何依赖C++的CPU/依赖本地C dll的CLI(任何cpu用于C++/cli)。
这是我的问题. 我将C dll包裹在C#中.为此,我首先写一个C ++/CLI包装器.本机C库链接到C ++/CLI包装器. (C ++/CLI项目中的Linker属性). 这是现在的组织方式: - 本机c .lib:x86和64bit. 1个包含2个项目的解决方案: C ++/CLI包装器项目链接到本机c .lib C#项目引用C ++/CLI项目 我的问题来自我需要C#以"任何CPU"为目标的事实.但是此选项在C ++/CLI中不可用,因为它直接编译为本机代码. 我解决这个问题的想法是: - 在X86中编译C ++/CLI包装器,然后将配置和编译为64位.当它编译时,我想告诉它,根据平台要进行哪个DLL.即:如果以64位编译,则链接64位本机C dll,如果x86,则链接x86本机C. - 这样做,我应该能够在我的C#平台中具有任何CPU目标.再次,我将基于目标平台引用所需的DLL,而不是引用我的C ++/CLI包装器项目. 我的问题是: 我如
0 2024-04-14
编程技术问答社区
用于.NET的汇编库,将运行时变量字符串汇编成机器代码,用于注入。
我可以通过C#打电话x86汇编器吗?我希望能够将X86指令作为字符串传递,然后再获得一个字节阵列.如果一个人不存在,我该如何制作? 要清楚 - 我不想 call 从C# - 我只想能够从说明组装代码并在字节数组中获取机器代码. 我将注入此代码(将被生成即时生成),以完全注入另一个过程. 解决方案 作为我在个人项目上进行的一些早期原型制作的一部分,我编写了很多代码来执行这样的事情.它不需要字符串 - x86 opcodes是x86writer类中的方法.它根本没有记录下来,而且几乎没有完全覆盖范围,但是如果这是有趣的话,我愿意根据新的BSD许可开放源. . 更新: 好的,我已经创建了该项目 - managed.x86 其他解决方案 请参阅此项目: https://github.com/zenlulz/memorysharp 这个项目包裹了FASM组装程序,该项目用汇编编写,并作为Microsoft Coff对象编译为C ++项目包裹,然后再次
0 2024-04-13
编程技术问答社区
在64位机器上以32位方式运行C#应用程序
如何强制我的应用程序在64位机器上以32位运行? 代码写在C#. 中 解决方案 右键单击您的项目,然后选择属性. 在属性中,选择"构建"选项卡.在平台目标下,选择x86. hit ctrl + shift + s 要保存所有文件.此后的任何构建应为32位 其他解决方案 命令行形式: corflags application.exe /32BIT+ (参考: https:https:https:https:https:https://learn.microsoft.com/en-us/dotnet/framework/tools/corflags-exe-corflags-conversion-tool-tool ) 其他解决方案 这是当我们无法将现有代码从 到 x86 上的任何CPU 上方更改为 clickonce 限制: 创建一个32位(必须在项目属性下检查x86)"启动器"应用程序(Windows应用程序,但不形式):
2 2024-04-12
编程技术问答社区
Entity Framework在x64上的启动速度比x86慢很多
我的同事昨天发布了这个问题: 7秒启动时间,即使是Tiny dbContext . 采用他的代码并将其移至单独的解决方案以尽可能隔离它后,我发现包含项目的平台目标对EF启动过程的运行时间产生了深远的影响. 靶向X64时,我看到该测试花费了约7秒的时间来旋转第一个dbcontext,. 鉴于此,在定位64位系统与32位系统时,实体框架似乎正在经历一个截然不同的初始化过程.有人对引擎盖下发生的事情有任何了解吗? 解决方案 该问题是完全可重现的.我刚刚运行它,并使用Dottrace Performance Profiler收集X86和X64执行的快照.我大部分时间与您报告的时间相同.但是,X64和x86痕迹之间确实没有明显的区别 - 除了X64至少需要到处x86的两倍. 但这是对Nunit测试的追踪.通过运行与控制台应用程序相同的测试,我得到这样的时间: x86: 0,6864012, 0,0468001 x64: 1,0608019, 0,0468001
0 2024-04-12
编程技术问答社区
加载x86或x64汇编
我有两个版本的system.data.sqlite.dll-用于x86和x64平台. X86版本保留在应用程序文件夹中,X64版本保留在AppFolder \ X64文件夹中. 该应用程序编译为AnyCPU. 如何根据Windows平台加载SQLite的需要版本? 解决方案 如果您正在使用 http://system.data.sqlite.org System.Data, .sqlite.dll已完全管理.有一个基本的本机DLL SQLITE.Interop.dll,需要根据过程(32或64位)更改. i在" 64位"和".\ asnation \ x64"中部署本机库中的32位.在运行时P/Indoke setDlldirectory,以设置指向该过程的正确路径的DLL加载目录. http://msdn.microsoft.com/en-en-us/library/library/ms686203 (v = vs.85).aspx (请注意,我不熟悉 http:/
0 2024-04-12
编程技术问答社区
快速查找64位整数中最重要和最不重要的位集的方法
在Stackoverflow上有很多问题. 很多.但是我找不到答案: 在C# 中工作 适用于64位整数(而不是32位) 比: 快 private static int Obvious(ulong v) { int r = 0; while ((v >>= 1) != 0) { r++; } return r; } 甚至 int r = (int)(Math.Log(v,2)); 我在这里假设64位Intel CPU. 一个有用的参考是 我正在追求可重复使用的功能,可以做类似于 _BITSCANFORWARD64 和 _bitscarreverseverse644 . 解决方案 根据我的评论,这是C#中的一个函数,以计算针对64位整数修改的领先零位. public static UInt64 CountLeadingZeros(UInt64 input) { if (in
0 2024-04-12
编程技术问答社区
.net框架错误 (HRESULT 0x8007000B)
我有一个C#应用程序,该应用程序写在带有Visual Studio2005的32位Windows XP机器上.该应用程序在Windows XP机器上运行良好,但是当我尝试在64位Windows 7 Professional机器上运行它时,我会得到以下内容启动时对话框: 这是详细信息的全文. See the end of this message for details on invoking just-in-time (JIT) debugging instead of this dialog box. ************** Exception Text ************** System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B) at I
0 2024-04-11
编程技术问答社区
在一个程序中结合32位和64位DLLs
我需要加载.dll文件中提供的不同硬件驱动程序. 问题似乎是一个设备的驱动程序是在64位DLL中给出的,另一个设备(却旧的)显然依赖于32位DLL中给出的驱动程序.我想通过C#编写的程序来控制它们,该程序将通过Python包装器运行. 显然,我无法直接从一个程序中运行两个设备,但是我需要一种方法来互相解决它们 - 例如:设备1等待设备2完成一些工作.有什么方法可以绕过这个问题,或者我需要在两个单独的程序中运行它们,并根据Python包装器彼此管理操作? 解决方案 在64位Windows 64位进程上无法使用32位DLL,而32位进程不能使用64位DLL. Microsoft具有记录了 在64位窗口上,一个64位进程无法加载32位动态链接库(DLL).此外,32位过程无法加载64位DLL. 您将需要一个32位的过程,该过程与32位DLL和64位过程进行通信以与64位DLL通信.微软这样说: 但是,64位Windows支持64位和32位进程之间的远程过程调用(
0 2024-04-11
编程技术问答社区
如何逐个字符地遍历一个字符串?
i有一个C程序,该程序从标准输入中接收一个字符串,并将其传递给以32位X86组件编写的函数,该功能必须按照以下操作进行操作: 检查字符串是否仅由字母数字组成. 如果上一个测试的答案是肯定的,请返回字符串,因为它是 如果有一些非字母数字字符,该功能必须用空格删除它们. 一旦检查了字符串中的每个字符,函数就必须返回一个没有非字母数字字符的字符串. 这里是该例程必须做什么的示例: "only 4lph4numeric chars" INPUT "only 4lph4numeric chars" OUTPUT "here*some*for$bidden_chars#" INPUT "here some for bidden chars" OUTPUT 我是组装的新手,但我知道如何比较角色,我认为删除其中一个足以用空白空间代替它. 真正的问题是我不知道如何按字符穿越字符串字符;我读过一些有关lods的东西,但我不了解如
0 2024-04-10
编程技术问答社区
基本C/X86汇编代码的分步说明指针取消和乘法
我今天来这里是因为我目前正在大学介绍x86的介绍.在此之前,我们的老师要求我们解释这部分代码. 我对它的基本理解是: eax将包含与y. 相关的内存区域的值 ECX将包含与EAX关联的内存区域的值,即 指向y. imul将乘以指针eax的值(即指向y的指针)和x. 的值 我们在EDX中移动Y的指针,然后我们将乘法的值移至Y. 的指针 我对吗?如果没有,有人可以更好地解释我误解的部分吗? 预先感谢您. 解决方案 与任何汇编器一样,您几乎需要坐在手头上的ISA手册中,因为每个说明都带有很多口味,具体取决于您传递的内容. 首先查看``dword ptr`含义''是什么意思?位访问某个地址的内容. 由于y是指针,因此y的内容是可以找到*y的地址.因此,首先,y地址将移至eax,然后将其上传到eax的地址的内容将移至ecx. . imul带有两个操作数的imul是这样的: 两面的形式.使用此表单,目标操作数(第一操作数)乘以源操作数(第二操作
2 2024-04-10
编程技术问答社区
x86-64汇编到C语言
我尝试将其转换为C,但我陷入了内存地址的位移(%rdi): program: movq (%rdi), %rax testq %rax, %rax je L1 addq $8, %rdi movq %rax, %rdx L3: cmpq %rdx, %rax cmovl %rdx, %rax addq $8, %rdi movq -8(%rdi), %rdx testq %rdx, %rdx jne L3 L1: ret 到目前为止,我想到了关注: int func(int *x){ int ret = *x; if(ret != 0){ x+=8; //is this true? y = ret; while(y!=0){ if(ret
0 2024-04-10
编程技术问答社区
x86-如何在Inline汇编中使用for循环向数组中插入数值
我被分配的一个练习之一是将数组的值从0设置为0到9,并使用尽可能多的内联装配打印总和.我在内联汇编方面几乎没有经验,并且已经用尽了尝试找到解决方案的研究. 这是我到目前为止的代码.但是,当我尝试运行应用程序时,它没有任何错误,但它会崩溃.我知道这是不完整的,但我不确定我的逻辑是否正确. #include int main(int argc, char **argv) { int *numbers; int index; __asm { // Set index value to 0 mov index, 0 // Jump to check jmp $CHECK_index // Increment the value of index by 1 $INCREMENT_index: inc index
0 2024-04-10
编程技术问答社区
查看链接器对可执行二进制文件使用的确切内存范围
我正在做一些OSDEV,并且我一直在尝试在内核中实现内存管理.我从物理内存管理器开始(这是一个32位OS).这个想法是要保留一个钻头,我们每个4K物理内存块分配一点.如果位是" 1",则使用该块,如果" 0"为" 0",则不是.我认为这张桌子应该追随内核.所以这是我的内核代码(最小): #include #define PMMAP 0x1000 //This contains information from int 15h/E820 #define BLOCK_SIZE 4096 #define SECTOR_SIZE 512 #define SECTORS_PER_BLOCK 8 #define BLOCK_SIZE_B 12 #define SECTOR_SIZE_B 9 #define SECTORS_PER_BLOCK_B 3 void pmmngr_init(uint32_t kernelsize,uint32_t mapentrycount
0 2024-04-10
编程技术问答社区
在C语言中获取框架指针
我正在尝试在我的C程序中获得FP,我尝试了两种不同的方式,但是它们都与运行GDB时获得的不同. 我尝试的第一种方式,我在C中为汇编功能制作了协议函数: int* getEbp(); 我的代码看起来像这样: int* ebp = getEbp(); printf("ebp: %08x\n", ebp); // value i get here is 0xbfe2db58 while( esp
0 2024-04-10
编程技术问答社区
装配式印刷浮筒
我对汇编中的以下操作遇到了一些麻烦. 我正在研究组装IA32.假设-4(%ebp)= x和-8(%ebp)= y,我已经从用户那里获取它们. 这是代码: format1: .string "Multiply : %u * %u = %llu\n" format2: .string "Divide : %u / %u = %u\n" # operation multiply movl -4(%ebp), %eax mull -8(%ebp) pushl %edx pushl %eax pushl -8(%ebp) pushl -4(%ebp) pushl $format1 call printf # operation divide movl -4(%ebp), %eax divl -8(%ebp) pushl %eax pushl -8(%ebp) pushl -4(%ebp) push
0 2024-04-10
编程技术问答社区
在32位Open Watcom C中生成FAR跳转指令
我需要生成远的跳跃指令才能跳到另一个ISR(中断服务例程).我正在开发32位Freedos应用程序. 阅读OW手册后( cguide.pdff =" http://www.openwatcom.org/ftp/manuals/current/current/clr.pdf" rel =" nofollow"> clr.pdf ),我想出了两种成功编译的方法o任何警告或错误. /* Code Snippet #1 */ #pragma aux old08 aborts ; void (__interrupt __far *old08)(void); // function pointer declaration void __interrupt __far new08(void) { /* Do some processing here ... */ (*old08)(); /*
0 2024-04-10
编程技术问答社区