🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
18 messages
18 total messages Started by johnny Fri, 29 Dec 2006 21:39
Kilka pytań
#955
Author: johnny
Date: Fri, 29 Dec 2006 21:39
14 lines
1515 bytes
1. Ściągnąłem ze strony www.masm32.com masm w wersji 6.14; tymczasem w
jednej z książek przeczytałem, że na stronach Microsoftu znajduje się
MASM w wersji (w czasie pisania książki) 6.15. Czy to jest inny MASM?

2. Przed zainstalowaniem masm 6.14 miałem masm 6.13. Aby zasemblować
prosty program wystarczyło ml jakisplik.asm. Teraz podczas asemblacji
pojawia mi się komunikat dotyczący parametrów /z2 i /t w części
linkowania. O co chodzi? Nie podaję żadnych takich parametrów...

3. Czy różnice w składni MASM i FASM są duże?

--
Pozdrawiam
Johnny
Re: Kilka pytań
#956
Author: Matuzalem
Date: Fri, 29 Dec 2006 22:18
21 lines
1964 bytes
johnny napisał(a):
> 1. Ściągnąłem ze strony www.masm32.com masm w wersji 6.14; tymczasem w
> jednej z książek przeczytałem, że na stronach Microsoftu znajduje się
> MASM w wersji (w czasie pisania książki) 6.15. Czy to jest inny MASM?

Raczej nie.

> 2. Przed zainstalowaniem masm 6.14 miałem masm 6.13. Aby zasemblować
> prosty program wystarczyło ml jakisplik.asm. Teraz podczas asemblacji
> pojawia mi się komunikat dotyczący parametrów /z2 i /t w części
> linkowania. O co chodzi? Nie podaję żadnych takich parametrów...

Ty może nie, ale jeśli korzystasz z jakiegoś IDE, możliwe, że ono
to robi. Sprawdź ustawienia dla kompilatora.

> 3. Czy różnice w składni MASM i FASM są duże?

http://rudy.mif.pg.gda.pl/~bogdro/dos/fntasm.htm

Pozdrawiam
Re: Kilka pytań
#957
Author: johnny
Date: Sat, 30 Dec 2006 09:25
14 lines
1583 bytes
>> 2. Przed zainstalowaniem masm 6.14 miałem masm 6.13. Aby zasemblować
>> prosty program wystarczyło ml jakisplik.asm. Teraz podczas asemblacji
>> pojawia mi się komunikat dotyczący parametrów /z2 i /t w części
>> linkowania. O co chodzi? Nie podaję żadnych takich parametrów...
> 
> Ty może nie, ale jeśli korzystasz z jakiegoś IDE, możliwe, że ono
> to robi. Sprawdź ustawienia dla kompilatora.
> 
Wywołanie z wiersza poleceń: ml plik.asm

Nic więcej.

-- 
Johnny
Re: Kilka pytań
#972
Author: Bogdan (bogdro)
Date: Sat, 30 Dec 2006 09:31
34 lines
2660 bytes
johnny napisał(a):
> 1. Ściągnąłem ze strony www.masm32.com masm w wersji 6.14; tymczasem w
> jednej z książek przeczytałem, że na stronach Microsoftu znajduje się
> MASM w wersji (w czasie pisania książki) 6.15. Czy to jest inny MASM?

 W sensie binarnym raczej nie, ale MASM32 to cały "pakiet", nie tylko
kompilator. Szczegółów nie pamiętam, ale raczej tylko tym MASM32 różni
się od "oryginalnego" MASMa. Na tej stronie nie było napisane?

> 2. Przed zainstalowaniem masm 6.14 miałem masm 6.13. Aby zasemblować
> prosty program wystarczyło ml jakisplik.asm. Teraz podczas asemblacji
> pojawia mi się komunikat dotyczący parametrów /z2 i /t w części
> linkowania. O co chodzi? Nie podaję żadnych takich parametrów...

 Sprawdź, co one robią (ml /? lub jakiś plik pomocy). Możliwe, że
używasz niewłaściwego linkera. Do programów 32-bitowych ma być
"Incremental Linker", do 16-bitowych - "Segmented Linker" czy jakoś
tak (chyba wersja 5.63).

> 3. Czy różnice w składni MASM i FASM są duże?

 Jeśli programujesz w sposób niemylący (tzn. zawsze używasz nawiasów
kwadratowych, by pobrać zawartość pamięci), to różnice w zasadzie
sprowadzają się do dyrektyw startowych i segmentów
(.model/.code/.data/... vs. format/section/...) Słowo "offset" możesz
zostawić, przy przesiadce na FASMa dodajesz tylko
	offset	equ
gdzieś u góry kodu i problem z głowy.

