标签: 64-bit

关于功能终止的Segfault

我有一个用64位x86汇编语言编写的函数(用于gcc和GAS的AT&T语法),它执行一些SSE2操作.我通过使用反汇编的gdb并查看寄存器值来检查结果,所以我知道它产生了正确的结果.在retq指令之后,我得到了一个segementation故障.因为我刚接触汇编(并且从未接受过任何类),我猜我没有正确处理函数/主程序接口.该函数接受2个指针和一个int,并期望返回一个浮点数.这就是我在汇编函数中处理输入/输出的方法:

float foo(float *x,float *y,unsigned int s)
{
    __asm__ __volatile__(
    "movl   -0x14(%%rbp),%%ecx \n\t"   //ecx = s
    "movq   -0x8(%%rbp),%%rax \n\t"    //rax -> x
    "movq   -0x10(%%rbp),%%rdx \n\t"   //rdx -> y
    "subq   $4,%%rsp \n\t"             //function result
    #sse2 operations that end up with the answer in xmm4...
    "movss  %%xmm4,(%%rsp) \n\t"       //store result
    "flds   (%%rsp) \n\t"              //load function result
    "addq   $4,%%rsp \n\t"             //adjust stack
    "ret \n\t"
    :
    :"g"(s)
    :"%ecx","%rax","%rdx"
    );
}
Run Code Online (Sandbox Code Playgroud)

这里的行似乎导致了segfault(在反汇编中ret之后的指令):

0x00007fffffffe0d0 in ?? ()
=> 0x00007fffffffe0d0:  00 00   add    %al,(%rax)
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它在执行我的函数后将rax的低位中的值添加回rax,但它似乎崩溃了.我不允许在我的汇编函数中使用rax,即使它是一般用途并且我宣布它被破坏了吗?

我不确定你是否需要看到这个部分,但这是gcc期望处理该功能的方式; 我已经包含了调用我的函数的行的反汇编: …

c 64-bit x86 assembly att

0
推荐指数
1
解决办法
764
查看次数

windows x64汇编程序?

我最近从32位升级到64位计算机.我以前使用masm32进行x86组装.我的计算机可以运行32位进程,但我更喜欢使用我的所有计算机功能并编写x64汇编程序.我不想安装额外的东西(比如ide)来运行汇编程序.我应该使用什么汇编程序?

64-bit assembly

0
推荐指数
1
解决办法
5645
查看次数

Delphi XE3中的64位内联汇编

我在Delphi XE3中使用64位内联汇编程序遇到了这个问题,我不明白.

我试过这个,它适用于32位和64位

function test(a, b: integer): integer; assembler; register;
asm
  mov eax, a
  add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于32位而不是64位,在64位编译时,但没有返回两个整数之和的正确结果.

function test(a, b: integer): integer; assembler; register;
asm
  add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)

我知道以前的FPU代码如FLD,STP工作在32位但它会在64位编译器上产生编译错误.知道如何处理64位浮点数吗?

delphi 64-bit assembly x86-64 basm

0
推荐指数
1
解决办法
1444
查看次数

兼容模式下x64窗口上的本机x32应用程序与x32窗口上的x32应用程序之间的差异

我有一个用C++编写的旧的原生win32应用程序,它可以在Windows x32上正常工作,但它在Windows x64上崩溃了.即使我选择兼容模式.我有一个源代码,但它不容易阅读,因为它是由一个不再在我们公司工作的人编写的,代码非常庞大且异步.不容易调试的任务.

我想知道我应该关注什么.与x32 windows相比,x32兼容模式下的x64窗口有什么不同?我知道注册表可以产生一些问题,但似乎不是这种情况.还有别的吗?

c++ 64-bit winapi native

0
推荐指数
1
解决办法
175
查看次数

Delphi XE2/64bit目标地址可以达到1TB内存吗?

Delphi/FastMM可以解决与OS规范相同的问题吗? http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx

我只是有一个客户问我,我的软件是否可以访问一个TB(Windows 2008服务器)让我感到疑惑.

delphi 64-bit fastmm windows-server-2008 delphi-xe2

0
推荐指数
1
解决办法
346
查看次数

arc4random_uniform 64位ios

在设备无关(32位/ 64位)方式中使用arc4random_uniform的最佳方法是什么?我有以下几行:

UIColor *itemColor = [colors objectAtIndex: (arc4random_uniform([colors count]))];
Run Code Online (Sandbox Code Playgroud)

在64位时,将[colors count]转换为arc4random_uniform的参数时会出现精度损失.在32位上它很好.

我要做的是重写这一行,以便在32位或64位下编译时不会发出警告.可以安全地假设[颜色计数]不会假设值大于16.感谢您的推荐.

