Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly: Muistinvarausta

Sivun loppuun

KemXy [27.06.2003 11:18:15]

#

Miten noilla Int 21h:n muistinvarausfunktioilla saa varattua paljon (64000 tavua ja enemmänkin) muistia COM-tyyppisissä ohjelmissa? Ilmeisesti jotain pitäisi muuttaa 4Ah funktiolla.

KemXy [28.06.2003 10:37:46]

#

Ai niin.. Kieli on Assembly ja DOS:lle ollaan ohjelmoimassa.
Ja Ongelma on se, että sotkeeko varaukset pinoa tms? Käsitykseni mukaan COM ohjelmissa segmenttiosoitteet ovat samat ja kaikki ohjelman koodi, data, pino yms. täytyy mahtua samaan muistisegmenttiin.

Kirjoitin tuossa yhden pätkän, mutta sotkeeko tuo sitten jotain?
Ohjelma piirtää puskuriin viivoja ja kopioi puskurin näytölle. Anteeksi vähäinen kommentointi.

.model tiny, stdcall
.386
.code
option casemap:none
org 100h

alku:	mov	ah, 4Ah        ;muutetaan lohkon kokoa
	mov	bx, 1000h
	int	21h
	jc	bbbb

	mov	ah, 48h        ;varataan muisti
	mov	bx, 0FA0h
	int	21h
	jc	aaaa
	push	ax
	push	ds

	mov	ds, ax
	mov	es, ax
	mov	ax, 0013h
	int	10h

	mov	ax, 000Fh        ;piirretään
	xor	di, di
	mov	cx, 7D00h
	cld
	rep stosw

	mov	ax, 0A000h       ;kopioidaan näytölle
	mov	es, ax
	xor 	di, di
	mov	si, di
	mov	cx, 7D00h
	cld
	rep movsw

	pop	ds
	mov	ah, 49h          ;vapautetaan muisti
	pop	es
	int	21h

	mov	ah, 08h
	int	21h

	mov	ah, 09h
	mov	dx, offset str3
	int	21h
	mov	ah, 4Ch
	int	21h

aaaa:	mov	ah, 09h
	mov	dx, offset str1
	int	21h
	mov	ah, 4Ch
	int	21h

bbbb:	mov	ah, 09h
	mov	dx, offset str2
	int	21h
	mov	ah, 4Ch
	int	21h

str1	db "MUITIN VARAUS EPÄONNISTUI.","$"
str2	db "MUISTILOHKON MUUTOS EPÄONNISTUI.","$"
str3	db "ONNISTUI.","$"

end alku

thefox [29.06.2003 19:05:16]

#

Siis toimiiko tuo / jättääkö toimimatta? Ei muistinvaraus mitenkään "pinoa sotke", voit ihan hyvillä mielin varailla muistia niin paljon kuin tarvitset (ja perusmuisti antaa myöten).

KemXy [30.06.2003 08:54:57]

#

Kyllä tuo toimii, mutta mistä kohti muistia funktio varaa tuon 64000 tavua? Kun ohjelman 64 kt pitäisi sopia koodi, grafiikat sekä muu data ja tuon puskurin pitäisi tulla vasta niiden jälkeen. Eli:

Koodi + Data n. 64 kt.
Puskurimuisti n. 64 kt.

KemXy [30.06.2003 11:00:37]

#

Niin ja tulikin vielä mieleeni toinenkin muistinvaraukseen liittyvä kysysmys: Miten assemblyssä varataan taulukolle tilaa?
Seuraavassahan on muuttuja "palikka", jolle annetaan arvoksi 128, mutta olen nähnyt että tuommoista käytetään taulukkona.

palikka db 128

thefox [30.06.2003 22:40:28]

#

Se 64000 tavua varataan ihan perusmuistista, siihen ei COM-tiedostojen yhden segmentin rajoitus mitään vaikuta.

Mitähän tarkoitat tuolla, että yhtä tavua käytetään taulukkona? :-) Olisikohan kyseessä ollut seuraavanlainen pätkä?

palikka db 128 dup(0)

KemXy [01.07.2003 09:50:47]

#

Muisitn väärin..
Juuri noin. Eli miten tuo nyt sitten eroaa tuosta edellisestä?

thefox [02.07.2003 18:39:52]

#

palikka db 128

Määrittelee yhden tavun, ja sille arvon 128.

palikka db 128 dup(0)

Määrittelee 128 peräkkäistä 0-tavua.

Täytyy myöntää, että tuo nimeämistapa on ehkä hieman vaikeaselkoinen ja epälooginen.

KemXy [02.07.2003 19:10:26]

#

Kiitos. Kyllä nyt asiat alkaa taas luistaa eteenpäin. :-)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta