比如:
var
 Str:string; asm
 begin
    mov eax,[$12345678]//这个地址存放的内容是字符串‘hello’,应该怎么样从eax提取出来放到Str里
   //这里的汇编代码应该怎么写?
 end
 showmessage(Str);再来:
const str = ‘hello’;
 ams
 begin
   mov eax,? //怎么样把str的内容传递到eax呢?
 end;

解决方案 »

  1.   

    String应该算是Delphi自己的类型吧,由于保存了长度什么的,在汇编里面解析结构是比较麻烦的
    换用PChar吧PChar是一个指针,说白了就是一个integer的值,它是一个地址在内存中位置的数值表示,#0结束那么var
      p,q: Pointer;
    begin
      p := PChar('hello');  //由PChar创建字符串指针
      asm
        push eax     //保存环境
        mov eax,p    //将pchar的地址传递给eax
        mov q,eax    //将eax的值传递给q
        pop eax      //还原环境
      end;
      ShowMessage(PChar(q));  //q的值是等于asm前的p的
    end;
      

  2.   

    还要注意的是,使用asm的时候,如果要用到变量,例如上面的p/q,
    请务必保证如果在asm中使用,指针要指向的内存已分配/用到的指针未释放,否则会造成意想不到的错误
      

  3.   

    楼主如何出于研究的目的,放段代码给你,希望有点帮助var
      S : String;
    begin
      asm
        JMP  @@Next1;
          @LabelStr:
          DB   'Hello 1234567890' , $0;
        @@Next1:    MOV  EAX , 16;                   //新字符串的长度
        CALL System.@NewAnsiString;
        MOV  S , EAX;                    //这里给S 变量赋值    MOV  EDX , EAX;
        MOV  ECX , 16;                   //文本长度
        LEA  EAX , @LabelStr;            //文本地址
        CALL System.Move;
      end;
      ShowMessage('长度:' + IntToStr(Length(S)) + #13#10 + S);
    end;
    如果是为了实现功能,大可不必了,直接PChar即可,楼上已经有说明第二个问题,要得到Const中字符串的地址,这个我知道的暂时是这样Const
      psHello = 'Hello';
    var
      P : PChar;
    begin
      P := PChar(psHello);
    //  asm
    //    MOV  EAX , P
    //  end;
    end;P得到就是地址,直接用汇编写,还不知道,希望有人放出代码,
      

  4.   

    以上是D7测试通过,其他版本没测试,2010等那几个版本需要把S : String 改成 AnsiString
      

  5.   


    const
      ws: WideString = '宽String';
    var
      p,q:Pointer;
    begin
      p := PWideChar(ws);
      asm
        push eax     //保存环境
        mov eax,p    //将pchar的地址传递给eax
        mov q,eax    //将eax的值传递给q
        pop eax      //还原环境
      end;
      ShowMessage(PWideChar(q));
    end;
    宽的……Delphi处理宽字符时会遇到很多问题,比较恶心,应该是类型检查的问题吧
    WideString强制转换会调用StrToPWChar,取出宽字符的buffer指针