Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Chyba assembleru v programe c

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Chyba assembleru v programe c

Autor: JiriValerian

8:56:25 20.10.2008

[color=#008000]Jefries Napsal:
-------------------------------------------------------
> mam OS robeny v C a mam s nim 1 problem s
> otvorenim exernej .exe aplikacie....[/color]

Platí co zde již zmínil [b]Luinar[/b].

Pokud onen [b]"OS robeny v C"[/b] není dokonalou napodobeninou OS,
pro který je ten EXE přeložen (pozn. EXE je formát používaný
zejména v OS DOS/Windows), a to se všemi službami a funkcemi OS,
které ta aplikace volá nebo pokud onen [b]"OS robeny v C"[/b]
neobsahuje emulátor k provozování aplikací OS, pro který je ten EXE
přeložen, pak se snažíte marně ;).

Pokud se tedy jedná o nějaký specifický OS, pak je potřeba si uvědomit,
že v takovém případě pro daný OS v podstatě neexistují žádné aplikace
tj. je potřeba je teprve napsat a přeložit, a to v takovém spustitelném
formátu, který lze na onom OS provozovat (pozn. což nemusí odpovídat
formátu EXE) a navíc s ohledem na služby a funkce, které ten specifický
OS poskytuje.

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: Luinar

23:20:29 19.10.2008

Chyba jak uz tady bylo nekolikrat zmineno neni v tom OS - ani jste nenapsal co to konkretne za OS ma byt, ale v tom ze tam spoustie EXE tj. spustitelny soubor, ktery pro tento system neni urceny (EXE soubor take nativne napriklad na Linuxu ci jinych UNIXech nepustite - pokud se bavime o EXE souborech pro DOS/Win). Tj. musite psat programy na miru tomuto operacnimu systemu.
Tento operacni system pak pristupuje k programum tak, ze je vzdy nahraje na adresu 2000H:0000H na teto adrese je take vstupni bod programu. Program musi byt napsan tak, ze mu nevadi, kdyz ma zasobnik umisten v prvnich 64kB programu (od adresy: 2000H:FFFEH dolu tj. teoreticky klidne az po 2000H:0000H) a program musi koncit vzdalenym returnem, ktery ze zasobniku vybere odkud tam skocil tj. musi zavolat RETF ve spravny cas. Pokud tomu cpete nejaky DOSovsky nebo Win program tak vam to s nejvetsi pravdepodobnosti nepojede.
Jinak sekne se to proto, ze se jedna o single taskovy OS tj. dokud neskonci program dalsi se nespousti (vzhledem ke konstrukci funkce exec by ho dalsi prepsal a delalo by to bordel). A pokud program neni napsan s ohledem na tyto veci a nastane v nem chyba pravdepodobne se to cele hryzne.
Tj. zopakuji to klicove znovu - program musi byt napsan na miru a s ohledem toho OS na kterem ho chcete spoustet.
Jak uz bylo receno vyse, vzhledem k tomu nakolik problemu rozumite resp. spise nerozumite bych byt vami zacal studovat assembler a s nim spojene techniky. Pak vam mozna dojde proc nekteri vasi otazku povazuji za spatny ftip.
Luinar

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: Jefries

20:19:55 19.10.2008

V Napsal:
-------------------------------------------------------
> 2Jefries: Kdyby bylo dnes 1. 4., považoval bych
> Váš dotaz za žert

to mi ma k niecomu pomoct?????

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: Jefries

20:18:31 19.10.2008

V Napsal:
-------------------------------------------------------
> 2Jefries: Kdyby bylo dnes 1. 4., považoval bych
> Váš dotaz za žert

to mi ma k niecomu pomoct???

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: V

19:42:32 19.10.2008

2Jefries: Kdyby bylo dnes 1. 4., považoval bych Váš dotaz za žert :-)

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: JiriValerian

14:18:48 19.10.2008

