小编Ram*_*mes的帖子

NASM %rep 部分中的标签

我有%rep一个预处理器指令,它创建一个预处理器循环。我想在其中声明标签,可能带有一些串联,但我无法获得正确的语法。

%assign i 0 
%rep    64 
   label_%i: ;this, of course, doesn't work
      inc rax    
%assign i i+1 
%endrep
Run Code Online (Sandbox Code Playgroud)

那么如何强制 NASM 预处理器label_i为每次“迭代”生成呢?

assembly preprocessor nasm

4
推荐指数
1
解决办法
1605
查看次数

x86装配 - 夹紧rax优化到[0 ..极限)

我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:

if rax < 0 then rax := 0 else if rax >= r12 then rax := r12 - 1

这是我天真的实施:

cmp rax, 0
jge offsetXGE
   mov rax, 0
   jmp offsetXReady
offsetXGE:
   cmp rax, r12
   jl offsetXReady
   mov rax, r12
   dec rax
offsetXReady:
Run Code Online (Sandbox Code Playgroud)

任何想法都是受欢迎的,即使是那些使用MMX和一些掩盖技巧的想法.

编辑:回答评论中的一些问题 - 是的,我们可以假设r12> 0但rax可能是负数.

optimization x86 assembly nasm

2
推荐指数
1
解决办法
535
查看次数

C++从向量中删除指针会导致堆错误

我有一个指向我的基类对象的指针向量,然后我将派生类中的对象存储在其中.我添加指针的方式非常明显

std::vector<Element*> mvGates;
...
mvGates.push_back(new Node(x, y));
Run Code Online (Sandbox Code Playgroud)

当我的程序即将被关闭时,这些指针在'for'循环中被释放

 for (int i=0; i<mvGates.size(); ++i)
 {
     delete mvGates[i];
 }
Run Code Online (Sandbox Code Playgroud)

在这一行我的调试器(我正在使用Qt Creator)显示如下几行:

Heap block at 14E50F50 modified at 14E50F84 past requested size of 2c
Invalid address specified to RtlFreeHeap( 00030000, 14E50F58 )
Run Code Online (Sandbox Code Playgroud)

可能是什么原因,我做错了什么?我知道我没有向你展示完整的代码,因为它很长,但也许它足以告诉我我的错误.可能你会建议我使用智能指针.我想我会这样做,但这不能回答我的问题 - 这段代码可能有什么问题.

编辑:这是一个非常简单的错误,你不能在这里注意到它.在我已声明的Node类中some_type array[0];

我一直在使用它作为2元素数组.我不知道为什么它不会导致SIGSEGV,但它导致堆错误.

c++ heap pointers vector

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

XMM寄存器的按位否定

如何在XMM寄存器中对值进行逐位否定?据我所知,没有这样的指示.唯一有否定的指令是pandn,但是要用它来简单地否定一个XMM寄存器中的值,我必须填充另一个填充的XMM寄存器1.

是否有另一种方法来否定XMM寄存器中的位?或者有没有一种聪明的方法来填充XMM寄存器而1无需访问内存?

x86 assembly sse bit-manipulation bitwise-not

0
推荐指数
2
解决办法
763
查看次数