我又遇到了一个无法找到直接解决方案的问题......
我正在做一些内联汇编,我想要执行一些代码 使用.rept指令,该指令告诉汇编程序,就像在.ept之前的行一样,直到.endr之前的行重复指定的次数。
显而易见的问题当然是标签18已被指定。我想知道 如果有办法为每次迭代生成一些动态标签?
__asm__ __volatile__ (".rept 10 \n\t");
__asm__ __volatile__( "test eax, eax \n\t" );
__asm__ __volatile__( "jne 18f\n\t" );
...
__asm__ __volatile__( "18: nop 18f\n\t" );
__asm__ __volatile__( ".endr\n\t" );
答案 0 :(得分:1)
如果您不介意手工完成某些工作,可以使用内置的.
(点)符号来执行此操作,该符号计算当前目标地址。见the documentation。您应该可以执行以下操作:
asm volatile("jne .+1");
当1
需要根据您想要跳跃的距离而改变时,当然。这是手工部分,因为您需要以字节为单位的偏移量。我没有对此进行测试,但我认为它应该可行。
This page还说明了如何使用字符串替换来生成标签,您也可以使用该技术。
答案 1 :(得分:1)
为什么不跳过.rept和.endr而只是循环呢?将ecx设置为10(或者如果你想要10个循环,则为0A,而不是16)将.endr语句所在的标签(例如,loopbegin :)和loop loopbegin
)放在一起。这样你的18标签就不会含糊不清了。