banjalukaforum.com https://banjalukaforum.com/ |
|
Pomoć u vezi DOS .COM formata https://banjalukaforum.com/viewtopic.php?f=18&t=23279 |
Stranica 1 od 1 |
Autoru: | Dak [ 02 Okt 2006, 12:37 ] |
Tema posta: | Pomoć u vezi DOS .COM formata |
Pozdrav svima! Treba mi pomoć iskusnih .COM format programera. Napisao sam jedan compiler za Intel-procesor, 32-bit addressing mode. Instrukcije pišem u .COM file, koji standardno radi u 16-bit addressing mode. Da bih određene instrukcije koje se tiču registra i operanada izvršavao u 32-bit modu, moram svaku takvu instrukciju da prefix-ujem sa jednim byte-om - 66h. To sam uradio ali čini se da windows-ov 'debug' tool ignoriše taj prefix i dalje radi u 16-bit modusu, posto kad startujem disassemblera vidim da sve interpretira u 16-bit modusu. Ako neko zna gdje bi moglo da koči neka javi, treba mi do srijede naveče. Ako nadjem drugim putem (a naći ću) napisaću ovdje kako da se riješi (a riješit ću ![]() Veliki pozdrav! |
Autoru: | che.guevara [ 02 Okt 2006, 13:51 ] |
Tema posta: | |
Ja nisam iskusan .COM programer ![]() Medjutim, imam pitanje, nije li informacija o "bitnosti" aplikacije sadrzana u headeru .COM fajla? Znaci osim sto si dodao po dva byte-a, da li si popravio i header? (izvinite na nubizmu) |
Autoru: | Dak [ 02 Okt 2006, 14:12 ] |
Tema posta: | |
DOS-COM format nema header, zbog toga ga je jednostavno koristiti za debugging i u emulatorima. Prvi byte je pocetak prve instrukcije, svi segmenti imaju istu startnu adresu, znaci radis u real-mode-u. Sistem ucita fajl na slobodni segment, adresu 0x0100 i izvodi prvu instrukciju. Ako budes ikada pisao kompajlere za intel, testiraces vjerovatno sa COM fajlovima svoj kod posto je najjednostavnije. Ovo u vezi dodavanja dva byte-a: radi se o jednom bytu, to ti je kao neki signal za procesor da instrukcija koja slijedi radi u drugom adresnom modusu. Npr, ako je standardni modus 16-bit-a, onda salta na 32-bita i obrnuto, ako je standard 32-bita, salta na 16 bit-a. Posto je standardni modus za COM format 16-bitova, moras mu nekako reci da prebaci na 32-bit-ni modus, i zato stavljas ispred svake kriticne instrukcije taj prefix, 66h. Kod DLL i EXE imas sve informacije u HEADER-u. Pozdrav! |
Autoru: | che.guevara [ 04 Okt 2006, 09:11 ] |
Tema posta: | |
Aha, zanimljivo! Nadam se da ce biti asemblera na fakultetu ![]() Poz |
Autoru: | danielwu [ 04 Okt 2006, 10:41 ] |
Tema posta: | |
che.guevara je napisao: Aha, zanimljivo! Nadam se da ce biti asemblera na fakultetu
![]() Poz Ned'o Bog! ![]() ![]() |
Autoru: | che.guevara [ 04 Okt 2006, 11:20 ] |
Tema posta: | |
Bogme, meni je taj asembler vec podobrano poznat, i volio bih da ga "obvladam" ![]() Ili Scheme npr ... Funkcionalno programiranje je bas zanimljiva programerska paradigma, a retko ko ovdje zna ista o tome. Meni su svi jezici zanimljivi ![]() |
Autoru: | danielwu [ 04 Okt 2006, 12:52 ] |
Tema posta: | |
I meni su svi jezici zanimljivi i volio bih da ih znam ali da ih učim, ne pada mi na pamet ![]() |
Autoru: | culaja [ 04 Okt 2006, 13:44 ] |
Tema posta: | |
svaki programer bi trebao da zna parce asemblera, ako zeli da zna kako radi racunar. ja ga malo znam, ali ubrzo bi trebao poceti uciti detaljnije. izmedju ostalog, vrlo je zanimljiv ![]() |
Autoru: | Dak [ 04 Okt 2006, 16:24 ] |
Tema posta: | |
Znaci moram cekati da pozavrsavate fakultete da mi pomognete ![]() ![]() Tesko je naci ljude koji pisu kompajlere koji proizvode direktno masinski kod, zato nisam ni bio previse optimistican, ali mozda mi mozete pomoci indirektno: treba mi jedan emulator u kojem mogu da pisem instrukcije za 32-bitne registre, npr: Kod: MOV EAX, EBX.
a koji se moze kompilirati u COM format. Znaci emulator pise instrukcije za 32-bitni modus u format ciji je standard 16-bitni adresni modus. Pozdrav! |
Autoru: | danielwu [ 04 Okt 2006, 16:38 ] |
Tema posta: | |
A zašto ne pitaš na Elitesecurity forumu? Mislim da ćeš tamo naći to što tražiš. |
Autoru: | Dak [ 04 Okt 2006, 17:00 ] |
Tema posta: | |
Daniel, hvala ti mnogo za savjet, upravo sam to i uradio. Veliki pozdrav! |
Autoru: | Dak [ 10 Okt 2006, 15:48 ] |
Tema posta: | |
Uspio sam rijesiti svoj problem bez 'debug' tool-a. Izgleda da 'debug' uopste ne mijenja moduse kad naidje na prefixe vec i dalje ostaje u 16-bitnom modusu. U nedelju sam skinuo biew tool za disassembliranje COM formata i sve je uredno disassemblovao - tamo gdje je bio prefix saltao je na 32-bita, a standardno je disassemblirao COM-fajl u 16-bitnom modusu. Dok nisam disassemblirao sa njim masinski kod, mislio sam da je problem u generisanom kodu. Usput sam shvatio i vaznost jednog drugog prefixa, 0x67, koji koristite ili pojedinacno ili u kombinaciji sa 0x66. 0x66 je tzv. operand-size override attribute, kojim saopstavte procesoru da, ako je standardna velicina operanda 16 bita, da salta na 32 bita i obrnuto, kao sto sam vec spomenuo. Prefix 0x67 je tzv. effective-address override attribute, kojim saopstavate procesoru da za racunanje efektivne adrese koristi 32 bita. Citava ova frka sa prefixima je zbog toga sto 16-bitne i 32-bitne instrukcije imaju isti opcode; zamislite da imate jednu JMP instrukciju iza koje odmah slijedi tzv. displacement, tj. za koliko byte-ova EIP (instruction pointer) mora da se pomjeri gore ili dole, znaci taj displacement je kodiran u instrukciji. Problem je sto procesor ne zna sam od sebe koliko byte-ova koji slijede iza opcode-a, predstavljaju taj displacement. Posto svaki code-segment ima u svom descriptoru zapisanu tu standardnu velicinu, procesor koristi tu informaciju da odredi koliko byte-ova displacement-a slijede iza opcode-a. Ako je standardna vrijednost code-segmenta (kao npr. kod real-mode, u kojem i radi COM) 16 bitova, a ja zelim da procesor procita 4 byte-a za displacement, moram da stavim operand-size override prefix, 0x66, ispred opcode-a. Prefix 0x67 radi na slican nacin: ako npr. imam jednu instrukciju koja donese adresu iz jednog registra, a radim u standardnom 16-bitnom modusu, a hocu da procesor uzme 32 bita za adresu, onda stavim ispred opcode-a instrukcije prefix 0x67, i time kazem da procesor promijeni modus adresiranja sa standardnog na alternativni. Ovakav problem ne postoji sa 8-bitnim operandima i adresama jer takve 8-bit instrukcije imaju vlastiti opcode. Pozdrav! |
Stranica 1 od 1 | Sva vremena su u UTC [ DST ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |