比如:
var
Str:string; asm
begin
mov eax,[$12345678]//这个地址存放的内容是字符串‘hello’,应该怎么样从eax提取出来放到Str里
//这里的汇编代码应该怎么写?
end
showmessage(Str);再来:
const str = ‘hello’;
ams
begin
mov eax,? //怎么样把str的内容传递到eax呢?
end;
var
Str:string; asm
begin
mov eax,[$12345678]//这个地址存放的内容是字符串‘hello’,应该怎么样从eax提取出来放到Str里
//这里的汇编代码应该怎么写?
end
showmessage(Str);再来:
const str = ‘hello’;
ams
begin
mov eax,? //怎么样把str的内容传递到eax呢?
end;
解决方案 »
- 请问个字符串 控制方面的问题
- 为何delphi编译后只生成一个可执行文件 ,而常见软件都并不是只有一个exe文件?
- 如何用热键/快捷键,控件程序啊
- 如何实现在Dbgrid中显示备注型字段内容?困惑我好多时了谢谢!!
- DBGridEh报错?
- 请问~如何做类似于XP的窗体
- 请教,以下sql语句如何优化:select * from black where black.bno not in (select wno from white)
- 请问各位大侠,在我Import Active Media Player后,在使用时,如果我把DisplaySize设置成为mpFullScreen,怎样才能在全屏状态下响应鼠标
- 大家都说说自己公司春节的放假时间吧
- 如何操作EXCEL文件
- 宇宙最强的delphi资料 都是极品中的极品 350+M 解压缩后400+M
- 大虾们进来帮指点一下关于Tchart的
换用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;
请务必保证如果在asm中使用,指针要指向的内存已分配/用到的指针未释放,否则会造成意想不到的错误
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得到就是地址,直接用汇编写,还不知道,希望有人放出代码,
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指针