首页
社区
课程
招聘
[求助]DELPHI内联汇编问题(已解决)
2006-8-25 15:49 5589

[求助]DELPHI内联汇编问题(已解决)

2006-8-25 15:49
5589
想试着用DELPHI内联汇编的方法计算一个累加和,编译始终通不过,不知道哪里问题,大家有空看看:

procedure TForm1.Button1Click(Sender: TObject);
Var
   name:string;
   a:integer;
begin
  name:=edit1.text;
  a:=0;
asm
  MOV ESI,DWORD PTR SS:[name]
  PUSH ESI
  XOR EAX,EAX
  XOR EBX,EBX
@1:
  MOV AL,BYTE PTR DS:[ESI]
  TEST AL,AL
  JE @2
  ADD EBX,EAX
  INC ESI
  JMP @1
@2:
  MOV a,EBX
  POP ESI
  end;   
  edit2.text:=inttostr(a);
end;

end.

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

收藏
点赞7
打赏
分享
最新回复 (7)
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 4 2006-8-25 17:24
2
0
Var
   name:string;
   a:integer;
begin
  name:=edit1.text;
  a:=0;
asm
  PUSH ESI
  lea ESI,name
  XOR EAX,EAX
  XOR EBX,EBX
@1:
  MOV AL,[ESI]
  TEST AL,AL
  JE @2
  ADD EBX,EAX
  INC ESI
  JMP @1
@2:
  MOV a,EBX
  POP ESI
  end;
  edit2.text:=inttostr(a);
end;

end.
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
firstrose 16 2006-8-25 17:27
3
0
可以编译的

不要用ebx:

An asm statement must preserve the EDI, ESI, ESP, EBP, and EBX registers, but can freely modify the EAX, ECX, and EDX registers.

另外,不要用string,要用pchar,除非你用shortstring
雪    币: 560
活跃值: (309)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
laomms 34 2006-8-27 07:10
4
0
最初由 firstrose 发布
不要用ebx


谢谢firstrose,正解,原来是这样.下面的编译可以通过:
Var
   name:STRING;
   a:integer;
begin
  name:=edit1.text;
  a:=0;
asm
  MOV ESI,DWORD PTR SS:[name]
  PUSH ESI
  XOR EAX,EAX
  XOR EDI,EDI
@1:
  MOV AL,BYTE PTR DS:[ESI]
  TEST AL,AL
  JE @2
  ADD EDI,EAX
  INC ESI
  JMP @1
@2:
  MOV a,EDI
  POP ESI
  end;
  edit2.text:=inttostr(a);
end;
雪    币: 1309
活跃值: (232)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
deepwater 2006-8-27 15:10
5
0
谢谢firstrose,正解,原来是这样.下面的编译可以通过:
Var
   name:STRING;
   a:integer;
begin
  name:=edit1.text;
  a:=0;
asm
  MOV ESI,DWORD PTR SS:[name]
  PUSH ESI
  XOR EAX,EAX
  XOR EDI,EDI

  我服了楼上的了, push esi 放在设置esi 之后, 你没看人家给你的回复
雪    币: 560
活跃值: (309)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
laomms 34 2006-8-28 12:47
6
0
进一步完善一下:加入对话框提示.
procedure TForm1.Button1Click(Sender: TObject);
Var
   name:string;
   a:integer;
   title:string;
   text:string;
begin
  title:='提示';
  text:='请输入用户名';
  name:=edit1.text;
asm
  PUSH ESI
  MOV ESI,DWORD PTR SS:[name]
  JE @3
  XOR EAX,EAX
  XOR EDI,EDI
@1:
  MOV AL,BYTE PTR DS:[ESI]
  TEST AL,AL
  JE @2
  ADD EDI,EAX
  INC ESI
  JMP @1
@2:
  MOV a,EDI
  POP ESI
  JMP @4

@3:
  push 0
  MOV EAX,DWORD PTR SS:[title]
  PUSH EAX
  MOV EAX,DWORD PTR SS:[text]
  PUSH EAX
  PUSH 0
  CALL MessageBox
@4:
   end;

  edit2.text:=inttostr(a);
end;

end.
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 3 2006-8-30 01:19
7
0
随便改一下看看

  MOV EDX,DWORD PTR SS:[name] ;U-P
  TEST EDX,EDX ;V-P
  JZ @3 ;U-P
  XOR EAX,EAX ;V-P
  XOR ECX,ECX ;U-SINGLE

@1:

  MOV AL,BYTE PTR DS:[EDX] ;U-P (From round 2)
  INC EDX ;V-P (Write after read without ACL)
  ADD ECX,EAX ;U-P
  TEST EAX,EAX ;V-P
  JNZ @1 ;U-NP

@2:

  MOV [a],ECX ;U-P
  JMP @4 ;V-P

@3:

  MOV EAX,DWORD PTR SS:[title] ;U-P
  MOV ECX,DWORD PTR SS:[text] ;V-P
  PUSH EDX ;S-P
  PUSH EAX ;S-P
  PUSH ECX ;S-P
  PUSH EDX ;S-P
  CALL MessageBox ;U-NP
@4:
雪    币: 560
活跃值: (309)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
laomms 34 2006-8-31 06:54
8
0
另外,想知道下面的形式能不能直接用于内联汇编:

call @1
@1:
  ...
  retn
游客
登录 | 注册 方可回帖
返回