草庐IT

Assembly

全部标签

c++ - 为什么要在函数调用时填充堆栈?

我在查看函数调用的反汇编时发现了这个:movq%rsp,%rbppushq%rbxsubq$136,%rsp;Padthestack....addq$136,%rsp;Unpadthestackpopq%rbxpopq%rbpret这样做的值(value)是什么? 最佳答案 那是局部变量的空间,不是填充。编译器将在运行此函数时为任何寄存器溢出和必须存储的局部变量创建堆栈空间。当使用SysVABI反汇编x86-64代码时,您可能会看到一些填充(大多数不是Windows的东西,我不知道后者是怎么回事),因为函数调用必须对齐堆栈在16个字

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

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

c++ - 编译器生成昂贵的MOVZX指令

我的探查器已将以下功能分析确定为热点。typedefunsignedshortushort;boolisInteriorTo(conststd::vector&point,constushort*coord,constushortdim){for(unsignedi=0;i=coord[i])returnfalse;}returntrue;}特别是,一个汇编指令MOVZX(MovewithZero-Extend)负责运行时的大部分工作。if语句被编译成movrcx,QWORDPTR[rdi]lear8d,[rax+1]addrsi,2movzxr9d,WORDPTR[rsi-2]mov

c++ - 使用(float&)int可以进行类型修剪,(float const&)int可以像(float)int那样转换吗?

VS2019版本x86。templatefloatget()const{intf=_mm_extract_ps(fmm,i);return(floatconst&)f;}当使用return(float&)f;编译器使用时extractpsm32,...movssxmm0,m32。正确的结果当使用return(floatconst&)f;编译器使用时extractpseax,...movdxmm0,eax。错误的结果T&和Tconst&首先是T,然后是const的主要思想。const只是程序员的某种协议(protocol)。您知道您可以解决它。但是汇编代码中没有任何const,只能输入f

C++:什么是技术层面的 R 值引用 (ASM)?

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Whatisthedifferencebetweenr-valuereferencesandl-valuereferences?(CodeGen)我想知道,谁能从技术层面解释一下R值引用是什么?我的意思是:创建R值引用时在汇编程序级别会发生什么。为了进行小测试以查看内部发生的情况,我编写了以下代码:charc=255;char&c2=c;char&c3=std::move(c);我知道创建对“c”的R值引用是没有意义的,但只是为了测试我还是做了,看看它做了什么。结果如下:unsignedcharc=255;m

c++ - 声明一个空的析构函数可以防止编译器调用 memmove() 来复制连续的对象

考虑以下Foo的定义:structFoo{uint64_tdata;};现在,考虑以下Bar的定义,它具有与Foo相同的数据成员,但有一个空用户-声明析构函数:structBar{~Bar(){}//使用带有-O2的gcc8.2,函数copy_foo():voidcopy_foo(constFoo*src,Foo*dst,size_tlen){std::copy(src,src+len,dst);}产生以下汇编代码:copy_foo(Fooconst*,Foo*,size_t):salq$3,%rdxmovq%rsi,%raxje.L1movq%rdi,%rsimovq%rax,%rd

ios - 从 arm 汇编函数返回 float 到 objective-c

我编写了一个汇编函数,可以在iPhone4(32位代码)和iPhone6s(64位代码)上正常运行。我从objective-c中的调用函数传入了四个float。这是我用于4个float的结构,下面是该函数的原型(prototype)-可以在我的Objective-C代码顶部找到。structmyValues{//Thisisastructure.Itisusedtoconvenientlygroupmultipledataitemslogically.floatA;//Iamusingitherebecauseiwanttoreturnmultiplefloatvaluesfrommy

ios - 如何让 Xcode 5 中的 Assembly 显示 ARM 指令?

在Xcode5中执行assembly(产品->执行操作->assembly)显示i386指令。我如何获取ARM汇编代码? 最佳答案 我在这里可能是错的,但您不需要做的就是将您的事件方案从iOS模拟器更改为“iOS设备”,然后重新生成程序集。 关于ios-如何让Xcode5中的Assembly显示ARM指令?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/20013871/

ios - iOS 中图像尺寸太小时 TransloadIt 图像上传问题

当上传尺寸太小的图像时,例如当我裁剪图像时,T​​ransloadit服务器总是回复此响应。{"error":"FILE_FILTER_DECLINED_FILE","message":"Oneofyourfileswasdeclined","reason":"file_0"}我还尝试通过在ASSEMBLY中添加带有force_accept参数的STEP来测试响应,考虑到(希望)它将接受任何文件大小。但仍然得到相同的响应。这是代码片段:Transloadit*transloadit=[[Transloaditalloc]init:TRANSLOADIT_API_KEY];Assembl

ios - Monotouch (mtouch) 命令行错误 MT0007 - "The root assembly does not exist"

我们正在尝试使用MonoTouchmtouch命令行在模拟器中运行我们的应用程序。我们有一个包含3个项目的解决方案,一个库、一个前端应用程序和一个测试项目。当我们在前端应用程序上使用mtouch--installsim时,一切正常。然而,当我们在测试项目上运行mtouch--installsim或mtouch--debugsim时,我们得到这个错误:errorMT0007:Therootassembly'--installsim=/Users/myuser/root4/trunk/App/UnifiedTests/bin/iPhoneSimulator/Debug/UnifiedTes