在c ++内联汇编中定义变量

dev*_*ium 6 c c++ assembly inline-assembly visual-c++

假设我们有以下c ++代码:

int var1;

__asm {
    mov var1, 2;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想知道的是,如果我不想在__asm指令之外定义var1,我需要做些什么才能把它放在里面.它甚至可能吗?

谢谢

ced*_*rou 13

要做到这一点,你需要用_declspec(裸)创建一个"裸"方法,并自己编写通常由编译器创建的prolog和epilog.

一个序言的目的是:

  • 建立EBP和ESP
  • 在堆栈上为局部变量保留空间
  • 保存应在函数体中修改的寄存器

一个epilog必须:

  • 恢复保存的寄存器值
  • 清理局部变量的保留空间

这是一个标准的序言

push        ebp                ; Save ebp
mov         ebp, esp           ; Set stack frame pointer
sub         esp, localbytes    ; Allocate space for locals
push        <registers>        ; Save registers
Run Code Online (Sandbox Code Playgroud)

和标准的epilog:

pop         <registers>   ; Restore registers
mov         esp, ebp      ; Restore stack pointer
pop         ebp           ; Restore ebp
ret                       ; Return from function
Run Code Online (Sandbox Code Playgroud)

然后,您的局部变量将从下开始(ebp - 4)并向下移动(ebp - 4 - localbytes).功能参数将从(ebp + 8)和向上开始.