Optimization x86程序集,优化条件移动

Optimization x86程序集,优化条件移动,optimization,assembly,x86,Optimization,Assembly,X86,这是线程化的代码命令,如Forth?,检查0是否位于堆栈顶部(edi),并通过取消引用命令指针(ebx)跳过下一个命令 有没有办法优化这一点?更少的行,更快的执行,更好的CPU支持? 方法是检查[edi]是否为零,然后mov ebx,[ebx]否则什么也不做。edi必须增加4(这是一种堆栈指针)。当然,cmovz仅是i686,但使用标签似乎有点过分了 (是的,我有x86指令集参考,但它很大,需要很长时间才能掌握,但我只是偶尔使用汇编,所以我寻求专家建议。)通常是测试eax,eaxcmp eax,

这是线程化的代码命令,如Forth
,检查
0
是否位于堆栈顶部(
edi
),并通过取消引用命令指针(
ebx
)跳过下一个命令

有没有办法优化这一点?更少的行,更快的执行,更好的CPU支持? 方法是检查
[edi]
是否为零,然后
mov ebx,[ebx]
否则什么也不做。
edi
必须增加4(这是一种堆栈指针)。当然,
cmovz
仅是i686,但使用标签似乎有点过分了


(是的,我有x86指令集参考,但它很大,需要很长时间才能掌握,但我只是偶尔使用汇编,所以我寻求专家建议。)

通常是
测试eax,eax
<代码>cmp eax,eax在这种情况下没有任何效果,因为这种比较总是设置ZF。另外,对于某些体系结构来说,使用
leaedi[edi+4]
以避免垃圾标志可能会更好。我们可以看更多的上下文吗?优化执行一次或两次的行是没有用的。其他限制条件是什么?我们应该不惜一切代价避免内存访问吗?eax==0的概率是多少?Aki,我创建了使用线程代码的编程语言,以前所有的线程函数都是C,现在我尝试转换为ASM。此特定函数类似于Forth“?”指令。如果0位于堆栈顶部,则跳过下一个命令。edi包含堆栈,ebx是指向当前命令的指针。这大约是TIL解释器可以接受的范围。加快速度需要抖动或专用硬件。查克·摩尔(Chuck Moore)是TIL冠军,虽然看起来奄奄一息;当您需要实际跳转到子例程时,请使用
xchgedi,esp;呼叫子系统;xchg edi,esp
;这假设实际调用很少,并且为英特尔处理器优化的push/pop约定在指令级解释中有更好的用途。请注意,cmov和mov的顺序并不重要。
_ifleap:
   mov eax, [edi]
   add edi, 4
   test eax, eax
   cmovz ebx, [ebx]
   mov ebx, [ebx]
   jmp [ebx + 12]