草庐IT

Assembly

全部标签

c++ - 将指针从 C 传递到程序集

我想在我的C/C++程序中使用“_test_and_setlock”汇编语言实现和原子交换汇编指令。classLockImpl{public:staticvoidlockResource(DWORDresourceLock){__asm{InUseLoop:moveax,0;0=InUsexchgeax,resourceLockcmpeax,0jeInUseLoop}}staticvoidunLockResource(DWORDresourceLock){__asm{movresourceLock,1}}};这有效,但这里有一个错误。问题是我想传递DWORD*resourceLock而

c++ - 有人可以帮助我了解 stmdb、ldmia 以及如何用 arm 汇编语言实现此 C++ 代码吗?

所以我有这段代码,其中N是两个数组的大小。inti;for(i=0;i我正在尝试将其实现为ARM汇编子例程,但我完全不知道如何处理数组。到目前为止我有这个:sort1:stmdbsp!,{v1-v5,lr}ldmiasp!,{v1-v5,pc}我假设我必须使用cmp来比较这些值,但我什至不确定要使用什么寄存器。有人有任何指导吗?编辑:好的,我现在有了这段代码:sort1:stmdbsp!,{v1-v5,lr}@Copyregisterstostackldrv1,[a1],#0@Loada1strv1,[a2],#0@Copyelementsofa1toa2ldmiasp!,{v1-v5

c++ - 将正则表达式编译成 native 程序集会比 PCRE 或其他正则表达式引擎更快吗?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我在考虑改进。我目前正在对日志文件进行大量文本处理。我并不是说PCRE是慢/快或与此相关的任何其他实现。我编写的语言主要是Perl。我知道它有一个强大的正则表达式引擎,我知道它比PCRE更具表现力。我想用C++制作一个小型正则表达式引擎,将正则表达式编译为原始nasm。我知道PCRE非常复杂,我的假设是我可以跳过PCRE在不必要的处理方面所做的很多事情。而

c++ - 在 C++ 内联汇编中定义一个变量

假设我们有以下C++代码:intvar1;__asm{movvar1,2;}现在,我想知道的是,如果我不想在__asm指令之外定义var1,我必须做些什么才能将它放入其中。有可能吗?谢谢 最佳答案 为此,您需要使用_declspec(naked)创建一个“裸”方法,并自行编写通常由编译器创建的序言和结尾。序言的目的是:设置EBP和ESP为局部变量保留堆栈空间将需要修改的寄存器保存在函数体中结语必须:恢复保存的寄存器值清理局部变量的保留空间这是一个标准的序言pushebp;Saveebpmovebp,esp;Setstackframe

c++ - 如何返回复杂的返回值?

目前我正在编写一些汇编语言程序。正如一些惯例所说,当我想向调用者返回一些值时,比如一个整数,我应该在EAX寄存器中返回它。现在我想知道如果我想返回一个float、一个double、一个枚举,甚至是一个复杂的结构怎么办。如何返回这些类型的值?我可以想到在EAX中返回一个指向内存中实际值的地址。但这是标准方式吗?非常感谢~~~ 最佳答案 如果调用者是您的代码,则完全取决于您。如果调用者不受您的控制,您必须遵循他们现有的约定或共同制定您自己的约定。例如,在x86平台上,当FPU指令处理浮点运算时,函数的结果作为FPU寄存器堆栈的顶部值返回

c++ - 什么 C++ 代码编译成 x86 REP 指令?

我正在用C++将元素从一个数组复制到另一个数组。我在x86中发现了repmovs指令,它似乎将ESI中的数组复制到EDI中大小为ECX的数组。但是,无论是for还是while循环,我都尝试编译为VS2008中的repmovs指令(在IntelXeonx64处理器上)。我如何编写将编译为该指令的代码? 最佳答案 老实说,你不应该。REP是指令集中的一种过时保留,实际上非常慢,因为它必须调用CPU内部的微编码子程序,该子程序具有ROM查找延迟并且也是非流水线的。几乎在每个实现中,您都会发现memcpy()编译器内在的功能更易于使用且运行

c++ - 是否可以访问物理地址0?

在C/C++中,不允许访问地址为0的数据。但是,物理内存是从0开始编号的。在DOS时代,中断vector表位于物理地址0。第一个中断vector是被零除异常的处理程序。我的问题是:什么情况下允许访问物理地址0? 最佳答案 要访问物理地址零,这取决于您所使用的平台。该语言不知道底层寻址模型,它取决于操作系统。在裸机环境中,如果启用了分页,您可以完全控制页表,或者如果未启用分页,则只取消引用零。在某些Unix和Linux变体上,您执行mmap并且可能还打开/dev/mem以获取逻辑地址非零但物理地址为零的非空指针,它可能需要一些访问权限

c++ - 直接跳转到另一个C++函数

我正在将一个小型学术操作系统从TriCore移植到ARMCortex(Thumb-2指令集)。为了使调度程序工作,有时我需要直接跳转到另一个函数而不修改堆栈或链接寄存器。在TriCore(或者更确切地说,在tricore-g++)上,这个包装器模板(对于任何三参数函数)有效:templateinlinevoid__attribute__((always_inline))JUMP3(void(*func)(A1,A2,A3),A1a1,A2a2,A3a3){typedefvoid(*__attribute__((interrupt_handler))Jump3)(A1,A2,A3);((

c++ - 获取 `rsqrtss` 包装器的最少指令

我认为是时候使用快速平方根倒数了。因此,我尝试编写一个函数(在生产中将被标记为inline):floatsqrt_recip(floatx){return_mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ps1(x)));//sameas_mm_set1_ps}TL;DR:我的问题是“如何让GCC和ICC为上述功能输出最少的汇编(两条指令),最好不求助于原始汇编(坚持使用内在函数)?”正如所写,在ICC13.0.1、GCC5.2.0和Clang3.7上,输出是:shufpsxmm0,xmm0,0rsqrtssxmm0,xmm0ret这是有道理的,因为我使用_mm_s

c++ - 警告 #13212 : Reference to ebx in function requiring stack alignment

我正在尝试使用ICC2018编译以下代码:__asm{movebx,xx;xxaddresstoregisters}其中xx是int16类型。这是我的函数中的第一条指令。我使用上面的汇编代码收到以下警告:警告#13212:在需要堆栈对齐的函数中引用ebx令人惊讶的是,当我用eax或esi替换ebx时,我看到警告消失了。我不明白为什么我只看到ebx的问题,据我所知,ebx和eax都具有相同的架构(32位寄存器)。另外,当我用ICC2013编译相同的代码时,我没有看到警告。谁能帮我解决这个警告?谢谢! 最佳答案 如果需要额外对齐,所选平