Dal je radio netko, i dal ima netko primjere (ne cisti asm vec bas u pascalu), sto vise primjera, to bolje
Assembler u pascalu..
Zaključano
Zakačeno
pa valjda samo blok zapochinjes sa asm a zavrshavash sa end; ... tako je barem u delphiju
a kod je, logicno, isti kao obican asembler
a kod je, logicno, isti kao obican asembler
Potpis
neki primjer?
Code:
function IntToHex(Value: Integer; Digits: Integer): string;
// FmtStr(Result, '%.*x', [Digits, Value]);
asm
CMP EDX, 32 // Digits < buffer length?
JBE @A1
XOR EDX, EDX
@A1: PUSH ESI
MOV ESI, ESP
SUB ESP, 32
PUSH ECX // result ptr
MOV ECX, 16 // base 16 EDX = Digits = field width
CALL CvtInt
MOV EDX, ESI
POP EAX // result ptr
CALL System.@LStrFromPCharLen
ADD ESP, 32
POP ESI
end;
function IntToHex(Value: Integer; Digits: Integer): string;
// FmtStr(Result, '%.*x', [Digits, Value]);
asm
CMP EDX, 32 // Digits < buffer length?
JBE @A1
XOR EDX, EDX
@A1: PUSH ESI
MOV ESI, ESP
SUB ESP, 32
PUSH ECX // result ptr
MOV ECX, 16 // base 16 EDX = Digits = field width
CALL CvtInt
MOV EDX, ESI
POP EAX // result ptr
CALL System.@LStrFromPCharLen
ADD ESP, 32
POP ESI
end;
jos da mi radi...probao sam 100 primjera+ovaj i uvijek sve puno greskica..dal treba dodavat kakve varijable??
izmenjeno 1 put, poslednji put Strog 10.09.2005. u 20:04
Izmene poruke
- Strog10.09.2005. u 20:04zapis iz teksta poruke
Evo neceg malo jednostavnijeg ( ovaj put nije onako veliko kao sto sam ti slao pre
):
Eto, mada ne znam sta bi hteo da radis sa ovim
. Zar nije jednostavnije napisati
Code:
program zabiranje_brojeva;
uses crt;
var s1,s2,r: Integer;
begin
clrscr;
write('Unesi prvi sabirak: ');
readln( s1 );
write( 'Unesi drugi sabirak: ' );
readln( s2 );
asm
mov ax, s1
add ax, s2
mov r, ax
end;
writeln( 'Rezultat je: ',r );
readln;
end.
program zabiranje_brojeva;
uses crt;
var s1,s2,r: Integer;
begin
clrscr;
write('Unesi prvi sabirak: ');
readln( s1 );
write( 'Unesi drugi sabirak: ' );
readln( s2 );
asm
mov ax, s1
add ax, s2
mov r, ax
end;
writeln( 'Rezultat je: ',r );
readln;
end.
Eto, mada ne znam sta bi hteo da radis sa ovim
Code:
r:=s1+s2
umesto onog asm bloka?!
r:=s1+s2
Potpis
Moras dodati iznad funkcije i ovu.
Code:
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;
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;
odlicno, radi, super je, samo tako nastavite..
hvala
hvala
evo ti jedan primer koji eliminise prazan prostor u srtingu.
dobar tutorijal mozes da skines na www.about.com
Function StringBezBlanko(String1:String):string;
var
L,StavrnaDuz:Cardinal;
PUlaz,PResult:PChar;
Rez:String;//U slucaju da dodeljujemo vrednost samom sebi korisiomo ga koao result
begin
L:=Length(String1);
SetLength(Result,L);
SetLength(Rez,L);
PUlaz:=PChar(String1);
PResult:=PChar(Rez);
StavrnaDuz:=0;
asm
PUSH ESI //uzimas prostor u memoriji za ulaz (poenter na string)
PUSH EDI // za izlaz
PUSH EBX //brojac
MOV EDI,PResult //Pokazivac na izlazni string
MOV EBX,L //Brojac U For Petlju
MOV ESI,PUlaz
@@Pocetak: CMP EBX,0
JE @@Kraj //ako je L na nulu izlazimo iz petlje
MOV AL,[ESI] // citamo jedan bajt iz stringa
CMP AL,32 // ako je blanko
JE @@Nastavak //sakacemo na deo koda za obradu
INC StavrnaDuz //ako nije 32 pomeramo pokazivac u memoriju za 1
MOV [EDI],AL// upisujemo u izlaz slovo
INC EDI // pomeramo pokazivac izlaznog stringa za 1
@@Nastavak:INC ESI //ako je npr. s[2]=''
DEC EBX
JMP @@Pocetak
@@Kraj: POP EBX //oslobacamo resurse u vezi je sa PUSH
POP ESI
POP EDI
end;
Result:=Copy(Rez,1,StavrnaDuz);
end;