1

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

__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
}

但是随后应用程序崩溃了,这是如何完成的?

4

2 回答 2

1

用于offset variableName从内联汇编访问变量。请参阅此处的参考。

例子:

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
   }
}
于 2012-07-02T16:10:37.987 回答
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:东西。你现在在平地——在门口检查你的段寄存器。

于 2012-07-02T16:10:46.373 回答