如何在内联汇编中设置标签?

时间:2012-07-02 15:56:22

标签: visual-c++ inline-assembly

如何在c ++ visual中为我需要使用内联汇编设置标签,所以它看起来就像这样......例如...

__asm
{
    PUSH EAX
    PUSH VAR1
    MOV ECX,DWORD PTR DS:[VAR2]
    CALL DWORD PTR DS:[VAR3]
    JMP VAR4
}

VAR个可变数据链接到值或地址?

我试过以下

DWORD   VAR2 = 0x991770;    //0x991770 is the location of the function

__asm
{
    ..code
    MOV ECX,DWORD PTR DS:[VAR2]
    ..code
}

然后应用程序崩溃,这是怎么做到的?

2 个答案:

答案 0 :(得分:1)

使用offset variableName从内联汇编中访问变量。请参阅参考here

示例:

char format[] = "%s %s\n";
char hello[] = "Hello";
char world[] = "world";
int main( void )
{
   __asm
   {
      mov  eax, offset world
      push eax
      mov  eax, offset hello
      push eax
      mov  eax, offset format
      push eax
      call printf
      //clean up the stack so that main can exit cleanly
      //use the unused register ebx to do the cleanup
      pop  ebx
      pop  ebx
      pop  ebx
   }
}

答案 1 :(得分:0)

C变量名在内联汇编中可见。因此,如果您需要数据访问,只需编写var名​​称:

int var2 = 3;
__asm
{
    mov ecx, var2

这将编译为适当的内存访问语句。

对于代码标签 - 您只需声明它们,就像在实际汇编中一样:

Label1:
    mov ecx, 0
    jmp Label1    

外部功能也被视为标签。但是,名称修改适用。

如果您需要将当前IP的数值作为通用寄存器,则没有直接命令,但可以使用非常简单的解决方法:

    call Next
Next:
    pop eax ; eax now is the value of IP at the current point

哦,忘了ds:的东西。你现在在Flatland - 检查门口的段寄存器。