我是装配新手。最近,我需要在Visual Studio 2013中使用内联汇编来提高性能。
但我来到分支目标范围问题:
_asm
{
mov ecx, cnt;
jecxz AZERO:
AL1:
/*Some operation codes here, but may be exceed 128 byte*/
loop AL1;
AZERO:
}
我知道原因是“操作代码”的大小超过128个字节。
我的简单解决方案是:
for (int i = 0; i < cnt; i++) {
_asm
{
/*Some operation codes here, but may be exceed 128 byte*/
}
}
这似乎有效。
但我不知道这种方法是否足够好?
有没有什么好方法可以处理循环部分而不会导致分支范围问题?
答案 0 :(得分:4)
您看到所见的原因是loop
和jecxz
†都是短跳转说明。您拥有的C循环不使用loop
;它使用jcc
进行分支(包括短形式和近形式)。
如果需要,您仍然可以使用完整装配。你无法使用loop
:
mov ecx, cnt
jmp ATEST
AL1:
/* fun happens here */
ATEST:
dec ecx
jns AL1
技术术语‡:
†请注意,jecxz
在技术上不是jcc
指令;它在jcc
操作码范围之外,不会检查标记,也没有相应的cmovcc
或setcc
形式。
‡为了完整性,jmp
(但不是jcc
)也支持近距离间接跳跃,远距离跳跃和远距离间接跳跃。