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

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

2006-8-25 15:49
6075

想试着用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)
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
2
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.
2006-8-25 17:24
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
3
可以编译的

不要用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
2006-8-25 17:27
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
4
最初由 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;
2006-8-27 07:10
0
雪    币: 1309
活跃值: (232)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢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 之后, 你没看人家给你的回复
2006-8-27 15:10
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
6
进一步完善一下:加入对话框提示.
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.
2006-8-28 12:47
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
随便改一下看看

  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:
2006-8-30 01:19
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
8
另外,想知道下面的形式能不能直接用于内联汇编:

call @1
@1:
  ...
  retn
2006-8-31 06:54
0
游客
登录 | 注册 方可回帖
返回
//