我有%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为每次“迭代”生成呢?
我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:
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可能是负数.
我有一个指向我的基类对象的指针向量,然后我将派生类中的对象存储在其中.我添加指针的方式非常明显
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,但它导致堆错误.
如何在XMM寄存器中对值进行逐位否定?据我所知,没有这样的指示.唯一有否定的指令是pandn,但是要用它来简单地否定一个XMM寄存器中的值,我必须填充另一个填充的XMM寄存器1.
是否有另一种方法来否定XMM寄存器中的位?或者有没有一种聪明的方法来填充XMM寄存器而1无需访问内存?
assembly ×3
nasm ×2
x86 ×2
bitwise-not ×1
c++ ×1
heap ×1
optimization ×1
pointers ×1
preprocessor ×1
sse ×1
vector ×1