想要使用两个函数又不想用SysUtils单元(因为这个单元占用空间,提取这函数时涉及到汇编,看的一头雾水),麻烦达人帮忙写两个函数,不胜感激,谢谢 ( 积分:

  • 主题发起人 主题发起人 m911
  • 开始时间 开始时间
M

m911

Unregistered / Unconfirmed
GUEST, unregistred user!
想要使用两个函数又不想用SysUtils单元(因为这个单元占用空间,提取这函数时涉及到汇编,看的一头雾水),麻烦达人帮忙写两个函数,不胜感激,谢谢 ( 积分: 100 )<br />想要使用两个函数又不想用SysUtils单元(因为这个单元占用空间,提取这函数时涉及到汇编,看的一头雾水),麻烦达人帮忙写两个函数,不胜感激,谢谢
function StrToInt(const S: string): Integer;
function IntToStr(Value: Integer): string;
 
把这两个函数copy过来不就行了。
 
hwh6666, 谢谢你帮顶,我在发问的时候已经说的很清楚了哦
 
给分吧!快
//字符转整型
function MyStrToInt(Value:String):integer;
function GetNumber(FChar:Char):integer;
begin
case FChar of
'0':Result:=0;
'1':Result:=1;
'2':Result:=2;
'3':Result:=3;
'4':Result:=4;
'5':Result:=5;
'6':Result:=6;
'7':Result:=7;
'8':Result:=8;
'9':Result:=9;
end;
end;
function Getbs(Len:Integer):integer;
var
i,Resultint:integer;
begin
ResultInt:=1;
for i:=1 to Len do
ResultInt:=ResultInt*10;
Result:= ResultInt;
end;
var
Flen,ResultInt,Fbs:integer;
begin
ResultInt:=0;
for Flen:=1 to length(Value) do
begin
Fbs:=Getbs(length(Value)-FLen);
ResultInt:=ResultInt+GetNumber(Value[Flen])*Fbs;
end;
Result:=ResultInt;
end;
//整型转字符
procedure CvtInt;
asm
OR CL,CL
JNZ @CvtLoop
@C1: OR EAX,EAX
JNS @C2
NEG EAX
CALL @C2
MOV AL,'-'
INC ECX
DEC ESI
MOV [ESI],AL
RET
@C2: MOV ECX,10

@CvtLoop:
PUSH EDX
PUSH ESI
@D1: XOR EDX,EDX
DIV ECX
DEC ESI
ADD DL,'0'
CMP DL,'0'+10
JB @D2
ADD DL,('A'-'0')-10
@D2: MOV [ESI],DL
OR EAX,EAX
JNE @D1
POP ECX
POP EDX
SUB ECX,ESI
SUB EDX,ECX
JBE @D5
ADD ECX,EDX
MOV AL,'0'
SUB ESI,EDX
JMP @z
@zloop: MOV [ESI+EDX],AL
@z: DEC EDX
JNZ @zloop
MOV [ESI],AL
@D5:
end;

function MyIntToStr(Value: Integer): string;
asm
PUSH ESI
MOV ESI, ESP
SUB ESP, 16
XOR ECX, ECX // base: 0 for signed decimal
PUSH EDX // result ptr
XOR EDX, EDX // zero filled field width: 0 for no leading zeros
CALL CvtInt
MOV EDX, ESI
POP EAX // result ptr
CALL System.@LStrFromPCharLen
ADD ESP, 16
POP ESI
end;
 
这个问题难了,帮你做了一下,汇编里居然有很多的引用参数,看来你只能找anders帮忙了.
 
清新空气居然搞出来了,佩服,能不能注释一下汇编呀。
 
谢谢侠客~!

但是好像MyStrToInt有问题啊! 我试了 编译不了
 
要不要我用非汇编的delphi代码再给你一份?
 
什么提示啥?
 
代码都给你写全了,还不会用!.......
哎~~!
 
......
标题又改了....
 
你是不是不会delphi?
 
你是不是不会delphi?
你让别人看看,你这句写的对不对?
1、是函数,不是过程,有返回值的
2、是字符转整型,你传个整型进去;(我真的不想说你,太笨了.....)
var
a:string;
i : integer;
begin
a := '123';
i:=MyStrToInt(a);
end;
 
麻烦有些基础了再搞这种自己写函数之类的;现阶段,你还是用现成吧;
等你会写一些常规代码了再写这种;
务实一些....
 
{ 真的只要Copy一下就行了,这两个是相对独立的函数 }

unit Unit2;

interface

function IntToStr(I: Integer): string;
function StrToInt(S: string): Integer;

implementation

procedure CvtInt;
{ IN:
EAX: The integer value to be converted to text
ESI: Ptr to the right-hand side of the output buffer: LEA ESI, StrBuf[16]
ECX: Base for conversion: 0 for signed decimal, 10 or 16 for unsigned
EDX: Precision: zero padded minimum field width
OUT:
ESI: Ptr to start of converted text (not start of buffer)
ECX: Length of converted text
}
asm
OR CL,CL
JNZ @CvtLoop
@C1: OR EAX,EAX
JNS @C2
NEG EAX
CALL @C2
MOV AL,'-'
INC ECX
DEC ESI
MOV [ESI],AL
RET
@C2: MOV ECX,10

@CvtLoop:
PUSH EDX
PUSH ESI
@D1: XOR EDX,EDX
DIV ECX
DEC ESI
ADD DL,'0'
CMP DL,'0'+10
JB @D2
ADD DL,('A'-'0')-10
@D2: MOV [ESI],DL
OR EAX,EAX
JNE @D1
POP ECX
POP EDX
SUB ECX,ESI
SUB EDX,ECX
JBE @D5
ADD ECX,EDX
MOV AL,'0'
SUB ESI,EDX
JMP @z
@zloop: MOV [ESI+EDX],AL
@z: DEC EDX
JNZ @zloop
MOV [ESI],AL
@D5:
end;

function IntToStr(I: Integer): string;
// FmtStr(Result, '%d', [Value]);
asm
PUSH ESI
MOV ESI, ESP
SUB ESP, 16
XOR ECX, ECX // base: 0 for signed decimal
PUSH EDX // result ptr
XOR EDX, EDX // zero filled field width: 0 for no leading zeros
CALL CvtInt
MOV EDX, ESI
POP EAX // result ptr
CALL System.@LStrFromPCharLen
ADD ESP, 16
POP ESI
end;

function StrToInt(S: string): Integer;
var
E: Integer;
begin
Val(S, Result, E);
//要自己处理异常,如果E&lt;&gt;0说明 S不能转为Integer
//if E &lt;&gt; 0 then ConvertErrorFmt(@SInvalidInteger, );
end;

end.
 
侠客 是我弄错了,实在抱歉啊! 我该死! 跪求侠客原谅!
 

Similar threads

后退
顶部