Articles of x86 64

如何将Linux 32位gcc内联汇编转换为64位代码?

我试图在Linux中使用gcc将RR0D Rasta Ring 0 Debugger从32位模式转换为64位模式(长模式)。 我熟悉x86 32位程序集(在MS-DOS环境下),但我是x86 64位程序集和Linux汇编程序devise的初学者。 此项目是为生产使用(我需要一个工作的非源代码debugging器),但我也试图学习如何做32位到64位转换。 如果可能的话,我试图find一种通用的方法来进行32位到64位的转换,这些转换可以在任何使用正则expression式的32位程序上完成(这样可以自动化)。 我知道没有一个通用的解决scheme(64位代码可能比32位代码占用更多的空间,并消耗更多的堆栈等),但即使在这种情况下,自动转换的代码将作为一个起点。 这个想法是保持8位和16位操作数,并用64位操作数replace32位操作数。 这种方法自然会失败,如果pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx pushw %ax; pushw %bx; popl %ecx被pushw %ax; pushw %bx; popq %rcxreplacepushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx pushw %ax; pushw %bx; popq %rcx ,但行为良好的程序通常不会push两个16位操作数,然后pop一个32位操作数,或者他们? 到目前为止,这些转换是: 编辑:修正: […]

FillChar和StringOfChar在Delphi 10.2下用于Win64发布目标

