x86汇编程序中的动态标签

时间:2009-05-27 08:17:31

标签: c assembly

我又遇到了一个无法找到直接解决方案的问题......

我正在做一些内联汇编,我想要执行一些代码 使用.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" );  

2 个答案:

答案 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标签就不会含糊不清了。