草庐IT

Linux:在不破坏后续核心转储的寄存器的情况下监听信号?

当我收到导致核心转储的信号时,我想运行我自己的处理程序以将siginfo_t和ucontext_t结构复制到全局变量,以便可以在核心转储中访问它们。目前在我的处理程序结束时,我重新分配默认处理程序并调用raise(thesig)。这样做的问题是核心转储“信息寄存器”显示了我的处理程序中寄存器的状态,而不是原始信号时的状态。我意识到,因为我已经保存了ucontext_t,所以我可以在其中查找原始寄存器值,但是当核心转储在团队中传递时,这些知识可能会丢失/忘记。所以我的问题是:有没有办法重新发出信号,并确保核心转储文件保存原始信号的寄存器状态?我想也许我可以使用一些内联汇编来手动恢复处理程

windows - 通用调用约定如何处理 AVX 寄存器?

我找不到任何定义调用者和被调用者如何处理YMM寄存器的文档。为了突出我的问题,这里是我想知道的:在返回给调用者之前,被调用者必须恢复哪些YMM寄存器?由于Linux和Windows中的XMM寄存器存在差异,我假设YMM寄存器也不遵循相同的规则。每个操作系统的规则是什么?编辑:感谢下面的答案,我能够在提到的Win64文档中找到答案。我很确定Linux遵循类似的规则:"...TheYMMregistersdonothavecallee-savestatus,exceptforthelowerhalfofYMM6-YMM15in64-bitWindows,whereXMM6-XMM15hav

memory - 我们可以拥有一台只有寄存器作为内存的计算机吗?

已结束。此问题不符合StackOverflowguidelines.它目前不接受答案。这个问题似乎与aspecificprogrammingproblem,asoftwarealgorithm,orsoftwaretoolsprimarilyusedbyprogrammers无关.如果您认为该问题将成为anotherStackExchangesite上的主题,您可以发表评论,说明在哪里可以回答问题。关闭1年前。Improvethisquestion寄存器是计算机中最快的存储器。因此,如果我们想构建一台只有寄存器甚至没有缓存的计算机,这可能吗?我什至想用寄存器代替磁盘,尽管它们自然是vo

assembly - 将寄存器加载到自身的指令的目的是什么?

在查看Gameboy的指令集时,我遇到了如下指令:LDA,ALDB,BLDC,CLDD,D...每条指令在thistable中都有自己的操作码。,这让我觉得由于可能的操作码数量的限制,它们有些重要。我首先认为它可能会取消引用该寄存器中的指针并将值存储在该指针(likeinthisquestion)中,但在emulator中,LDA,A实现为:Z80._r.a=Z80._r.a它们似乎对处理器的状态没有影响(只是将寄存器设置为它们自己的值),并且与NOP执行相同的周期数。为什么将这些操作码包含在指令集中以及它们的用途是什么? 最佳答案

caching - 为什么 RAM 不如寄存器/高速缓存那么快?

已结束。这个问题是off-topic.它目前不接受答案。想要改进这个问题?Updatethequestion所以它是on-topic堆栈溢出。关闭11年前。Improvethisquestion为什么我们需要缓存在CacheMemory中?为什么RAM内存不能像寄存器一样快,高速缓存或高速缓存不能像RAM内存(4GB)一样大,以便所有内容都可以在缓存中?有什么好的文章/书籍可以理解这些概念吗? 最佳答案 更快的东西每比特成本更高。所以你有一个递减的存储链,从一端的几个寄存器,通过几级缓存,一直到RAM。每个级别都比以前的级别更大且速

c++ - 为什么 MSVC 在寄存器中返回一个小结构时不必要地使用堆栈?

我在MSVC2013,x64,Releasebuildwith/02上编译了以下代码:structPoint{intx;inty;};PointxUnit(){Pointp;p.x=1;p.y=0;returnp;}xUnit()生成的汇编代码为:movQWORDPTRp$[rsp],1movrax,QWORDPTRp$[rsp]ret0为什么它写入堆栈然后立即读回rax返回?我早就料到了:movrax,1ret0 最佳答案 X86版本似乎表现不错(即生成“moveax,1”)。我的猜测是X86和X64版本是独立的代码库,在一个目标

c++ - 方法调用后返回值是否总是进入 eax 寄存器?

我编写了一个Hook库,它检查PE可执行文件dll导入表,以创建一个能够更改参数和返回值的库。我有几个关于如何从函数传递返回值的问题。我了解到函数的返回值保存在累加器寄存器中。总是这样吗?如果不是,编译器怎么知道去哪里寻找函数结果?返回类型大小呢?一个整数很容易拟合,但是更大的结构呢?调用者是否保留堆栈空间,以便它调用的方法可以将结果写入堆栈? 最佳答案 这都是特定于调用约定的。对于大多数调用约定,float在FPU堆栈或XMM寄存器中返回。调用返回结构的函数some_structfoo(intarg1,intarg2);some_

c++ - 如何将 C++ 变量存储在寄存器中

我想澄清一下关于寄存器变量存储的一点:有没有办法确保如果我们在代码中声明了一个寄存器变量,它只会存储在一个寄存器中?#includeusingnamespacestd;intmain(){registerinti=10;//howcanweensurethiswillstoreinregisteronly.i++;cout 最佳答案 你不能。这只是对编译器的提示,表明该变量被大量使用。这是C99的措辞:Adeclarationofanidentifierforanobjectwithstorage-classspecifierregis

c++ - 寄存器变量地址

在C中,我们不能使用&来找出寄存器变量的地址,但在C++中我们可以这样做。为什么它在C++中合法,但在C中不合法?有人可以深入解释这个概念。 最佳答案 这是C99standard(pdf)的第6.7.1节(脚注101)的摘录:Theimplementationmaytreatanyregisterdeclarationsimplyasanautodeclaration.However,whetherornotaddressablestorageisactuallyused,theaddressofanypartofanobjectd

c++ - 添加 SSE 寄存器的组件

我想添加SSE寄存器的四个组件以获得单个float。这就是我现在的做法:floata[4];_mm_storeu_ps(a,foo128);floatx=a[0]+a[1]+a[2]+a[3];有没有直接实现这个的SSE指令? 最佳答案 您可能会使用HADDPSSSE3指令,或其编译器内在_mm_hadd_ps,例如,参见http://msdn.microsoft.com/en-us/library/yd9wecaa(v=vs.80).aspx如果你有两个寄存器v1和v2:v=_mm_hadd_ps(v1,v2);v=_mm_had