Hello Boky!
> Pascalban es Assemblyben programozok, keverve. Gondjaim
> tamadtak a 32 bites regiszterek ( EAX, EBX, ECX stb. )
> valos modban valo programozasaval. Tiszta Assemblyben
> a .386 utasitas midnedt elintez, de ezt a Turbo Pascal
> forditoja nem ismeri.
Igen, igen. A Turbo Pascal internal asm-je elegge gyenge, de van megoldas:
prefixelni kell (instruction prefixes). Az Intel procik 2 prefix byte-ot
ismernek:
- 66h (operand-size prefix),
- 67h (address-size prefix).
Ha egy sor ele berakod pl. a 66h-t akkor a 16 bites operandusokbol 32 bites
lesz.
pl.: mov ax,5 ax-ba rak 5-ot.
db 66h; mov ax,5 eax-ba rak 5-ot... (tehat mov eax,5) DE! A
66h miatt
nem csak az ax-bol lesz eax, hanem a masodik operandusnak is 32 bitesnek kell
lennie. Viszont a pascal 16 bitesen forditja a mov ax,5-ot, tehat az 5 is 16
bites
lesz. Magyaran a mov eax,5 TP-ben a kovetkezo keppen nez ki:
db 66h; mov ax,5; dw 0000h
Hasonloan mukodik a 67h is, csak az a cimtartomanyt noveli 32 bitesre.
pl: db 67h; mov al,[0004h]; dw 0000h = mov al,[000000004h]
A a 2 prefixet persze egyszerre is lehet hasznalni.
pl: db 67h; db 66h; mov ax[5678h] dw 1234h = mov eax,[12345678h]
Viszont ha 32 bites regisztereket akarsz hasznalni cimezeshez, az mar igy
prefixekkel nem megy:
pl. a mov ax,[di] gepi kodja 8b05h. Ha ezt prefixelve irjuk:
db 67h; db 66h; mov ax,[di], akkor a pascal a kovetkezo kodot forditja:
67h; 66h; 8b05h. Viszont a mov eax,[edi] gepi kodja db 67h; db 66h; 8b07h...
Nem beszelve arrol, hogy ha szegmens regisztert is hasznalsz... Mert ugye
a szegmens megadasa (gepi kodban) mindig az utasitas elott all. Tehat pl.
a mov al,es:[di] gepi kodja 26h; 8b05h.
A mov eax,es:[edi] kodja pedig: 26h; 67h; 66h; 8b07h; tehat a 2 prefix ELOTT
van a 26h!
Na szoval a lenyeg az, hogy ha csak az operandusokat hasznalod 32 bitesen,
akkor nem tul maceras a dolog, de ha cimeket is... Szerintem inkabb az asm
rutinjaidat Turbo Assembler-rel forditsd le .obj-ba, es a pascalban extern-kent
definiald oket!
Minden jot!
[GrK]/BackLash
|
Tobben erdeklodtek a multkor a halozatprogramozasrol.
Irtam egy sajat egyszeru webszervert (GNU) C-ben es fetettem a
www.cab.u-szeged.hu/~h734673 oldalra (vagyis ide egy link ala).
A lenyeg a main() fg, azt kicsit atirva, szinten minden
megvalosithato (finger, SMTP, FTP, POP3, stb).
Zoli
|
Szia Unicorn !
3.: ShowWindow(Handle, SW_RESTORE);
SetForegroundWindow(Handle);
4.: En ezt ugy csinaltam, hogy lekerdeztem a kepernyo beallitasat es ahhoz kepe
st allitottam a szoftverben
mind a helyzeteket, mind a nagysagokat, mind a fontokat.
HKEY_CURRENT_CONFIG\Display\Settings\Resolution
--
Csa'
SeBy
|