我有一个关于Delphi 10.2 Pascal编程语言中的特定编程问题的问题。 在2012年以前发布的CPU上的Win64 Release版本中,StringOfChar和FillChar无法正常工作。 FillChar的预期结果只是在给定的内存缓冲区中重复8位字符的普通序列。 StringOfChar的预期结果是相同的,但结果存储在一个stringtypes中。 但实际上,当我编译10.2以前版本的Delphi中使用Delphi的应用程序时,为Win64编译的应用程序在2012年以前发布的CPU上停止正常工作。 StringOfChar和FillChar不能正常工作 – 它们返回不同字符的string,尽pipe是重复模式 – 不仅仅是它们应该具有的相同字符序列。 这是最小的代码足以certificate这个问题。 请注意,序列的长度至less应为16个字符,字符不能为0(#0)。 代码如下: procedure TestStringOfChar; var a: AnsiString; ac: AnsiChar; begin ac := #1; a := StringOfChar(ac, 43); if a <> #1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1 then begin raise Exception.Create('ANSI StringOfChar Failed!!'); end; end; 我知道在StackOverflow中有很多Delphi程序员。 你遇到同样的问题吗? 如果是的话,你如何解决? 解决办法是什么? 顺便说一句, 我已经联系了Delphi的开发者,但是他们并没有确认也没有否认这个问题 。 我正在使用Embarcadero Delphi 10.2版本25.0.26309.314。 更新: 如果您的CPU是在2012或更高版本中生产的,则在调用StringOfChar重现此问题之前,还需要包含以下行: […]

64位应用程序与32位进程通信

我有32位应用程序使用32位的第三方库。 现在我必须使我的应用程序64位,以便它可以利用64位地址空间(大内存)。 由于我无法将32位库加载到64位应用程序进程中,因此我正在考虑使用IPC(命名pipe道/套接字)从我的64位应用程序通过第三方库创build32位可执行封装程序。 所以我的问题是他们这样做的问题吗? 另外,如果我必须在64位系统上安装我的应用程序,与我的应用程序相关的所有文件将被复制到“c:\ Program Files”目录。 现在我可以保持我的32位第三方EXE包装在相同的“C:\ Program Files”或我需要复制到“C:\ Program Files文件(x86)”目录?

在Windows 64位上安装cx_Oracle时,命令“gcc”失败,退出状态为1

我试图在我的Windows 7 – 64位版本上安装cx_Oracle 。 我以前有一个关于在Windows上安装cx_Oracle的问题,我自己解决了这个问题; 但它是Windows 7的32位版本; 在这里我遇到了安装它的新问题。 我应该提到,我部署了64位版本的MinGW和Microsoft Visual Studio 2008 。 对于我得到command 'gcc' failed with exit status 1 。 我尝试了Microsoft Visual Studio 2008控制台中的easy_install cx_Oracle ,并得到了这个输出(这正是我从Windows默认命令行运行命令时所得到的): Setting environment for using Microsoft Visual Studio 2008 x86 tools. C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>easy_install cx_Oracle Searching for cx-Oracle Reading http://pypi.python.org/simple/cx_Oracle/ Reading http://cx-oracle.sourceforge.net Reading http://starship.python.net/crew/atuining Best […]

Python GetModuleHandleW OSError:无法find指定的模块

以下代码会生成错误: OSError:[WinError 126]无法find指定的模块 windll.kernel32.GetModuleHandleW.restype = wintypes.HMODULE windll.kernel32.GetModuleHandleW.argtypes = [wintypes.LPCWSTR] KERNEL32 = windll.GetModuleHandleW("C:\\Windows\\System32\\kernel32.dll") 但是,如果我使用 KERNEL32 = windll.LoadLibrary("C:\\Windows\\System32\\kernel32.dll") DLLfind了,但是我遇到了下面的代码不同的错误: LoadLibAddy = windll.kernel32.GetProcAddress(KERNEL32, "LoadLibraryA") 产生的错误是: ctypes.ArgumentError:参数1:不知道如何转换参数1 我希望有人会对如何解决这些错误有一个想法。 完整的脚本: from ctypes import * from ctypes import wintypes def dllinjector(processID, DLL_NAME): KERNEL32 = WinDLL('kernel32.dll', use_last_error=True) KERNEL32.GetProcAddress.restype = c_void_p KERNEL32.GetProcAddress.argtypes = (wintypes.HMODULE, wintypes.LPCSTR) PROCESS_CREATE_THREAD = 0x0002 PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_VM_OPERATION = […]

从.exe在AMD64上安装pyaudio

我想在我的Windows 8 x64机器上安装pyaudio。 我有Python 2.7 x64安装。 从源头上build设对我来说不是一种select,无论如何,我已经看到,对其他人来说,这是失败的。 http://www.lfd.uci.edu/~gohlke/pythonlibs/中的Python 2.7 x64 .exe不起作用。 有另一种方法来安装? 有没有其他地方可以下载? 谢谢!

如果在64位代码中使用32位int 0x80 Linux ABI会发生什么情况?

Linux上的int 0x80总是调用32位ABI,而不pipe它是从哪个模式调用的:args in ebx , ecx ,…和/usr/include/asm/unistd_32.h系统调用号。 (或在没有CONFIG_IA32_EMULATION情况下编译的64位内核崩溃)。 64位代码应该使用syscall ,来自/usr/include/asm/unistd_64.h调用编号以及rdi , rsi等中的参数。请参阅x86-64上的UNIX和Linux系统调用的调用约定是什么 。 如果您的问题被标记为重复的, 请参阅该链接了解如何以32位或64位代码进行系统调用。 如果你想了解究竟发生了什么,请继续阅读。 syscall系统调用比int 0x80系统调用要快,因此除非要编写多边形机器代码,而是在32位或64位执行时运行,否则请使用本机64位syscall 。 ( sysenter始终以32位模式返回,所以从64位用户空间无用,尽pipe它是有效的x86-64指令。) 使用int 0x80可以编写以32位或64位模式组装的东西,所以在microbenchmark之后的exit_group()方便使用。 当前正式的i386和x86-64 System V的PDF文件,psABI文档标准化的函数和系统调用约定从https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI链接。 有关初学者指南,x86手册,官方文档和性能优化指南/资源,请参阅x86标记wiki。 但是,由于人们不断地用64位代码中使用int 0x80代码发布问题,或者意外地从32位源代码 构build了64位二进制代码,我不知道现在的Linux 究竟发生了什么? int 0x80保存/恢复所有的64位寄存器? 它是否截断任何寄存器到32位? 如果你传递了非零上半部分的指针参数,会发生什么? 如果你通过它的32位指针是否工作?

x86-64 System V ABI在哪里logging?

x86-64 System V ABI(用于Windows以外的所有应用程序)曾用于生存在http://x86-64.org/documentation/abi.pdf ,但是该网站现在已经从互联网上掉下来了。 这个文件是否有一个新的权威之家?

x86-64 Linux中不再允许32位绝对地址?

64位Linux默认使用小内存模式,这将使所有的代码和静态数据低于2GB的地址限制。 这确保您可以使用32位绝对地址。 老版本的gcc使用静态数组的32位绝对地址来保存一个额外的相对地址计算指令。 但是,这不再起作用。 如果我试图在程序集中创build一个32位的绝对地址,我得到链接器错误:“在创build共享对象时不能使用对`.data的重定位R_X86_64_32S;使用-fPIC重编译”。 这个错误信息当然是误导性的,因为我没有创build一个共享对象,-fPIC也没有帮助。 到目前为止我发现的是:gcc版本4.8.5使用静态数组的32位绝对地址,gcc版本6.3.0不使用。 版本5可能不会。 binutils 2.24中的链接器允许使用32位绝对地址,而2.28版不支持。 这种改变的后果是,旧的库必须重新编译,旧的汇编代码被破坏。 现在我想问一下:这个改变是什么时候发生的? 有logging吗? 有没有一个链接器选项,使其接受32位绝对地址?

我可以在Windows上加载一个32位DLL到64位进程吗?

我最近升级了ac#windows服务作为64位.net进程运行。 通常情况下,这将是微不足道的,但系统使用C ++编写的32位DLL。 这不是一个select将此DLL转换为64位,所以我将DLL包装在一个单独的32位.net进程,并通过远程处理暴露.net接口。 这是一个相当可靠的解决scheme,但是我宁愿将系统作为单个进程运行。 有什么办法可以加载我的32位DLL到64位进程,并直接访问它(也许通过某种thunking层)?