64-bit ios

0
推荐指数
1
解决办法
949
查看次数

Delphi xe2使用x64编译器编译ASM代码时出错.不支持的语言功能:'ASM'

正如标题所说我在使用包含ASM代码的x64编译器编译Delphi XE2项目时遇到了问题.当我尝试编译它时,我收到错误"不支持的语言功能:'ASM'".

我试图从包含ASM代码的过程中删除delphi代码然后我得到"操作码和操作数的无效组合".

这是代码的一部分..

type
  TDllLoadInfo = record
    Module: pointer;
    EntryPoint: pointer;
  end;

  TGetProcAddrExInfo = record
    pExitThread: pointer;
    pGetProcAddress: pointer;
    pGetModuleHandle: pointer;
    lpModuleName: pointer;
    lpProcName: pointer;
  end;

  TInjectLibraryInfo = record
    pLoadLibrary: pointer;
    lpModuleName: pointer;
    pSleep: pointer;
  end;



procedure DllEntryPoint(lpParameter: pointer); stdcall;
var
  LoadInfo: TDllLoadInfo;
begin
  LoadInfo := TDllLoadInfo(lpParameter^);
  asm
    xor eax, eax
    push eax
    push DLL_PROCESS_ATTACH
    push LoadInfo.Module
    call LoadInfo.EntryPoint
  end;
end;

procedure GetProcAddrExThread(lpParameter: pointer); stdcall;
var
  GetProcAddrExInfo: TGetProcAddrExInfo;
begin
  GetProcAddrExInfo := TGetProcAddrExInfo(lpParameter^);
  asm
    push GetProcAddrExInfo.lpModuleName
    call GetProcAddrExInfo.pGetModuleHandle
    push GetProcAddrExInfo.lpProcName …
Run Code Online (Sandbox Code Playgroud)

delphi 64-bit assembly

0
推荐指数
1
解决办法
1329
查看次数

C二进制达到1.2G内存限制

我正在处理一个C程序,该程序从一个文件中读入,每行大约有60个字符,并通过在读取文件时请求更多内存来在内存中分配字符串.在每次malloc 请求之后,它会检查函数OOM()是否有请求为了更多的记忆成功.

我已经使用越来越大的输入文件测试了程序,并且 在程序运行时查看命令时内存使用率达到1.2G时或多或少地OOM()报告.这是在64位Linux机器上,有更多的内存可用.输出来自:"Out of memory"topfile /my/binary/program

ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么它达到了1.2G的限制?我记得我的系统管理员曾经说某些二进制文件只能使用高达1.2G,这恰恰就是我在这里看到的.

当我qsub在保留50GB内存的同一64位Linux SGE网格的节点上运行相同的执行时,它会报告"Out of memory"以及以下SGE日志内存占用:

Max vmem         = 2.313G
Run Code Online (Sandbox Code Playgroud)

有什么想法为什么程序达到这个内存限制?是否有任何编译标志我应该知道哪些可能导致/解决这个问题?

在下面找到当前的相关标志Makefile:

CC = gcc
CFLAGS = -Wall -O3 -funroll-loops -DNDEBUG -fomit-frame-pointer -std=gnu99 -msse2 -Wno-unused-function -Wno-unused-result
CFLAGSSFMT = -msse2 -DHAVE_SSE2 -O9 -finline-functions -fomit-frame-pointer \
-DNDEBUG -fno-strict-aliasing --param max-inline-insns-single=1800 -std=c99
LD = ld …
Run Code Online (Sandbox Code Playgroud)

c memory 64-bit memory-management out-of-memory

0
推荐指数
1
解决办法
131
查看次数

我可以在64位应用程序中使用ShellExecute API运行32位exe吗?

我可以ShellExecute在64位应用程序中使用API 运行32位exe 吗?这样做有潜在的陷阱或问题吗?

64-bit winapi

0
推荐指数
1
解决办法
667
查看次数

为什么dd命令将虚拟文件大小限制为2GB?

我只是好奇为什么dd命令将虚拟文件的大小限制在大约2.1GB

[aesteban@localhost ~]$ dd if=/dev/zero of=test.img bs=3G count=1
0+1 records in
0+1 records out
2147479552 bytes (2.1 GB) copied, 10.0044 s, 215 MB/s
[aesteban@localhost ~]$ ls -sh test.img 
2.0G test.img
Run Code Online (Sandbox Code Playgroud)

我在上面看到我指定了3GB,但文件只有2.1GB,有什么想法吗?

谢谢

linux 64-bit dd fedora20

0
推荐指数
1
解决办法
2895
查看次数