-- 
Pozdrawiam, Bogdan                                  (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: Kilka pytań
#958
Author: Matuzalem
Date: Sat, 30 Dec 2006 11:48
25 lines
1918 bytes
johnny napisał(a):
> >> 2. Przed zainstalowaniem masm 6.14 miałem masm 6.13. Aby zasemblować
> >> prosty program wystarczyło ml jakisplik.asm. Teraz podczas asemblacji
> >> pojawia mi się komunikat dotyczący parametrów /z2 i /t w części
> >> linkowania. O co chodzi? Nie podaję żadnych takich parametrów...
> >
> > Ty może nie, ale jeśli korzystasz z jakiegoś IDE, możliwe, że ono
> > to robi. Sprawdź ustawienia dla kompilatora.
> >
> Wywołanie z wiersza poleceń: ml plik.asm
>
> Nic więcej.

Czyli piszesz tak:

ml plik.asm
link /subsystem:console/windows plik.obj

?

Spróbuj napisać:
ml /Zm plik.asm

Pozdrawiam
Re: Kilka pytań
#959
Author: johnny
Date: Sat, 30 Dec 2006 14:26
13 lines
1526 bytes
> Spróbuj napisać:
> ml /Zm plik.asm
> 
> Pozdrawiam
> 

Bogdan ma rację z tym linkerem (tutaj automatycznie
wywoływany jest Incremental). Zainstalowałem Segmented Linker no i
działa. Mam jednak lamerskie pytanie. Kiedy kod jest 16 a kiedy
32-bitowy. Czy nie wystarczy dyrektywa .386?

-- 
Johnny
Re: Kilka pytań
#960
Author: Matuzalem
Date: Sat, 30 Dec 2006 14:44
8 lines
1519 bytes
johnny napisał(a):
> Kiedy kod jest 16 a kiedy 32-bitowy.

Jeśli możesz używać rejestrów 32-bitowych (np. eax, ebx, e..) to
kod jest 32-bitowy.

Pozdrawiam
Re: Kilka pytań
#961
Author: Michal Schulz
Date: Sat, 30 Dec 2006 14:56
12 lines
1375 bytes
Matuzalem wrote:

>> Kiedy kod jest 16 a kiedy 32-bitowy.
> 
> Jeśli możesz używać rejestrów 32-bitowych (np. eax, ebx, e..) to
> kod jest 32-bitowy.

Nie. 32-bitowy kod to taki, w ktorym przestrzen adresowa jest 32-bitowa.
Dzieki prefiksom mozna w 16-bitowym kodzie uzywac 32-bitowych rejestrow.

-- 
Michal Schulz
Re: Kilka pytań
#963
Author: johnny
Date: Sat, 30 Dec 2006 15:44
9 lines
1552 bytes
> Nie. 32-bitowy kod to taki, w ktorym przestrzen adresowa jest 32-bitowa.
> Dzieki prefiksom mozna w 16-bitowym kodzie uzywac 32-bitowych rejestrow.
> 

OK. Co trzeba zrobić by kod był 32-bitowy? Jakaś dyrektywa, polecenie,
opcja?

-- 
Johnny
Re: Kilka pytań
#962
Author: Matuzalem
Date: Sat, 30 Dec 2006 15:57
18 lines
1878 bytes
Michal Schulz napisał(a):
> Matuzalem wrote:
>
> >> Kiedy kod jest 16 a kiedy 32-bitowy.
> >
> > Jeśli możesz używać rejestrów 32-bitowych (np. eax, ebx, e..) to
> > kod jest 32-bitowy.
>
> Nie. 32-bitowy kod to taki, w ktorym przestrzen adresowa jest 32-bitowa.
> Dzieki prefiksom mozna w 16-bitowym kodzie uzywac 32-bitowych rejestrow.
>
> --
> Michal Schulz

Racja trochę się pośpieszyłem ze stwierdzeniem.

Pozdrawiam
Re: Kilka pytań
#965
Author: johnny
Date: Sat, 30 Dec 2006 16:56
14 lines
1658 bytes
Matuzalem napisał(a):
> johnny napisał(a):
>> Kiedy kod jest 16 a kiedy 32-bitowy.
> 
> Jeśli możesz używać rejestrów 32-bitowych (np. eax, ebx, e..) to
> kod jest 32-bitowy.
> 
> Pozdrawiam
> 
No więc mogę używać eax a to dzięki dyrektywie .386. Niestety nadal nie
mogę programu zlinkować linkerem "incremental".

-- 
Johnny
Re: Kilka pytań
#966
Author: Matuzalem
Date: Sat, 30 Dec 2006 18:08
28 lines
2098 bytes
johnny napisał(a):
> Matuzalem napisał(a):
> > johnny napisał(a):
> >> Kiedy kod jest 16 a kiedy 32-bitowy.
> >
> > Jeśli możesz używać rejestrów 32-bitowych (np. eax, ebx, e..) to
> > kod jest 32-bitowy.
> >
> > Pozdrawiam
> >
> No więc mogę używać eax a to dzięki dyrektywie .386.

.186
.286 .286p
386 .386p
486 486p
itd.

Są to dyrektywy które służą do określenia zbioru instrukcji z
jakich będziesz mógł korzystać w programie.

> Niestety nadal nie mogę programu zlinkować linkerem "incremental".

Może napisz co robisz, krok po kroku, jakie błędy/ostrzeżenia się
ukazują...

Pozdrawiam
Re: Kilka pytań
#967
Author: johnny
Date: Sat, 30 Dec 2006 18:47
27 lines
2490 bytes
> Może napisz co robisz, krok po kroku, jakie błędy/ostrzeżenia się
> ukazują...
> 
> Pozdrawiam
> 

Trochę się zapętliliśmy. Krótkie streszczenie.
Po zainstalowaniu nowego masma z linkerem inkrementalnym otrzymuję
komunikaty o błędach. Korzystając z linkera "segmented" potrafię
zlinkować plik *.obj

Bogdan napisał, że linker inkrementalny powinien być stosowany w
przypadku kodu 32-bitowego a segment. w przypadku kodu 16-bitowego.

Do tej pory sądziłem, że o "type" kodu decyduje dyrektywa .386 lecz
zgodnie z tym co napisał Michal Schulz to zapewnia tylko możliwość
korzystania z rejestrów 32-bitowych. O tym zaś co decyduje, że kod jest
32-bitowy jest 32-bitowe adresowanie. Tak to rozumiem do tej pory...

W związku z tym pozostaje pytanie:
- w jaki sposób (skoro dyrektywa .386 nie wystarcza) uzyskać kod
32-bitowy tak by móc skorzystać z linkera inkrementalnego (z nowym
masmem nie jest instalowany żaden linker segm.; ten który mam pochodzi z
płyty dołączonej do książki, którą przerabiam)

-- 
Johnny
Re: Kilka pytań
#968
Author: Bogdan (bogdro)
Date: Sun, 31 Dec 2006 09:14
38 lines
2957 bytes
johnny napisał(a):
> Trochę się zapętliliśmy. Krótkie streszczenie.
> Po zainstalowaniu nowego masma z linkerem inkrementalnym otrzymuję
> komunikaty o błędach. Korzystając z linkera "segmented" potrafię
> zlinkować plik *.obj
> 
> Bogdan napisał, że linker inkrementalny powinien być stosowany w
> przypadku kodu 32-bitowego a segment. w przypadku kodu 16-bitowego.
> 
> Do tej pory sądziłem, że o "type" kodu decyduje dyrektywa .386 lecz
> zgodnie z tym co napisał Michal Schulz to zapewnia tylko możliwość
> korzystania z rejestrów 32-bitowych. O tym zaś co decyduje, że kod jest
> 32-bitowy jest 32-bitowe adresowanie. Tak to rozumiem do tej pory...
> 
> W związku z tym pozostaje pytanie:
> - w jaki sposób (skoro dyrektywa .386 nie wystarcza) uzyskać kod
> 32-bitowy tak by móc skorzystać z linkera inkrementalnego (z nowym
> masmem nie jest instalowany żaden linker segm.; ten który mam pochodzi z
> płyty dołączonej do książki, którą przerabiam)

 Aż dziw, że nikt nie podał prawidłowej odpowiedzi. Aby dostać kod
32-bitowy, stawia się dyrektywę ".386". ALE PRZED DEKLARACJĄ MODELU I
SEGMENTU KODU (tak przynajmniej to działało w TASM). A więc nie:

	.model small
	.code
	.386		; tylko rejestry 32-bitowe

a
	.386		; rejestry 32b i program 32b
	.model small	; możliwe, że "flat"
	.code

-- 
Pozdrawiam, Bogdan                                  (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: Kilka pytań
#969
Author: johnny
Date: Sun, 31 Dec 2006 09:26
33 lines
2121 bytes
Dzięki za odpowiedź. Jednak nadal coś jest nie tak.
Mam kod:

.386
.model tiny
.code
org 100h
main proc

	mov	eax,4c00h
	int	21h

main endp
end main

Wywołuję ml example.asm i otrzymuję:

(...)
 Assembling: example.asm
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/z2
"example.obj" /t
"example.com"
NUL
LINK : warning LNK4044: unrecognized option "z2"; ignored
LINK : warning LNK4044: unrecognized option "t"; ignored
example.obj : warning LNK4033: converting object format from OMF to COFF
example.com : fatal error LNK1136: invalid or corrupt file

-- 
Johnny
Re: Kilka pytań
#970
Author: Bogdan (bogdro)
Date: Sun, 31 Dec 2006 10:14
43 lines
2691 bytes
johnny napisał(a):
> Dzięki za odpowiedź. Jednak nadal coś jest nie tak.
> Mam kod:
> 
> ..386
> ..model tiny
> ..code
> org 100h
> main proc
> 
> 	mov	eax,4c00h
> 	int	21h
> 
> main endp
> end main
> 
> Wywołuję ml example.asm i otrzymuję:
> 
> (...)
>  Assembling: example.asm
> Microsoft (R) Incremental Linker Version 5.12.8078
> Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
> 
> /z2
> "example.obj" /t
> "example.com"
> NUL
> LINK : warning LNK4044: unrecognized option "z2"; ignored
> LINK : warning LNK4044: unrecognized option "t"; ignored
> example.obj : warning LNK4033: converting object format from OMF to COFF
> example.com : fatal error LNK1136: invalid or corrupt file

 Prawdopodobnie ML.EXE źle kompiluje program, może model pamieci go
myli, bo widać, że kompiluje na COM. Spróbuj ".model flat" lub pogrzeb
w opcjach (choć COFF powinien być domyślnym formatem).

 P.S. Jeśli program się wysypie, to znaczy, że działa :)

-- 
Pozdrawiam, Bogdan                                  (Linux i FreeDOS)
Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: Kilka pytań
#964
Author: Pawel Kraszewski
Date: Sun, 31 Dec 2006 11:11
45 lines
2867 bytes
johnny wrote:

>> Nie. 32-bitowy kod to taki, w ktorym przestrzen adresowa jest 32-bitowa.
>> Dzieki prefiksom mozna w 16-bitowym kodzie uzywac 32-bitowych rejestrow.
>> 
> 
> OK. Co trzeba zrobić by kod był 32-bitowy? Jakaś dyrektywa, polecenie,
> opcja?
> 

O 32-bitowości kodu decyduje typ segmentu, w którym się on znajduje. Wieki
temu robiłem mikrocudeńka ASM+C w ogóle bez runtime'a.

Zakładając dyrektywę .386 (bo tylko ona daje w ogóle dostęp do _instrukcji_
32 bitowych, natomiast nic nie mówi o "bitowości" programu jako takiego)
sprawy mają się tak:

* W 16-bitowym segmencie kodu domyślne instrukcje są 16-bitowe. Każda 
  32-bitowa jest prefiksowana.
* W 32-bitowym segmencie kodu jest dokładnie na odwrót.

Model FLAT dla cpu>=386 zakłada automatycznie segmenty 32-bitowe
(dla .code, .data, itd), pozostałe modele mają domyślne segmenty 16-bitowe.

Można oczywiście zrobić dowolny segment "na krzyż" korzystając z pełnej
instrukcji definicji segmentu:

name SEGMENT [align] [READONLY] [combine] [use] [?class?] statements

W tej definicji trik to jest parametr 'use' (oczywiście istotny dla >=386):
* use32 definiuje segment 32-bitowy niezależnie od modelu
* use16 definiuje segment 16-bitowy niezależnie od modelu

Polecam

http://webster.cs.ucr.edu/Page_TechDocs/MASMDoc/ProgrammersGuide/

Problemy Twoje z sąsiedniego "odszczepu" wątka mogą wynikać (o ile dobrze
pamiętam) z faktu, że linker 32-bitowy (znaczy Windowsowa aplikacja
32-bitowa) wymaga delikatnego "szturchnięcia" do wygenerowania aplikacji
16-bitowej. Niestety nie pamiętam jak :/

-- 
 Pawel Kraszewski
 www.kraszewscy.net
Re: Kilka pytań
#971
Author: Bernard
Date: Sun, 31 Dec 2006 22:51
33 lines
2013 bytes
Bogdan (bogdro) wrote:
> johnny napisał(a):
>> Dzięki za odpowiedź. Jednak nadal coś jest nie tak.
>> Mam kod:
>>
>> ..386
>> ..model tiny
>> ..code

I już asembler zacznie generować postać OBJ, z którą nie poradzi sonie 
żaden linker. Jeśli model ma być 16-bitowy (czyli np. tiny), to 
dyrektywa .386 MUSI być po modelu.

>> org 100h
>> main proc

A jakie to niby proc? daruj sobie. Powinno być po prostu

start:
>>
>> 	mov	eax,4c00h
>> 	int	21h
>>
>> main endp
>> end main
>>
>> Wywołuję ml example.asm i otrzymuję:
>>
>> (...)
>>  Assembling: example.asm
>> Microsoft (R) Incremental Linker Version 5.12.8078

No właśnie. Przemieść to .386.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads