jjzjj

windows - 为什么 malloc 会覆盖 RSP 和 RSP+8?

您可以阅读有关64位调用约定的信息here.x64函数应该自行清理,但是,当我从.asm调用malloc时,它会覆盖RSP和RSP+8处的值。这似乎是非常错误的。有什么建议吗?publicTestMallocexternmalloc:near.CODEalign8TestMallocprocmovrcx,100h000000018000BDB848C7C100010000movrcx,100hcallmalloc000000018000BDBFE8CCAC0600callmalloc(180076A90h)ret000000018000BDC4C3ret000000018000BDC5

c - 如何在 Windows 7 X64 SP1(x64 模式)下执行直接系统调用?

我试图模拟syscall指令在Windows7X64(SP1)上的工作方式,因此我使用MinGW64编写了一个64位GCC示例。据我所知,对于Windows,所有系统调用入口点都在ntdll.dll或ntdll32.dll中(在这种情况下,我们只关心ntdll.dll)。Status=NtCreateFile(&FileHandle,//returnedfilehandle(GENERIC_WRITE|SYNCHRONIZE),//desiredaccess&ObjectAttributes,//ptrtoobjectattributes&Iosb,//ptrtoI/Ostatusbl

c++ - 将右值传递给非引用参数,为什么编译器不能删除拷贝?

structBig{inta[8];};voidfoo(Biga);BiggetStuff();voidtest1(){foo(getStuff());}编译(在Linux上使用clang6.0.0forx86_64,所以SystemVABI,标志:-O3-march=broadwell)到test1():#@test1()subrsp,72leardi,[rsp+40]callgetStuff()vmovupsymm0,ymmwordptr[rsp+40]vmovupsymmwordptr[rsp],ymm0vzerouppercallfoo(Big)addrsp,72ret如果我没

c++ - 如何读取寄存器 0x​​104567911 RBX、RCX、RDX、RSP。 C 或 C++ 中的 RBP、RSI、RDI?

这个问题在这里已经有了答案:Howcanyoupullavaluefromaregister?(1个回答)关闭9年前。假设我想从双核x64CPU上的那些寄存器(以及几乎所有这些)中读取值。我怎样才能做到这一点?我可以简单地写这样的东西吗:uint64_trax=0,rbx=0;__asm____volatile__(/*readvaluefromrbxintorbx*/"movq%%rdx,%0;\n"/*readvaluefromraxintorax*/"movq%%rax,%1;\n"/*outputargs*/:"=r"(rbx),"=r"(rax):/*noinput*//*c

c++ - GCC -fstack-check 选项在 C 中引发了什么异常

根据gcc文档-fstack-checkGeneratecodetoverifythatyoudonotgobeyondtheboundaryofthestack.Notethatthisswitchdoesnotactuallycausecheckingtobedone;theoperatingsystemmustdothat.Theswitchcausesgenerationofcodetoensurethattheoperatingsystemseesthestackbeingextended.我的假设是这个额外的代码会产生异常让操作系统知道。使用C语言时,我需要知道额外代码生成

c++ - 从 Microsoft C++ 读取 RSP 寄存器

由于在针对x64架构进行编译时,MicrosoftC++中不提供内联汇编程序,因此我不知道如何访问RSP寄存器(堆栈指针)。我知道我可以使用RtlCaptureContext读取它,但这也会执行很多不需要的操作。而且它会慢几千倍(就我的目的而言,这是NotAcceptable)。如果我写一个单独的ASM函数,RSP显然会改变,所以这也不是一个替代方案。那么如何使用MicrosoftC++读取x64RSP寄存器的内容呢? 最佳答案 您可以使用_AddressOfReturnAddress()(参见MSDNreference)内在函数间

performance - Go 运行时是否在每次迭代时评估 for 循环条件?

这是《TheGoProgrammingLanguage》一书中的一段代码:fort:=0.0;t看来for循环条件中的表达式t必须在for循环的每次迭代之前进行评估。或者,编译器是否通过预先计算表达式的结果来优化它(假设在迭代期间没有任何变量发生变化)?上述编码风格会影响性能吗? 最佳答案 这确实取决于Go版本,但goversiongo1.7windows/amd64似乎确实计算了一次该值。去代码:varcycles=10.0varres=1000.0fort:=0.0;t汇编代码:movsd[rsp+58h+var_20],xmm

performance - Go 运行时是否在每次迭代时评估 for 循环条件?

这是《TheGoProgrammingLanguage》一书中的一段代码:fort:=0.0;t看来for循环条件中的表达式t必须在for循环的每次迭代之前进行评估。或者,编译器是否通过预先计算表达式的结果来优化它(假设在迭代期间没有任何变量发生变化)?上述编码风格会影响性能吗? 最佳答案 这确实取决于Go版本,但goversiongo1.7windows/amd64似乎确实计算了一次该值。去代码:varcycles=10.0varres=1000.0fort:=0.0;t汇编代码:movsd[rsp+58h+var_20],xmm

c++ - 可变参数函数的内联

在玩优化设置时,我注意到一个有趣的现象:采用可变数量参数的函数(...)似乎从未内联。(显然这种行为是特定于编译器的,但我已经在几个不同的系统上进行了测试。)例如编译如下小程序:#include#includestaticinlinevoidtest(constchar*format,...){va_listap;va_start(ap,format);vprintf(format,ap);va_end(ap);}intmain(){test("Hello%s\n","world");return0;}似乎总是会导致(可能被损坏)test符号出现在生成的可执行文件中(在MacOS和Li

c++ - 可变参数函数的内联

在玩优化设置时,我注意到一个有趣的现象:采用可变数量参数的函数(...)似乎从未内联。(显然这种行为是特定于编译器的,但我已经在几个不同的系统上进行了测试。)例如编译如下小程序:#include#includestaticinlinevoidtest(constchar*format,...){va_listap;va_start(ap,format);vprintf(format,ap);va_end(ap);}intmain(){test("Hello%s\n","world");return0;}似乎总是会导致(可能被损坏)test符号出现在生成的可执行文件中(在MacOS和Li
12