首页
社区
课程
招聘
操作字符串真是难搞! 大家帮看看。。。
发表于: 2004-8-16 22:35 4386

操作字符串真是难搞! 大家帮看看。。。

2004-8-16 22:35
4386
用Delphi编写取CPUID的函数,想取出来就是一个字符串,居然搞了N久。。。
Delphi中用Asm真是。。。
大学白读了, 都还给老师了。。。

function GetOemString: string;
begin
  SetLength(Result, 13);

  asm
    MOV EAX, 0
    DW  $A20F                   //CPUID

    PUSH EBX
    LEA EBX, Result        //Result为栈中的变量其实地址就是:EBP-4
    MOV EAX, [EBX]         //EBP-4中存放的还不是字串地址,而是栈中返回值的地址
    MOV EBX, [EAX]         //再取一次, 这才是分配的字串地址了
    MOV EAX, EBX           //好晕, 不过, 这样也好, Delphi就没有Buffer溢出的问题
    POP EBX

    MOV [EAX], EBX
    MOV [EAX+4], EDX
    MOV [EAX+8], ECX
    MOV BYTE PTR [EAX+12], $0
  end;
end;

大家看是不是有更好的方法?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
看一下,intel的cpuid的白皮书,里面有专门的取cpuId 的部分
2004-8-16 23:27
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
cpuid不是问题, 关键是取出来后对字符串的处理。。。
2004-8-16 23:36
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
靠! 还是全局变量好搞定。。。

program Project1;
{$APPTYPE CONSOLE}

Var
   VEN: string[12];
   x: string;

function OemString: string;
Var
  mStr: string[12];
begin
  asm
      mov eax,$0
      DW $A20F
      mov byte ptr [mStr + 0],12     //这个不行, 一定错!
      mov dword ptr [mStr + 1],ebx
      mov dword ptr [mStr + 5],edx
      mov dword ptr [mStr + 9],ecx
  end;

  Result := mStr;
end;

Begin
   {Call CPUID}
   Asm
      {EAX determines function}
      mov eax,$0
      DW $A20F
      mov byte ptr [VEN + 0],12 {String length}
      mov dword ptr [VEN + 1],ebx
      mov dword ptr [VEN + 5],edx
      mov dword ptr [VEN + 9],ecx
   {These registers are modified}
   End;
   {Display results}
   writeln('CPU Vendor: ',VEN);
  // x := OemString;
  // writeln('CPU Vendor: ',x);
   readln;
End.
2004-8-17 00:07
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
AMD的CPU居然不支持 Serial Number!!!
2004-8-17 00:42
0
游客
登录 | 注册 方可回帖
返回
//