[color=#008000]Jefries Napsal:
-------------------------------------------------------
> no ved preto som sem napisal lebo v tom nerobim
> vobec a chcem pomoct a ani toto co som sem dal som
> nerobil ja....keby ze assembler viem tak sem
> nepisem a preto potrebujem pomoct s tymto...[/color]

Jenže v tom případě jste zde zapomněl podotknout jednu podstatnou věc,
a to že potřebujete, aby vše co se týká oné problematiky ve vztahu
k assembleru někdo [b]napsal za Vás[/b], protože drobnými radami,
které se na této konfeře poskytují se dle mého názoru doberete možná
tak za několik let. Soudím tak z vašich dosavadních reakcí z nichž
je patrné, že vůbec nevíte [b]"která bije"[/b]. Otázkou je zda někdo
v této konferenci na to, aby to napsal za Vás, bude mít dostatek času.

[color=#008000]> potom uz neni problem to pouzivat niekde v programe
> a pisat na to nove veci[/color]

S tímto tvrzením bych byl také dost opatrný, protože řada záležitostí psaných
v assembleru je tzv. [b]"šitá na míru"[/b] a následné použití jinde může vyžadovat
nejrůznější modifikace. Pokud nemáte znalosti assembleru je dost pravděpodobné,
že si díky neznalosti nebudete uvědomovat potřebu příslušné modifikace.

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: Jefries

12:42:36 19.10.2008

no ved preto som sem napisal lebo v tom nerobim vobec a chcem pomoct a ani toto co som sem dal som nerobil ja....keby ze assembler viem tak sem nepisem a preto potrebujem pomoct s tymto potom uz neni problem to pouzivat niekde v programe a pisat na to nove veci

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: JiriValerian

10:48:10 19.10.2008

[color=#008000]Jefries Napsal:
-------------------------------------------------------
> vies ja moc v assemblery nerobim a tuto
> assemblerovu cast som ani nerobil ja tak preto moc
> o tom neviem a neviem preco to nejde. V tom RETF
> staci napisat iba "asm retf;" alebo pred
> bodkociarku este daco pojde???cize kod by bol takyto???[/color]

Z vašich dosavadních dotazů bych spíš řekl, že
v assembleru neděláte vůbec a že o tom problému
navíc ani vůbec nic nevíte.

Řešení problému vyžaduje znalosti assembleru.
Není vhodné řešit něco o čem vůbec nic nevíte.

Pokud třeba někdo ve Vaší přítomnosti dostane žlučníkový záchvat
tak to se na něj taky vrháte "s kudlou v ruce" a pak píšete po nějakých
lékařských konferencích dotazy ve stylu jak ho "vykuchat" ???

Protože přesně v tomto stylu se o něco obdobného zcela bez znalosti
věcí snažíte i tady.

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: MazeGen

10:06:30 19.10.2008

Přečti si znovu, co jsem napsal.

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: Jefries

10:04:47 19.10.2008

vies ja moc v assemblery nerobim a tuto assemblerovu cast som ani nerobil ja tak preto moc o tom neviem a neviem preco to nejde. V tom RETF staci napisat iba "asm retf;" alebo pred bodkociarku este daco pojde???cize kod by bol takyto???

asm mov sp_zaloha, sp;
asm mov ax, seg ;
asm mov ds, ax ;
asm mov es, ax ;
asm mov ss, ax ;
asm mov sp, 0xFFFE ;

asm db 0x9a ; /* call far seg:0000 */
asm dw 0000 ;
asm dw seg ;
asm retf;
/* tu se vratime */
asm mov ax, cs ;
asm mov ds, ax ;
asm mov es, ax ;
asm mov ss, ax ;
asm mov sp, sp_zaloha;

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: MazeGen

23:17:55 18.10.2008

Oprava, má tam být 9A00002000

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: MazeGen

23:17:00 18.10.2008

Ne. Ten spustitelnej soubor, co se nahraje do pameti a spusti pomoci toho CALL FAR (to je ten operační kód 9A002000), se musi sam ukončit pomocí RETF, aby se řízení vrátilo zase zpátky sem:

/* tu se vratime :[i])[/i] */

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: Jefries

21:41:06 18.10.2008

takze to s tym retf by to vyzeralo takto???

asm mov sp_zaloha, sp;
asm mov ax, seg ;
asm mov ds, ax ;
asm mov es, ax ;
asm mov ss, ax ;
asm mov sp, 0xFFFE ;

asm db 0x9a ; /* call far seg:0000 */
asm dw 0000 ;
asm dw seg ;
/* tu se vratime smiling smiley */
asm mov ax, cs ;
asm mov ds, ax ;
asm mov es, ax ;
asm mov ss, ax ;
asm mov sp, sp_zaloha;
asm retf;

free(file);

a este potrebujem vsetky tie registre zalohovat...to urobim pomocou instrukcie PUSH???a potom POP??

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: MazeGen

19:59:43 18.10.2008

Kód voláš pomocí CALL FAR, tak se musíš vrátit pomocí RET FAR (RETF).

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: Jefries

19:57:13 18.10.2008

RETF??? kde by mala byt tato instrukcia???

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: MazeGen

15:28:54 18.10.2008

Určitě končí ten spouštěnej kód instrukcí RETF?

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: john008

14:06:41 18.10.2008

Eh, sorry, ted jsem se trosku rozepsal a zapomnel jsem, ze tam mas call. Beru nektere veci zpet. Urcite ale ta navratova adresa byla jeste pro jistotu nahrana nekde v te oblasti pred tim kodem... (?)

Citovat příspěvek

 

Re: Chyba assembleru v programe c

Autor: john008

13:54:50 18.10.2008

Reknu to jednoduse, tohle ti zkratka a jednoduse nemuze fungovat. Uz jenom proto, ze zavadec programu nemuze byt takhle jednoduchy.
Nevim, jaky format uvazujes u EXE, ale pokud predpokladam, ze Dosovsky, tak jaksi nemuzes premyslet nad tim, ze kod zacina na jeho prvnim bajtu, protoze EXE ma hlavicku.
Jinak Dosovsky format spustitelneho souboru, ktery nemel hlavicku, byl COM. Take nemuses nahrat program jen tak na offset 0x0000, protoze nekde musis mit ulozeno, kam se ma program vratit, kdyz skonci beh. Na tyto informace bylo typicky vyhrazeno prvnich 256(?) bytu prislusneho segmentu, kam byl program nahran. Nelze jen tak skocit na nejakou adresu pomoci instrukce JMP, protoze ta si nikam neuklada informace, kam se ma vratit, tudiz se uz nedostanes do sveho predpokladaneho bodu navratu. Nemuzes take podle mne takhle drsne zachazet se segmentovymi registry po vzoru, jak to mas udelano, atd. atd. Kdysi jsem se o tohle trosku zajimal, ale vic uz ti rict nedovedu. A ber me s rezervou. :-)

Citovat příspěvek

 

Chyba assembleru v programe c

Autor: Jefries

11:38:43 18.10.2008

mam OS robeny v C a mam s nim 1 problem s otvorenim exernej .exe aplikacie....ked ju spustim tak mi zamrzne cely OS...toto je funkcia na otvorenie tej aplikacie a predpokladam ze chyba je v tej assemblerovej casti ale kde???kedze v asm robim len velmi malo moc sa v tom nevyznam

#ifndef _EXEC_INCLUDED_
#define _EXEC_INCLUDED_

#include
#include
#include
#include

#define seg 0x2000 /* segment, kam se program nahraje :) */
#define far_seg 0x20000000 /* far segment, (seg << 16) */

/*
* exec()
* najde na disku soubor , pokud ho najde
* zjisti, jestli to je soubor a ne treba slozka,
* pokud to je soubor, nahreje ho do pameti na adresu
* seg:0000 a provede call na toto misto
*
* navratove hodnoty:
* 0 - program spusten
* 1 - program nenalezen
*/
int exec(char *filename) {
unsigned int t;
unsigned int cluster;
unsigned int sp_zaloha;
unsigned int ds_zaloha;
char *dummy = (char*)0x0000;
int i=0;
DirectoryEntry *file = malloc(sizeof(DirectoryEntry));

while((i = findfile(file, i)) != -1) {
if(!strcmp(file->realname, filename)) { /* soubor nalezen */
if(file->attr == 0x20) { /* soubor je soubor (neni treba slozka..) */
cluster = file->ClstrNo;
t = cluster;
goto vypis;
}
}
}
free(file);
return 1;

vypis:
i=0;
while(1) { /* rutina pro nahrani souboru do pameti :)) */
ds_zaloha = _DS;
_DS = seg;
readdisk((StartSector + (cluster - 2)), 1, dummy);
dummy += 0x200;
_DS = ds_zaloha;
cluster = *((unsigned int*)(fat+((cluster * 3) / 2)));
if (t & 1) cluster >>= 4;
else cluster &= 0x0fff;
if (fat_end(cluster)) break;
t = cluster;
i++;
}
dummy -= (0x200*(i+1));

asm mov sp_zaloha, sp;
asm mov ax, seg ;
asm mov ds, ax ;
asm mov es, ax ;
asm mov ss, ax ;
asm mov sp, 0xFFFE ;

asm db 0x9a ; /* call far seg:0000 */
asm dw 0000 ;
asm dw seg ;
/* tu se vratime :) */
asm mov ax, cs ;
asm mov ds, ax ;
asm mov es, ax ;
asm mov ss, ax ;
asm mov sp, sp_zaloha;

free(file);
return 0;
}

#endif

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: