Visual C ++内联汇编char *

时间:2014-12-09 22:59:21

标签: visual-c++ assembly

我需要在汇编中编辑C ++代码中从用户收到的字符串。我找到了这个教程http://msdn.microsoft.com/en-US/library/y8b57x4b(v=vs.80).aspx,根据它,我的代码应该可以工作

int main ()
{
   char* s;
   s=new char[80];
   cin.getline(s,80);
   __asm
   {
       mov eax, offset s
   }
} 

但是编译器在mov"不正确的操作数类型"的行上显示错误。有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:0)

char* s是一个局部变量。它将在调用函数时创建,并在函数返回时“忘记”。在编译时它不存在“偏移”(即绝对存储器地址)。但是你可以内联汇编程序强制加载指针:

#include <iostream>
using namespace std;

int main ()
{
   char* s;
   s=new char[80];
   __asm
   {
        mov ebx, s                  ; = mov ebx, [ebp-4]
        mov byte ptr [ebx], 'H'
        mov byte ptr [ebx+1], 'e'
        mov byte ptr [ebx+2], 'l'
        mov byte ptr [ebx+3], 'l'
        mov byte ptr [ebx+4], 'o'
        mov byte ptr [ebx+5], 0     ; Don't forget the terminator!
   }

    cout << s << endl;
    return 0;
}